SQL Server ->> 关于SQL Server Agent Job执行步骤时的用户上下文(User Context)问题

这是最近项目相关和自己感兴趣的一个问题:SQL Server Agent Job有几种方法可以以特定用户上下文去执行任务步骤的?

这个事情需要分几种情况来说,因为对于不同类型的任务步骤,SQL Server Agent Job是不同对待的。

做几个实验来实验SQL Server Agent Job对于不同配置先对于用户上下文的处理。

 

首先创建一张测试表

USE [tempdb]
GO

CREATE TABLE [dbo].[Table_1](
    [col1] [nvarchar](500) NULL
) ON [PRIMARY]

GO

 

创建测试存储过程

CREATE PROCEDURE dbo.usp_TestExecuteAsUser 
AS
SET NOCOUNT ON

INSERT tempdb.dbo.Table_1(col1)
SELECT 'ORIGINAL_LOGIN = "' + ORIGINAL_LOGIN() + '", SUSER_NAME = "' + SUSER_NAME() + '"'
GO

 

创建测试Login

USE [master]
GO

CREATE LOGIN [Tester1] WITH PASSWORD=N'123', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

 

把SQL Server Agent服务器的服务账户设置为Local System

 

总结:

1)Job Step类型为T-SQL,Job Owner是SYS_ADMIN成员,如果没有指定Run As,执行用户是Agent Service Account;

2)Job Step类型为T-SQL,Job Owner是SYS_ADMIN成员,如果指定Run As,执行用户是Run As;

3)Job Step类型为T-SQL,Job Owner是不是SYS_ADMIN成员(比如Public),不管有没有指定Run As,执行用户是Job Owner;

4)Job Owner是Login,Run As其实你指定的数据库的用户。也就是说,如果Job Step中调用的存储过程的代码访问了诸如像msdb的数据库资源,或者你的存储过程本身就是别的数据库的。从下面的表中你可以看到ORIGINAL_LOGIN的值是<domain>\<machine_name>$,像这样的用户根本就不是现有SQL Server服务器上能够看到的,权限也应该就是Public的权限,是会有报权限不足的错误的风险。本身Impersonate的就是数据库用户的身份。

 

 Agent Service AccountJob OwnerJob Step TypeRun AsORIGINAL_LOGINSUSER_NAMEError Message
CASE 1Local Systemsa_accountTransact-SQL <domain>\<machine_name>$NT AUTHORITY\SYSTEM 
CASE 2Local SystemTester1Transact-SQL   'EXECUTE AS LOGIN' failed for the requested login 'Tester1'.  The step failed.
CASE 3Local Systemsa_accountTransact-SQLTester1  Executed as user: Tester1. The EXECUTE permission was denied on the object 'usp_TestExecuteAsUser', database 'TestDB', schema 'dbo'. [SQLSTATE 42000] (Error 229).  The step failed.
CASE 4Local SystemTester1Transact-SQLTester1  Executed as user: Tester1. The EXECUTE permission was denied on the object 'usp_TestExecuteAsUser', database 'TestDB', schema 'dbo'. [SQLSTATE 42000] (Error 229).  The step failed.
CASE 5Local SystemTester1Transact-SQLsa_account  Executed as user: Tester1. The EXECUTE permission was denied on the object 'usp_TestExecuteAsUser', database 'TestDB', schema 'dbo'. [SQLSTATE 42000] (Error 229).  The step failed.

 

 5)Job Step类型不是T-SQL(比如SSIS Package),Job Owner是SYS_ADMIN成员,如果没有指定Run As某个Proxy,执行用户是Agent Service Account;

 6)Job Step类型不是T-SQL(比如SSIS Package),Job Owner是SYS_ADMIN成员,如果指定Run As某个Proxy,执行用户是Proxy的用户上下文;

 

参考文献:

SQL Server Agent jobs and user contexts

转载于:https://www.cnblogs.com/jenrrychen/p/5039165.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值