SQL Server执行模拟

SQL Server执行模拟,sql,sql-server-2008,sql-server-2005,impersonation,Sql,Sql Server 2008,Sql Server 2005,Impersonation,两者之间有什么不同 execute as user = 'testuser' 及 我在这些登录下执行一个跨数据库的过程,它以登录的方式与execute一起工作,而不是以用户的方式执行。这意味着服务器主体testuser不能在安全上下文下访问数据库xxx 当我在两个命令之后选择SYSTEM_USER时,我看到它被设置为“testuser”execute as login为整个服务器提供模拟,因为登录是在服务器级别。由于用户是按数据库定义的,因此“执行为用户模拟”仅适用于特定数据库,这就是为什么在

两者之间有什么不同

execute as user = 'testuser'

我在这些登录下执行一个跨数据库的过程,它以登录的方式与execute一起工作,而不是以用户的方式执行。这意味着服务器主体testuser不能在安全上下文下访问数据库xxx


当我在两个命令之后选择SYSTEM_USER时,我看到它被设置为“testuser”

execute as login为整个服务器提供模拟,因为登录是在服务器级别。由于用户是按数据库定义的,因此“执行为用户模拟”仅适用于特定数据库,这就是为什么在跨数据库时会看到错误。

登录范围在服务器级别,而用户范围在当前数据库级别


可以将executeas添加到存储的进程、函数、触发器等中

要执行的示例如下:

CREATE PROCEDURE dbo.MyProcedure
      WITH EXECUTE AS OWNER
在本例中,您模拟的是被调用模块的所有者

您还可以模拟SELF,或创建或更改模块的用户,或。。。 模拟调用者,这将使模块具有当前用户的权限,或。。。 模拟所有者,它将获得被调用过程的所有者的权限,或者。。。 模拟“user\u name”,它将模拟特定用户或。。。 使用模拟“login\u name”将模拟特定登录名

对存储过程等对象设置权限可以通过

GRANT EXECUTE ON <schema>.<procedurename> to <username>; 
注意:此过程的创建者或所有者需要在目标数据库中具有创建表的权限

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行选择权限被拒绝 对象“MyTable”、数据库“DBAdb”、架构“dbo”

这是意料之中的,因为在以NoPrivUser身份登录时,您仅在所有者的安全上下文下运行该过程。 NoPrivUser没有实际读取表的权限,只是执行创建和插入行的过程

使用EXECUTE AS子句,存储过程在对象所有者的上下文下运行。这段代码成功地创建了dbo.MyTable,并且成功地插入了行

在此示例中,用户NoPrivUser绝对没有被授予修改表、读取或修改此表中任何数据的权限。 它仅具有完成此过程上下文中编码的特定任务所需的权限

这种创建存储过程的方法非常有用,它可以执行需要提升安全权限的任务,而无需永久分配这些权限

use dbadb
go

EXEC dbo.MyProcedure

--(1 row(s) affected)
select * from MyTable
go