web-dev-qa-db-ja.com

データベース所有者を、既にユーザーとしてマップされているユーザーに変更できません

私はこの問題に遭遇しました。データベースの所有者をacct1に変更しようとしています。ただし、その際に次のエラーメッセージが表示されます。

提案された新しいデータベース所有者はすでにデータベースのユーザーです

acct1ユーザーを削除してからデータベース所有者を変更することが1つの解決策であることはわかっていますが、このデータベース内のすべてのテーブルはacct1スキーマによって所有されているため、これを行うことはできません。

どうすればこれを回避できますか?

4
Chinesinho

スキーマの所有権をdboに簡単に変更できます。その後、ユーザーを削除し、ALTER AUTHORIZATIONを使用してそれらを再び追加できるようにする必要があります。

ALTER AUTHORIZATION ON SCHEMA::[schema_they_own] TO dbo;
DROP USER [user_name];
ALTER AUTHORIZATION ON DATABASE::[database_name] TO login_name;

これで、これらはデータベースのdboユーザーになります(スキーマの所有権は自動的に付与されます)。

複数のスキーマを変更する必要がある場合があります。動的SQLを使用してこれを行うスクリプトを生成できます。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'ALTER AUTHORIZATION ON SCHEMA::'
  + QUOTENAME(s.name) + N' TO dbo;
'
FROM sys.schemas AS s
INNER JOIN sys.database_principals AS dp
ON s.principal_id = dp.principal_id
WHERE dp.name = N'database user name';

PRINT @sql;
-- EXEC sys.sp_executesql @sql;

生成されたコマンドに満足している場合は、出力をコピーして貼り付けて実行するか、EXECのコメントを外して再度実行できます。

3
Aaron Bertrand