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