基于默认或显式架构处理 DDL 语句行为
使用经 AD 身份验证的会话时,当前会话的默认架构由以下条件决定:
-
如果存在单独的数据库用户,则该用户的默认架构将被视为当前会话的默认架构。
-
如果存在组数据库用户的默认架构,则该组数据库用户的默认架构将被视为当前会话的默认架构,其主体 ID 为最小。
了解 CREATE DDL 语句行为
如果未在 CREATE DDL 语句中指定显式架构,则将在当前会话的默认架构中创建对象。如果无法确定架构是默认架构还是显式架构,则 DDL 语句将引发以下错误:
"Babelfish Unsupported Command : Schema required for CREATE DDLs when connecting with Active Directory Group authentication. Assign default schema to group user or specify schema in command."
例 :Windows 组用户的默认架构不存在
Windows 组用户 [corp\accounts-group] 具有 NULL 默认架构,AD 用户 user1 正在尝试在没有显式指定架构的情况下执行 DDL。由于 user1 不存在单独的 Windows 登录名和用户,因此它将仅获得 Windows 组用户 [corp\accounts-group] 的数据库级权限。
1>
create TABLE t2(a int);2>
GOMsg 33557097, Level 16, State 1, Server db-inst, Line 1 Babelfish Unsupported Command : Schema required for CREATE DDLs when connecting with Active Directory Group authentication. Assign default schema to group user or specify schema in command.
注意
AD 用户 user1 不存在单独的 Windows 登录名和用户
例 :Windows 组用户存在默认架构
使用 sysadmin 通过默认架构为 [corp\accounts-group] 登录名创建 Windows 组用户。
1>
CREATE USER [corp\accounts-group] FOR LOGIN [corp\accounts-group] WITH DEFAULT_SCHEMA = sch_acc;2>
GO1>
CREATE SCHEMA sch_acc AUTHORIZATION [gad\accounts-group];2>
GO1>
SELECT name, principal_id, default_schema_name FROM sys.database_principals WHERE name = 'corp\accounts-group';2>
GOname principal_id default_schema_name ------------------ ------------ ------------------- corp\accounts-group 24162 sch_acc (1 rows affected)
尝试使用 AD 用户 user1 在不显式指定架构的情况下创建对象。表 t2 将在 [corp\accounts-group] Windows 组用户的默认架构中创建。此对象的所有者将与架构 sch_acc 的所有者相同。
1>
CREATE TABLE t_group(a int);2>
GO1>
SELECT name, schema_name(schema_id) FROM sys.objects WHERE name like 't_group';2>
GOname schema_name ------- ----------- t_group sch_acc (1 rows affected)
注意
AD 用户 user1 不存在单独的 Windows 登录名和用户
例 :AD 用户也存在单独的数据库用户
如果 AD 用户也存在单独的数据库用户,则将始终在与单独的数据库用户关联的架构中创建对象。如果数据库用户不存在该架构,将使用 dbo 架构。为 AD 用户 user1 创建单独的 Windows 登录名和数据库用户。使用 sysadmin 登录名通过 TDS 端点进行连接
1>
CREATE LOGIN [corp\user1] FROM WINDOWS;2>
GO1>
CREATE USER [corp\user1] FOR LOGIN [corp\user1] WITH DEFAULT_SCHEMA = sch1;2>
GO1>
CREATE SCHEMA sch1 AUTHORIZATION [corp\user1];2>
GO1>
SELECT name, default_schema_name FROM sys.database_principals WHERE name = 'corp\user1';2>
GOname default_schema_name --------- ------------------- corp\user1 sch1 (1 rows affected)
使用 AD 用户 user1 进行连接,然后尝试在不显式指定架构的情况下创建对象。将在架构 sch1 中创建表 t2。另请注意,此对象的所有者将与架构 sch1 的所有者相同。
1>
CREATE TABLE t2(a int);2>
GO1>
SELECT name, schema_name(schema_id) FROM sys.objects WHERE name like 't2';2>
GOname schema_name ---- ----------- t2 sch1 (1 rows affected)