我有一个SQL Server 2005数据库,我尝试使用Windows身份验证作为受限用户帐户进行访问。我已经将BUILTIN \ Users添加为数据库用户(在我这样做之前,我甚至无法打开数据库)。我的工作假设是每个人都应该拥有应用于他们的“公共”角色的权限,因此我没有对角色分配做任何事情。在tblFoo下,我可以使用SSMS Properties对话框(Permissions页面)添加“public”,然后设置显式权限。其中包括SELECT的“Grant”。但是运行
SELECT * from tblFoo;
作为一个有限的(BUILTIN \ Users)帐户给我一个错误“在对象'tblFoo'上选择权限被拒绝,数据库'bar',架构'dbo'”。在属性对话框中,有一个“有效权限”按钮,但它显示为灰色。
此外,我尝试创建一个名为“UserTest”的非私有帐户,在服务器级别添加该帐户,然后将其映射到“bar”数据库。这让我将UserTest添加到“用户或角色”列表中,这样我就可以为该帐户运行“有效权限”。根本没有列出任何权限 - 这似乎不对。该帐户必须是公开的,并且公共拨款(以及其他内容)在tblFoo上选择,那么为什么UserTest帐户不显示有效权限?我觉得我在这里有点疯狂。
ASIDE:我知道许多人不喜欢使用“公共”角色来设置权限。这只是我的修补时间;在最终设计中,我确信我们将拥有几个灵活(自定义)数据库角色。我只想弄清楚我所看到的行为,所以请不要“不要那样做!”答案。
更新:显然我知道只有足够的SQL Server对我自己和他人构成危险。在设置权限(正如我所说,“除其他”之外),我有DENY CONTROL。当我设置此权限时,我想我试着查看它做了什么,有一个模糊的想法,并决定拒绝。我现在无法回想起为什么这似乎要做,但看起来这就是我获得许可失败的原因。所以我正在更新我的问题:任何人都可以解释“CONTROL”权限,因为它与表有关吗?
答案 0 :(得分:1)
您只需拥有SELECT权限。在原始SQL中(请参阅对话框中的“脚本”图标/按钮),它是GRANT SELECT ON dbo.tblFoo to public
。这是查看数据所需的唯一权限,
在这种情况下,错误消息明确提到“拒绝”。 “DENY”本身就是一种权利,所以它提到了它,
如果你没有权利,你会收到消息(非常近似)“tblFoo不存在或你没有权利”
提到“DENY CONTROL”here。在这种情况下,您拒绝对公共角色的所有权限。
受让人实际上拥有所有 对安全性
的已定义权限
答案 1 :(得分:0)
假设“UserTest”是域用户帐户,请以sysadmin角色的成员身份连接并运行
EXEC MASTER.dbo.xp_logininfo 'Domain\UserTest', 'all'
(用您的域名代替“域名”)
这将显示帐户从中继承安全权限的Windows组等,以及访问级别,例如你会期望看到类似的东西:
account name type privilege mapped login name permission path
domain\usertest user user domain\usertest BUILTIN\Users
这有助于排查帐户从哪里继承权限的问题,例如:哪些Windows组是其中一部分具有数据库权限。如果这一切看起来都不错,那么我会按照你自己的建议,而不是搞乱公共角色。