我的同事是如何得到自己的图式的?


14

我有一个存储过程:

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

当我(数据库所有者)运行此proc时,一切都按预期工作。当我的同事这样做时,他通过Active Directory中的角色对该数据库拥有DROP / CREATE权限,那么会出错。这让我感到困惑:

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

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


Answers:


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组,或者在创建对象时明确地编写架构。总是。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.