截断表对对象(如存储过程)的设置权限可以通过以下方法完成:
GRANT EXECUTE ON <schema>.<object> to <user>;
但是,您可能还想在登录和用户级别上授予安全权限。您将只需要确定和授予需要访问(例如执行)对象的必要权限。考虑使用该EXECUTE AS
功能,该功能使模拟其他用户可以验证执行代码所需的权限,而不必向所有基础对象(例如表)授予所有必要的权限。EXECUTE AS
可以添加到存储过程,函数,触发器等中
在存储过程中,将如下代码添加到代码中:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
在这种情况下,您要冒充被调用模块的所有者。您也可以模拟SELF,或者用户创建或更改模块OR ... imperonate CALLER,这将使模块能够获得当前用户的权限,或者OR ...模拟OWNER,它将获得当前用户的许可。过程的所有者被称为OR ...冒充'user_name',将模拟特定的用户OR ...冒充'login_name'与将模拟特定的登录名。
在大多数情况下,您只需要授予EXECUTE
存储过程的权限,然后将权限授予存储过程中引用的所有对象。
这样,您无需授予隐式权限(例如:更新数据或调用其他proc)。所有权链接可以为您解决这个问题。这对于动态sql或需要创建增强的安全性任务(例如)特别有用CREATE TABLE
。EXECUTE AS
是考虑这些的便捷工具。
这个例子可以帮助澄清所有这些:
创建一个名为NoPrivUser的用户,该用户具有对数据库的公共访问权(例如dbadb):
USE [master];
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb],
CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO
USE [DBAdb];
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO
注意:此过程的创建者或所有者将需要在目标数据库中创建表权限。
use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
truncate table MyTable
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO
-- Now log into your database server as NoPrivUser and run the following.
使用该EXECUTE AS
子句,存储过程在对象所有者的上下文中运行。此代码成功创建,dbo.MyTable
并且行已成功插入。在此示例中,用户NoPrivUser
绝对没有授予修改表,读取或修改此表中任何数据的权限。
它仅具有完成此过程中编码的此特定任务所需的权限。
这种创建存储过程的方法非常有用,该方法可以执行需要提高安全性权限的任务而无需永久分配这些权限的方法。