如何将Windows组login映射到数据库中的dbo模式?

我有一个数据库,我想限制访问3名个人。 我以为我可以做到以下几点:

  1. 在数据库服务器上创build一个本地Windows组,并向其添加指定的个人。
  2. 在映射到本地Windows组的SQL Server中创buildWindowslogin。
  3. 将login映射到数据库中的“dbo”模式,以便用户可以访问所有对象,而无需使用模式名称对其进行限定。

当我尝试执行第3步时,出现以下错误:

Msg 15353, Level 16, State 1, Line 1 An entity of type database cannot be owned by a role, a group, an approle, or by principals mapped to certificates or asymmetric keys. 

我试图通过IDE, sp_changedbowner sproc和ALTER AUTHORIZATION命令来做到这一点,每次都得到相同的错误。

在searchMSDN和Google之后,我发现这个限制是devise的。 太棒了,这很有用。 谁能告诉我:

  1. 为什么这个限制存在? 这似乎很随意。
  2. 更重要的是,我能以其他方式完成我的要求吗?

其他可能相关的信息:

  • 服务器与服务包和修补程序完全保持同步。
  • 数据库中的所有对象都归“dbo”模式所有,修改它是不可行的。
  • 数据库正在运行在兼容级别80,并不可能将其更改为90。
  • 我可以自由地作出任何其他的改变(在合理的范围内,取决于它们是什么)。

为什么不允许这样做,请阅读SQL Server:Windows组,默认模式和其他属性 。 总结这篇文章,如果允许DEFAULT_SCHEMA到一个组,那么属于两个独立组的login的默认模式应该是什么? 这是主要标识和次要标识之间的区别,并且是有原因的。

如果要控制“dbo”模式的权限,则只需为本地组创build一个login名,然后为该组创build一个用户数据库,最后将schema :: dbo的CONTROL授予此用户。 这将允许3个人(以及本地组中的任何其他用户)完全控制dbo模式中的任何内容。 他们将能够改变,select和更新dbo.schema中的任何对象,但他们将无法创build新的对象(除非明确授予)。 如果您希望他们完全控制数据库中的任何内容,而不仅仅是dbo架构中的现有对象,那么只需将本地组用户添加到“db_owner”angular色即可。

如果你想使用模式作为命名空间,并保存你的开发者明确使用两个部分的名字,那么…只是不要。 使用两部分名称限定符不会造成任何伤害,只会增加好处。

  1. 不知道为什么存在。 有趣。

至于#2,我们通过为特定数据库创build自定义数据库angular色来解决这个问题。

例如,我有3个开发人员的域用户。 我希望他们有特殊的访问数据库。 我们创build一个域组,并把它们放在里面。 然后在SQL中创build关联的帐户。 对于那个数据库(安全>angular色>数据库angular色),我们创build一个新的卷,并将该login添加到卷。

该卷可以为数据库中的特定项目提供权限,可以从其他angular色(如db_owner)等添加权限。 这很灵活。

我经常听到有人抱怨这样做。 主要是因为如果他们有“数百”的数据库对象需要太多的时间,但是快速添加一切或个别对象是相当灵活的。 除此之外,这是一个糟糕的行政pipe理问题,而不是特定的授予权限。

如果它是多个组的一部分,则限制与不能为特定login定义默认模式有关。

假设他们确实允许。

如果domaingroup DOMAIN \ xx已被添加到本地组SERVER \ xx1 – >在sqlsecurity映射到serverlogin'xx1'依次映射到db-login'xx1'与默认模式'xx1'和本地组SERVER \ xx2 – > …默认架构'xx2'

假设DOMAIN \ xx的用户login并发出语句

 CREATE table yy 

该表是在模式xx1还是模式xx2中创build的? 答案=未定义

因此没有组的默认模式。 但用户仍然可以发出

 CREATE table xx1.yy 

 CREATE table xx2.yy