...之间的区别是什么
execute as user = 'testuser'
AND
execute as login = 'testuser'
我正在这些登录名下执行跨数据库过程,它与exececute作为登录名一起工作,而不与以用户身份执行时一起工作。就是说服务器主体“ testuser”在安全性上下文下不能访问数据库“ xxx”。
[当我在两个命令后都输入SELECT SYSTEM_USER
时,我看到它都设置为'testuser'
execute as login
为整个服务器提供模拟,因为登录名是在服务器级别上。由于用户是按数据库定义的,因此execute as user
模拟仅适用于特定数据库,这就是为什么您在跨数据库时看到错误的原因。 示例执行为:
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
在这种情况下,您正在模拟被调用模块的所有者。
您也可以模拟SELF
,或USER创建或更改模块,或者...模拟CALLER,这将使模块能够获得当前用户的权限,或者...模仿OWNER,它将获得被称为OR的过程所有者的许可。模拟'user_name'
,它将模拟特定用户或...模拟'login_name'
与将模拟特定的登录名。对存储过程之类的对象设置权限可以使用
GRANT EXECUTE ON <schema>.<procedurename> to <username>;
但是,您可能还希望在登录和用户级别上授予安全权限。您将要确定并授予
ONLY必要的权利用于需要访问(例如执行)的对象。考虑使用
有时,您只需要向存储的proc授予EXECUTE权限,然后将权限授予在存储的proc中引用的所有对象。"EXECUTE AS"
功能,该功能可启用另一个用户的模拟验证执行代码WITHOUT所必需的权限,该代码必须授予所有基础对象(例如表)所有必要的权限。这样,您无需授予隐式权限(例如:更新数据或调用其他proc)。
所有权链接为您处理。这对于动态sql尤其有用,或者如果您需要创建更高的安全性任务,例如
此示例可能有助于阐明所有这些:CREATE TABLE. EXECUTE AS
是考虑这些的便捷工具。
--Create a user called NoPrivUser with public access to a database (e.g. 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 AS IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].MyTable') AND type in (N'U')) CREATE TABLE MyTable (PKid int, column1 char(10)) INSERT INTO MyTable VALUES (1,'ABCDEF') GO GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; GO
-现在以NoPrivUser身份登录到数据库服务器并运行以下命令。
use dbadb go EXEC dbo.MyProcedure --(1 row(s) affected)
现在以NoPrivuser登录时尝试从新表中选择。您将获得以下内容:
select * from MyTable go
Msg 229,级别14,状态5,第1行,SELECT权限被拒绝 对象'MyTable',数据库'DBAdb',模式'dbo'。这是可以预期的,因为您仅在以NoPrivUser身份登录时才在Owner的安全上下文中运行该过程。NoPrivUser作为没有权利实际读取表,只是执行创建和插入行的过程。
使用EXECUTE AS子句,存储过程在对象所有者的上下文中运行。此代码成功创建了dbo.MyTable,并且已成功插入行。
在此示例中,用户“ NoPrivUser”绝对没有授予修改表,读取或修改此表中任何数据的权限。它仅具有完成此过程内编码的此特定任务所需的权限。
这种创建存储过程的方法可以执行需要提高安全性权限的任务而无需永久分配这些权限的方法非常有用。