将每个数据库中的每个用户更改为默认模式 = dbo 的更简单方法?

2 schema sql-server permissions

最近有一个域迁移,我们的 SQL Server 托管在其中。

我有两台服务器,每台服务器大约有 30 个数据库。每个用户都被更改为新域,但这样做时,当我们希望默认为 DBO 时,他们的默认架构更改为他们的域。

我目前正在通过单击 DB -> Security -> Users 然后在常规属性选项卡中手动更改它们,在默认模式框中手动键入 dbo。

有没有办法编写 SQL 代码来运行和调整所有数据库中所有用户的默认模式?

Aar*_*and 8

因此,对于任何尚未具有默认架构的数据库中的所有用户,您最终需要的是这样的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)

  • [你应该写一篇博文。](http://memegenerator.net/instance/42471115) (3认同)