我有一个存储过程:
当我(DB所有者)运行这个proc时,一切都按预期工作。当我的同事通过Active Directory中的一个角色删除/创建这个数据库的权限时,有几件事情会出错。困扰我的是:
表的创建没有在名称之前显式指定dbo架构。这导致创建了一个名为domain\cowork_id.table_name_here表的表。除了在他的个人模式中创建的表之外,他现在还在数据库中拥有该模式(在运行proc之前它并不存在)。
发生了什么?为什么Server在未指定的情况下在用户的模式中而不是在dbo中创建表?
发布于 2018-10-11 08:24:35
通常,如果要在此架构中创建对象,则应明确指定dbo架构。
由于您是db_owner,默认模式是dbo,所以在创建对象时不指定dbo没有问题。但对于其他(Windows)用户来说,情况并不相同。
您的用户是没有默认架构的Windows group的成员。在本例中,当用户创建任何对象时,将创建相应的用户和模式,如下所示:创建模式(Transact-SQL)
隐式架构和用户创建在某些情况下用户可以使用数据库而不需要数据库用户帐户(数据库中的数据库主体)。在以下情况下可以发生这种情况:登录具有控制服务器权限。Windows用户没有单独的数据库用户帐户(数据库中的数据库主体),而是作为具有数据库用户帐户( Windows组的数据库主体)的Windows组的成员访问数据库。当没有数据库用户帐户的用户在不指定现有架构的情况下创建对象时,数据库主体和默认架构将自动在数据库中为该用户创建。创建的数据库主体和架构将具有与连接到Server时使用的名称相同的名称( Server身份验证登录名或Windows用户名)。此行为对于允许基于Windows组的用户创建和拥有对象是必要的。然而,它可能会导致无意中创建模式和用户。为了避免隐式创建用户和架构,尽可能显式地创建数据库主体并分配默认架构。或者在使用两个或三个部分的对象名称在数据库中创建对象时,显式地声明现有的架构。
要解决这个问题,只需将dbo模式指定为default schema给所有的用户-Windows组,或者在创建对象时对模式进行解释。一直都是。
https://dba.stackexchange.com/questions/219828
复制相似问题