什么是差异性之探源...
execute as user = 'testuser'
和
execute as login = 'testuser'
我这些登录下执行一个跨数据库的程序,并将它与exececute作为登录工作,但不执行的用户。 跟它服务器主体“testuser的”是NT能够在securty环境下访问数据库“XXX”。
当我SELECT SYSTEM_USER
这两个命令后,我看到它被设置为'testuser'
什么是差异性之探源...
execute as user = 'testuser'
和
execute as login = 'testuser'
我这些登录下执行一个跨数据库的程序,并将它与exececute作为登录工作,但不执行的用户。 跟它服务器主体“testuser的”是NT能够在securty环境下访问数据库“XXX”。
当我SELECT SYSTEM_USER
这两个命令后,我看到它被设置为'testuser'
execute as login
提供模拟到整个服务器中,由于登录是在服务器级别。 由于用户是每个数据库定义, execute as user
模拟只适用于特定的数据库,这就是为什么你当你穿越数据库看到错误。
实施例为执行如:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
在这种情况下,你要模拟模块的所有者被调用。 您还可以模拟SELF,或者用户创建或更改模块或... imperonate来电,这将使到模块采取对permissionsof当前用户,还是......冒充业主,将采取的权限该过程的所有者被称为OR ...冒充“USER_NAME”,这将模拟特定用户或者......冒充“LOGIN_NAME”与将模拟特定的登录。
像存储过程对象设置权限可与“GRANT完成上执行到。
但是,您可能还需要在登录和用户级别都授予安全权限。 您将要确定并授予那些需要访问(如执行)的对象只有必要的权利。 考虑使用“EXECUTE AS”的能力使另一个用户的模拟,以验证所需要的,而无需对所有的必要的权利授予的所有物件(例如表)的执行代码的权限。 的EXECUTE AS可以被添加到存储的特效,函数,触发器等。
大多数时候,你只需要授予执行权,存储的特效,然后权限授予存储过程中引用的所有对象。 通过这种方式,你不需要给隐含的权利(例如:要更新数据或调用额外的特效)。 所有权链接为您处理此。 这是动态SQL特别有用,或者如果你需要创建提升的安全任务,例如CREATE TABLE。 EXECUTE AS是考虑这些的方便工具。
这个例子可能有助于澄清了这一切:
创建一个名为NoPrivUser用户与公众访问数据库(例如dbadb)
USE [主] 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
注:CREATOR或所有者此过程将需要在目标数据库中CREATE TABLE权利。
使用DBAdb去CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER AS IF NOT EXISTS(SELECT * FROM sys.objects中WHERE的object_id = OBJECT_ID(N '[DBO] .MyTable')和类型中(N'U'))CREATE TABLE MyTable的(PKID INT,COLUMN1 CHAR(10))INSERT INTO MyTable的值(1, 'ABCDEF')
走
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 走
- 现在登录到你的数据库服务器作为NoPrivUser并运行以下。
使用dbadb去
EXEC dbo.MyProcedure
(1行(一个或多个)受影响)
现在尝试登录时为NoPrivuser从新表中选择。
您将获得以下内容:
SELECT * FROM MyTable的去
消息229,级别14,状态5,第1行的SELECT权限被拒绝的对象 'MyTable的' 数据库 'DBAdb',架构 'DBO'。
因为你只跑了业主的安全环境下的程序登录时为NoPrivUser,预计。
NoPrivUser因为没有权利来实际读取表。 只是为了执行它创建并插入行的过程。
与EXECUTE AS子句存储过程对象所有者的上下文中运行。 此代码创建成功dbo.MyTable和行成功插入。 在这个例子中,用户“NoPrivUser”已absolutey没有授予的权利修改表,或读取或修改任何数据在此表中。
只需要在完成这一特定任务编码在这个过程的上下文所需的权限。
创建存储过程的这种方法,可以执行需要提升的安全权限,而不是永久性分配这些权利来是非常有用的任务。
登录范围是在服务器级别,而用户范围是在当前数据库级别
http://msdn.microsoft.com/en-us/library/ms181362.aspx