我正在使用以下查询来检查默认架构是否设置为dbo
.
SELECT DB_NAME() AS [database]
,[name]
,[type_desc]
,[default_schema_name]
FROM [sys].[database_principals]
WHERE [type] IN ('U', 'G')
--AND [default_schema_name] <> 'dbo';
如果未设置为dbo
并且有人在未指定架构标识符的情况下创建了一个对象,schema
则会使用他/她的 Windows 凭据创建一个新对象。
因此,我想编写一个脚本来检查(在特定时间段内)是否一切都设置好(因为每天都会恢复/创建新机器和数据库)。
上面脚本的问题是我可以看到我的用户的默认架构不是dbo
,但是当使用其他帐户执行时,我的用户没有列出。
我想那是因为WINDOWS_GROUP
我们都是其中的一员,所以我需要检查它的设置,但总是NULL
为团体获得价值。
可以用你的脚本
default schema
检查。group
当此脚本显示
NULL
为一个组时,这意味着default schema
没有为该组明确设置。这意味着 this
account
没有显式映射到此数据库,但它是一个或多个Windows groups
映射的成员。这里的规则是:
当你看到那个
这意味着该用户是一个或多个 Windows 组的成员,并且这些组都没有默认架构。
如果你想阻止这种“模式创建”,你不应该让用户
Windows groups
没有default schema
,只需将dbo
模式分配给dbo
:要检查映射到此数据库的用户组,请执行以下代码:
您可以在此处
type = 'WINDOWS GROUP'
过滤,但在未过滤时,您会看到所有令牌,所以如果您没有看到 Windows 帐户,那是因为它没有显式映射到该数据库,而是通过 Windows 组到达数据库更新
此处调用
implicit schema creation
并记录了此行为: CREATE SCHEMA (Transact-SQL)