以下的脚本创建了一个过程可以插入新的TableOwnerSchema.MyTable表格,注意我在过程定义中使用了WITH EXECUTE AS "TableOwner"语句,这意味着该过程被执行的时候,它将在TableOwner的执行环境中被执行。
CREATE PROCEDURE usp_InsertMyTable
WITH EXECUTE AS "TableOwner"
AS
BEGIN
INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO |
我还可以将执行权限赋予一个用户账户,在这种情况下,我使用以前创建的名为BaseUser的用户。
GRANT EXEC ON usp_InsertMyTable TO BaseUser
GO |
接下来,我将执行环境转换为BaseUser并尝试运行存储过程:
EXECUTE AS USER = "BaseUser"
GO
EXEC usp_InsertMyTable
GO |
现在我可以向TableSchema.MyTable表格中添加记录了,因为在这个过程中 TableOwner允许我这样做,而BaseOwner并没有明确的权限可以向该表格添加记录,所以该用户的任何尝试都会导致错误的发生。为了演示这个问题,可以运行以下的脚本,该脚本改变了我们刚才的过程,改为运行在调用者的执行环境中。
REVERT
GO
ALTER PROCEDURE usp_InsertMyTable
AS
BEGIN
INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO
EXECUTE AS USER = "BaseUser"
GO
EXEC usp_InsertMyTable
GO
REVERT |
开发者和数据库管理员会发现在执行存储过程的时候转换权限非常有用,尤其是您处理TRUNCATE TABLE语句的时候,这个方法能帮上大忙,因为TRUNCATE TABLE并没有可以指定的权限。您可以将权限赋予将要进行截取表格操作的用户,然后在操作结束的时候再将原有的权限设定恢复就可以了。