在 Microsoft SQL Server 中,您可以在服务器和数据库级别设置权限。您还可以选择服务器登录名或数据库用户,然后设置安全对象。我想知道从安全角度来看,在这两种策略之间进行选择意味着什么。权限或安全对象是否优先于另一个?
在本文中,安全对象被定义为“主体可以访问的资源”,而权限被定义为“特定主体在安全对象上授予的访问类型”。这在纸面上听起来完全合理。但是,在 Microsoft SQL Server Management Studio 中,我看到在授予或授予时可以在“CustomDatabase -> Properties -> Permissions -> CustomUser”和“CustomDatabase -> Security -> Users -> CustomUser -> Properties -> Securables”之间进行选择拒绝用户对同一个数据库执行相同的操作。
假设我希望用户能够读取数据库中的所有表。我应该在数据库属性窗口中授予用户 SELECT 权限还是应该在用户属性窗口中授予用户 SELECT 安全权限?在这种情况下,与选择一个而不是另一个有什么区别?在选择要采用的用户授权策略时,是否还有其他情况需要考虑?
非常感谢对此事的任何见解,因为我在其他任何地方都找不到任何令人满意的解释。
对特定安全对象的许可优先于拥有该安全对象的实体。
意思是:
如果您
grant
选择数据库级别的权限 - 这意味着该数据库中的所有表/视图。即使表现在不存在 - 用户也将拥有选择权限。如果您deny
选择对特定表的权限 - 用户将无法读取该表,但仍可以访问其他表。如果您
grant
选择数据库中的所有对象 - 用户将拥有它。revoke
在您从表中获得许可之前,更改数据库或模式级别的权限不会影响实际访问- 在这种情况下,将从模式读取权限,然后从数据库级别读取权限。新创建的表将通过模式数据库权限访问(直到您对表本身设置权限)。在这里阅读官方解释,它有时确实读作法律术语,但它是对该过程最正确和最完整的解释: https ://learn.microsoft.com/en-us/sql/relational-databases/security/permissions-数据库引擎?view=sql-server-ver16
回到问题的标题: