Изменение владельца базы данных в SQL Server 2008; проблемы CLR в зависимости от используемого метода?

Изменение владельца базы данных в SQL Server 2008; проблемы CLR в зависимости от используемого метода?

Я прикрепил базу данных и попытался изменить владельца на действительный логин.

Я использовал оператор: ALTER AUTHORIZATION ON database::my_db_name TO "sa". Свойства базы данных показали, что новый владелец - 'sa', однако я все еще получал ошибки разрешений для неограниченных сборок CLR (0x80FC80F1, 0x8013150A), что-то о проблемах доверия сборок.

Я решил проблему, используя вместо этого оператор: EXEC sp_changedbowner 'sa'; для смены владельца базы данных.

Мой вопрос в том, в чем разница между этими двумя методами смены владельца базы данных. Они эквивалентны? Мне кажется очевидным, что sp_changedbowner делает что-то большее/исправляет то, что оператор авторизации alter не делает.


Если вам интересно... прежде чем что-то исправить с помощью sp_changedbowner, я попробовал:

  • установка свойства надежности базы данных в положение ON; на самом деле, я делал это несколько раз; я знаю, что это требование для запуска неограниченных, неподписанных пользовательских сборок CLR
  • изменение владельца каждой сборки CLR на dbo, поскольку владелец был пустым, но, по-видимому, dbo уже был владельцем, и он просто всегда пуст в SSMS.
  • изменение владельца каждой сборки CLR на что-то другое, но это не сработает, поскольку сборкам с зависимыми сборками, похоже, всегда нужен один и тот же владелец; но сменить владельца одновременно для обеих сборок с помощью предоставленного интерфейса невозможно.
  • вызов GRANT UNSAFE ASSEMBLY для [sa]; по-видимому, вы не можете предоставить разрешения этой встроенной учетной записи, а также нескольким другим; у них уже есть разрешение
  • вызов GRANT UNSAFE ASSEMBLY для [NT AUTHORITY\NETWORK SERVICE] (учетная запись, вызывающая методы в сборках); ошибок нет, но, похоже, это ничего не дало (может быть, изменился номер ошибки? сообщение так и не изменилось).
  • ...и, возможно, еще несколько вещей, которые я не могу вспомнить.

решение1

В вашем списке я не вижу настройки базы данных как заслуживающей доверия, поэтому предполагаю, что вы забыли этот шаг:

ALTER DATABASE my_db_name SET TRUSTWORTHY ON;

А может и нет...

Сверяемся с этой статьей:http://support.microsoft.com/kb/918040похоже, они действительно предлагают использовать sp_changedbowner вместо ALTER AUTHORIZATION. Но дело в том, что он делает то же самое (sp_changedbowner вызывает ALTER AUTHORIZATION под прикрытием). Разница в том, что он также удаляет "псевдонимы" для пользователя dbo (в любом случае устаревшая функциональность) и принудительно устанавливает контрольную точку базы данных. Возможно, последний фрагмент — это то, что вы ищете.

решение2

Я считаю , ALTER_AUTHORIZATIONчто и sp_changedbownerобе команды могут изменить владельца объекта базы данных. Разница между командами, конечно, в том, что ALTER_AUTHORIZATIONможет изменить другие вещи (например, владельца таблиц), тогда как sp_changedbowner— только для изменения владельца базы данных.

Однако поведение, которое вы указали, звучит очень странно. Можете ли вы его воспроизвести?

Связанный контент