我的同事是如何获得他自己的架构的?

ste*_*rgh 14 sql-server sql-server-2016

我有一个存储过程:

  • 检查表是否存在,如果存在,则删除它。
  • 再次创建该表
  • 然后用大约 30 个查询填充该表。

当我(数据库所有者)运行这个过程时,一切都按预期工作。当我的同事通过 Active Directory 中的角色对该数据库具有 DROP/CREATE 权限时,会出现一些问题。令我困惑的是:

表的创建没有dbo在名称前显式指定架构。这导致domain\cowork_id.table_name_here创建一个名为table 的表。除了在他的个人模式中创建的表之外,他现在还在数据库中拥有该模式(在运行 proc 之前它不存在)。

发生了什么?为什么 SQL Server 在用户架构中创建表而不是在dbo未指定时创建表?

sep*_*pic 26

通常,如果要在此架构中创建对象,则应明确指定dbo架构。

就像您一样db_owner,您的默认架构是dbo,因此当您在创建对象时不指定 dbo 架构时没有问题。但对于其他(Windows)用户来说,情况就不一样了。

您的用户是Windows group没有默认架构的成员。在这种情况下,当用户创建任何对象时,会创建相应的用户和架构,记录在此处:CREATE SCHEMA (Transact-SQL)

隐式模式和用户创建

在某些情况下,用户可以在没有数据库用户帐户(数据库中的数据库主体)的情况下使用数据库。这可能发生在以下情况:

登录具有 CONTROL SERVER 权限。

Windows 用户没有单独的数据库用户帐户(数据库中的数据库主体),但作为具有数据库用户帐户(Windows 组的数据库主体)的 Windows 组的成员访问数据库。

当没有数据库用户帐户的用户在未指定现有架构的情况下创建对象时,将在数据库中为该用户自动创建数据库主体和默认架构。创建的数据库主体和架构将与用户在连接到 SQL Server 时使用的名称(SQL Server 身份验证登录名或 Windows 用户名)同名。

此行为是允许基于 Windows 组的用户创建和拥有对象所必需的。然而,它可能导致模式和用户的无意创建。为避免隐式创建用户和架构,请尽可能显式创建数据库主体并分配默认架构。或者在数据库中创建对象时使用两部分或三部分的对象名称显式声明现有模式。

要解决此问题,只需将dbo架构分配default schema给您的所有用户 - Windows 组或在创建对象时明确写入架构。总是。