2 schema sql-server permissions
最近有一个域迁移,我们的 SQL Server 托管在其中。
我有两台服务器,每台服务器大约有 30 个数据库。每个用户都被更改为新域,但这样做时,当我们希望默认为 DBO 时,他们的默认架构更改为他们的域。
我目前正在通过单击 DB -> Security -> Users 然后在常规属性选项卡中手动更改它们,在默认模式框中手动键入 dbo。
有没有办法编写 SQL 代码来运行和调整所有数据库中所有用户的默认模式?
因此,对于任何尚未具有默认架构的数据库中的所有用户,您最终需要的是这样的dbo
:
USE db1;
ALTER USER user1 WITH DEFAULT_SCHEMA = dbo;
ALTER USER user2 WITH DEFAULT_SCHEMA = dbo;
ALTER USER user3 WITH DEFAULT_SCHEMA = dbo;
USE db2;
ALTER USER user4 WITH DEFAULT_SCHEMA = dbo;
ALTER USER user5 WITH DEFAULT_SCHEMA = dbo;
ALTER USER user6 WITH DEFAULT_SCHEMA = dbo;
Run Code Online (Sandbox Code Playgroud)
这是执行此操作的一种方法,使用聚合连接和嵌套动态 SQL,可以得到非常接近的结果(对USE
任何数据库中的每个用户重复该命令,您可能可以通过更多调整来解决此问题,但不确定是否有必要):
DECLARE @sql NVARCHAR(MAX) = N'', @innersql NVARCHAR(MAX) = N'';
SELECT @sql += N'SELECT @innersql += ''USE ' + QUOTENAME(name) + ';
ALTER USER '' + QUOTENAME(name) + '' WITH DEFAULT_SCHEMA = dbo;
'' FROM ' + QUOTENAME(name) + '.sys.database_principals
WHERE type_desc IN (N''SQL_USER'',N''WINDOWS_USER'')
AND default_schema_name <> ''dbo''
AND name NOT IN (N''dbo'',N''guest'');'
FROM sys.databases WHERE state = 0;
EXEC sp_executesql @sql, N'@innersql NVARCHAR(MAX) OUTPUT', @innersql OUTPUT;
-- you can just print the command to preview it
-- (though it may be too long to review the whole thing):
PRINT @innersql;
-- once you're happy with it, uncomment this and run it all again:
-- EXEC sp_executesql @innersql;
Run Code Online (Sandbox Code Playgroud)