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

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

我有一个数据库,我想限制只有 3 个指定人员可以访问。我想我可以执行以下操作:

  1. 在数据库服务器上创建一个本地 Windows 组并将指定的个人添加到其中。
  2. 在 SQL Server 中创建一个映射到本地 Windows 组的 Windows 登录名。
  3. 将登录映射到数据库中的“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_changedbownersproc 和ALTER AUTHORIZATION命令来执行此操作,但每次都会出现相同的错误。

在搜索了 MSDN 和 Google 后,我发现这个限制是设计使然。太好了,这很有用。谁能告诉我:

  1. 为什么会有这个限制?这似乎很武断。
  2. 更重要的是,我可以通过其他方式实现我的要求吗?

其他可能相关的信息:

  • 该服务器已完全更新服务包和修补程序。
  • 数据库中的所有对象都归“dbo”模式所有,并且无法更改这一点。
  • 数据库在兼容级别 80 下运行,目前还无法将其更改为 90。
  • 我可以自由地进行任何其他更改(在合理范围内,取决于更改的内容)。

答案1

为什么不允许这样做,请继续阅读SQL Server:Windows 组、默认架构和其他属性。总结一下这篇文章,如果允许一个组使用 DEFAULT_SCHEMA,那么属于两个不同组的登录的默认架构应该是什么,每个组都有自己的默认值?这是主要身份和次要身份之间的区别,是有充分理由的。

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

如果您想使用架构作为命名空间,并避免开发人员明确使用由两部分组成的名称,那么...就不要这样做。使用由两部分组成的名称限定符不会带来任何坏处,只会带来好处。

答案2

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

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

例如,我有 3 个域用户,他们都是开发人员。我希望他们拥有数据库的特殊访问权限。我们创建一个域组并将他们放入其中。然后在 SQL 中创建关联帐户。对于该数据库(安全 > 角色 > 数据库角色),我们创建一个新角色并将该登录名添加到该角色中。

该角色可以授予数据库中特定项目的权限,可以添加其他角色(例如 db_owner)的权限等等。它非常灵活。

我经常听到人们抱怨这样做。主要是因为如果他们有“数百个”数据库对象,这会花费太多时间,但快速添加所有内容或单个对象却非常灵活。此外,如果不特别注意授予的访问权限,管理就会很差。

答案3

如果特定登录属于多个组的一部分,则该限制与无法为其定义默认模式有关。

假设他们确实允许了。

如果域组 DOMAIN\xx 已添加到本地组 SERVER\xx1 -> 在 sqlsecurity 中映射到 serverlogin 'xx1',进而映射到 db-login 'xx1',使用默认架构 'xx1' 和本地组 SERVER\xx2 -> ... 使用默认架构 'xx2'

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

CREATE table yy

表是在模式 xx1 还是模式 xx2 中创建的?答案=UNDEFINED

因此没有针对组的默认架构。但是用户仍然可以发出

CREATE table xx1.yy

CREATE table xx2.yy

相关内容