Я прикрепил базу данных и попытался изменить владельца на действительный логин.
Я использовал оператор: 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
— только для изменения владельца базы данных.
Однако поведение, которое вы указали, звучит очень странно. Можете ли вы его воспроизвести?