T-SQL для смены владельца на текущего пользователя, если у базы данных нет владельца

#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 -> Файлы владелец по-прежнему пуст