在一些阅读中,了解了 Impersonate 权限。从我读过的内容来看,这更像是创建一个用户的副本,该用户的所有权限级别都使用不同的名称。我知道这可用于在不同的登录名下执行任何查询,但最终它的用途是什么?
为什么要引入这个功能?
我有一种情况,虽然我能够解决它(如重现所示),但我不明白。以下是重点
EXEC(@sql)
访问 ChainingDestination 中的表execute as
子句定义的execute as
条款,我会得到同样的错误。execute as
条款,一切都很好。这是我感到困惑的倒数第二点。或者,具体地,为什么一个不工作,最后一个呢。
/******************************
Setup
******************************/
USE [master];
go
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingSource')
BEGIN
ALTER DATABASE [ChainingSource] SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [ChainingSource] SET ONLINE;
DROP DATABASE [ChainingSource];
END
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingDestination')
BEGIN
ALTER DATABASE [ChainingDestination] SET OFFLINE WITH …
Run Code Online (Sandbox Code Playgroud) 假设在数据库中创建了一个证书
create certificate certName
with subject = 'subj';
GO
Run Code Online (Sandbox Code Playgroud)
和映射到此证书的用户
create user userName
from certificate certName;
GO
Run Code Online (Sandbox Code Playgroud)
试图直接冒充此用户
execute as user = 'userName';
GO
Run Code Online (Sandbox Code Playgroud)
或execute as
在模块的子句中指定用户
create procedure procName
with execute as 'userName'
as
set nocount on;
GO
Run Code Online (Sandbox Code Playgroud)
返回错误
消息 15517,级别 16,状态 1 ...
无法作为数据库主体执行,因为主体“userName”不存在、无法模拟此类主体或您没有权限。
但是,我找不到文档中提到的这个限制(这里和这里),唯一相关的声明似乎是
user_name 必须存在于当前数据库中并且必须是单例帐户。user_name 不能是组、角色、证书、密钥或内置帐户,例如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。
是否可以模拟映射到证书的用户(或登录)?
我有一个存储过程,它为需要由我们的一位数据分析师每个月运行的特定项目创建一个数据库。问题是我如何构建它以使分析师能够在不授予他们创建数据库权限的情况下运行此存储过程。
我试过用 EXECUTE 作为 OWNER/USER_NAME
分析人员仍然收到以下错误:消息 262,级别 14,状态 1,第 67 行 CREATE DATABASE 权限在数据库“master”中被拒绝。
有什么建议吗?
security sql-server stored-procedures permissions impersonation
这个问题是关于 Microsoft SQL Server 中的模拟。我想知道,如果我对特定登录拥有模拟权限,那么我可以随时轻松地模拟该登录,并且不需要使用EXECUTE AS OWNER
?的存储过程。如果是这样,那么存储过程的目的是什么EXECUTE AS
?
在 MSSQL 2008R2 上,我在不同的服务器上有两个实例,我需要同步所有登录的密码更改。我认为我可以创建一个存储过程,其中具有 securityadmin 服务器角色的用户(模拟)更改密码。
Obs:CHANGE_PASSWORD 是具有 securityadmin 服务器角色的用户。
ALTER PROCEDURE SPU_CAMBIO_PASSWORD
(
@USER VARCHAR(50),
@PASSWORD VARCHAR(100)
)
WITH EXECUTE AS 'CHANGE_PASSWORD'
AS
DECLARE @STATEMENT VARCHAR(200)
SET @STATEMENT= 'ALTER LOGIN '+ @USER+ ' WITH PASSWORD = '''+@PASSWORD+''', CHECK_POLICY =OFF'
EXEC(@STATEMENT)
GO
Run Code Online (Sandbox Code Playgroud)
错误:无法作为服务器主体执行,因为主体“CAMBIO_PASSWORD”不存在,无法模拟此类主体,或者您没有权限。
sql-server permissions t-sql sql-server-2008-r2 impersonation
我创建了一个存储过程,允许用户在 QA 环境中关闭所有数据库连接。我是 SA 并创建了程序。
当我修改 SP 时,在没有“以所有者身份执行”的情况下运行它,我得到了结果。当我添加“以所有者身份执行”时,我没有收到任何结果。
试图理解为什么。
create procedure [dbo].[DatabaseConnectionClose]
@DatabaseName varchar(255)
with execute as owner
as
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = db_id(@DatabaseName)
select @kill as CloseConnectionScript
EXEC(@kill);
Run Code Online (Sandbox Code Playgroud) sql-server permissions sql-server-2012 connections impersonation