<div id="module-unit-notification-container" hidden=""></div> <p>所有关系数据库管理平台都具有 4 种基本权限,用于控制数据操作语言 (DML) 操作。 这些权限是 、、 和 ,它们适用于所有 SQL Server 平台。 可针对表和视图授予、撤销或拒绝所有这些权限。 如果使用 语句授予权限,则会向 语句中引用的用户或角色授予该权限。 还可以使用 命令拒绝用户的权限。 如果向用户授予了某权限的同时又拒绝了该权限,则 将始终取代 GRANT,并且将拒绝用户访问特定的对象。</p>
讯享网
在上面的示例中,向用户 Demo 授予了 权限,随后拒绝了用户对“dbo.Company”表的 权限。 用户尝试执行从“dbo.Company”表中选择的查询时,将收到一条错误,指出已拒绝 权限。
表和视图表示数据库中可针对其授予权限的对象。 在这些表和视图中,你还可以限制给定安全主体(用户或登录)可以访问的列。 SQL Server 和 Azure SQL 数据库还包括行级安全性,可用于进一步限制访问。
Azure SQL 数据库和 Microsoft SQL Server 具有其他权限,可以根据需要授予、撤消或拒绝这些权限。
像表和视图一样,函数和存储过程具有多种权限,可以授予或拒绝这些权限。
或 (仅在 SQL Server 和 Azure SQL 托管实例中可用)命令允许更改用户上下文。 随后,将使用新的上下文(具有授予给该上下文的权限)来执行命令和语句。
如果用户具有某个权限,而用户不再需要该权限,则可以使用 REVOKE 命令删除权限(授予或拒绝)。 revoke 命令将删除任何针对指定用户授予的 或 权限。
称为链接的概念适用于权限,它允许用户从其他对象继承权限。 链接最常见的示例是在执行期间访问表的函数或存储过程。 如果该过程与表具有相同的所有者,则即使用户没有直接访问该表的权限,也可以执行存储过程并访问该表。 该访问是可用的,因为用户继承了从存储过程访问表的权限,但仅限于存储过程执行期间,且仅在存储过程执行的上下文中。
在下面的示例中,以数据库所有者或服务器管理员的身份运行,创建一个新用户,并将其添加为新的 SalesReader 角色的成员,然后授予该用户从任何对象中进行选择并执行 Sales 架构中的任何过程的权限。 然后,在 Sales 架构中创建一个存储过程,该存储过程访问 Production 架构中的表。
然后,该示例将内容更改为新用户,并尝试直接从 Production 架构的表中进行选择。
讯享网
上面的查询会导致一个错误,即用户“DP300User1”没有 权限,因为该用户所属的角色在 Production 架构中没有任何权限。 现在,我们可以尝试执行存储过程:
“DP300User1”用户对 Sales 架构中的存储过程具有 权限,因为用户的角色对 Sales 架构具有 权限。 因为表与过程具有相同的所有者,所以我们有一条连续所有权链,执行将会成功,并且将返回结果。
在存储过程中使用动态 SQL 时,不适用权限更改。 动态 SQL 中断权限链的原因在于,动态 SQL 在调用存储过程的上下文之外执行。 你可以通过将上面的存储过程更改为使用动态 SQL 执行来查看此行为,如下所示。
讯享网
“DP300User1”将收到一条错误消息,表明用户对 Production.Product 表没有 权限,就像用户尝试直接执行查询一样。 权限链不适用,执行动态 SQL 的用户帐户必须具有对动态 SQL 中代码正在使用的表和视图的访问权限。
最低权限的原则非常简单。 此概念背后的基本思想是,仅应向用户和应用程序授予其完成任务所需的权限。 应用程序应仅具有完成手头任务所需的权限。
例如,如果应用程序通过存储过程访问所有数据,则该应用程序应仅具有执行存储过程的权限,而不能访问表。
动态 SQL 是一种以编程方式生成查询的概念。 动态 SQL 允许在存储过程或查询本身中生成 T-SQL 语句。 下面是一个简单示例。
上面的语句将生成 T-SQL 语句的列表,以备份服务器上的所有数据库。 通常,此生成的 T-SQL 将使用 执行或传递给另一个程序执行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/151892.html