#sql-server #permissions #dbo
Вопрос:
Просто интересно, есть ли какой-нибудь T-SQL, который позволит мне назначить пользователя владельцем базы данных SQL Server, если у нее еще нет владельца?
Мы получаем следующую ошибку в настройках клиентов:
Не удается выполнить как принципал базы данных, поскольку принципал «dbo» не существует, этот тип принципала не может быть олицетворен, или у вас нет разрешения
Это связано с тем, что у базы данных нет назначенного владельца. Поэтому мы хотим получить скрипт для интеграции в продукт, который будет проверять, есть ли назначенный владелец, и если нет, запускать что-то вроде:
EXEC sp_changedbowner [current]
Комментарии:
1. Здесь будет указано имя базы данных и ее владелец — в качестве отправной точки:
SELECT name AS 'Database', suser_sname(owner_sid) AS 'Owner' FROM sys.databases;
2. @matt: мой ответ решил вашу проблему?
Ответ №1:
Вы должны сменить владельца на 'sa'
, а не на текущего пользователя .
Это приведет к изменению TSQL, чтобы делать то, что вы хотите:
SELECT
sqltorun = 'ALTER AUTHORIZATION ON DATABASE::' name ' TO [sa];'
FROM
sys.databases d
WHERE
(
owner_sid IS NULL
OR SUSER_SNAME(owner_sid) != N'sa'
OR owner_sid IN
(
select sid
from sys.database_principals
where type in ('G','S','U')
and sid not in (select sid from sys.server_principals)
and name not in ('guest')
)
)
AND name IN ('Mydbname1', 'mydbname2');
Вам нужно будет выполнить вывод этого в виде динамического SQL.
Примечание: возможно, потребуется использовать QUOTE_NAME()
имя базы данных.
Вот как форма свойств базы данных SSMS извлекает владельца базы данных:
SELECT ISNULL(suser_sname(dtb.owner_sid),'''') AS [Owner],
Комментарии:
1. Это работает при изменении авторизации, но (owner_sid РАВЕН НУЛЮ ИЛИ SUSER_SNAME(owner_sid) != N’sa’) оператора Where не выполняется. У рассматриваемых баз данных, похоже, есть предыдущий владелец, так как они восстановлены с другого сервера, поэтому идентификатор владельца не равен нулю, а имя пользователя = sa, но если вы перейдете к свойствам базы данных в SQL server и перейдете на вкладку файлы, поле владелец будет пустым (я обновил вопрос, чтобы показать, что я имею в виду). Есть какие-нибудь идеи?
2. Запустите этот запрос, и он вернет «0x01», но если я щелкну правой кнопкой мыши по этой базе данных и перейду в свойства -> файлы ->> поле владелец будет пустым
3. Это все еще не работает. Идентификатор владельца для этой базы данных по-прежнему «0x01», поэтому он не соответствует вашему запросу. Я не уверен, связано ли это с тем, что он был скопирован на одном сервере и восстановлен на другом сервере, и он удаляет ссылку в SQL, поскольку идентификатор владельца равен «0x01», но в свойствах вкладки DB -> Файлы владелец по-прежнему пуст