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'', 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 Account | Job Owner | Job Step Type | Run As | ORIGINAL_LOGIN | SUSER_NAME | Error Message | |
| CASE 1 | Local System | sa_account | Transact-SQL | <domain>\<machine_name>$ | NT AUTHORITY\SYSTEM | ||
| CASE 2 | Local System | Tester1 | Transact-SQL | 'EXECUTE AS LOGIN' failed for the requested login 'Tester1'. The step failed. | |||
| CASE 3 | Local System | sa_account | Transact-SQL | Tester1 | 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 4 | Local System | Tester1 | Transact-SQL | Tester1 | 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 5 | Local System | Tester1 | Transact-SQL | sa_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
SQL Server ->> 关于SQL Server Agent Job执行步骤时的用户上下文(User Context)问题的更多相关文章
- SQL Server 2000中的并行处理和执行计划中的位图运算符
SQL Server 2000中的并行处理和执行计划中的位图运算符 摘抄自:SQLServer 2000并行处理和位图简介 刘志斌 并行查询介绍Degree of Parallelism(并行度) 一 ...
- sql server在执行批处理时出现错误。错误消息为: 目录名无效
今天在客户服务器上的sql server上执行脚本,报错提示“在执行批处理时出现错误.错误消息为:目录名无效”,第一反应就是客户是不是在服务器装了360,因为之前有类似问题,360把数据库的文件给隔离 ...
- Linux下用freetds执行SQL Server的sql语句和存储过程
Linux下用freetds执行SQL Server的sql语句和存储过程 http://www.linuxidc.com/Linux/2012-06/61617.htm freetds相关 http ...
- SQL Server查看Sql语句执行的耗时和IO消耗
原文:SQL Server查看Sql语句执行的耗时和IO消耗 在做系统过程中,经常需要针对某些场景进行性能优化,那么如何判定性能优化的效果呢?肯定需要知道优化之前Sql语句的耗时和优化之后Sql语句的 ...
- 整理:sql server 中sql语句执行顺序
SQL Server 查询处理中的各个阶段(SQL执行顺序) SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是 ...
- SQL Server使用sp_executesql在存储过程中执行多个批处理
SQL Server中有些SQL语句只能在一个批处理里面完成,例如CREATE SCHEMA语句创建SCHEMA的时候,每个SCHEMA都需要在一个单独的批处理里面完成: CREATE SCHEMA ...
- SQL server 维护计划中 “清除维护任务” 执行报错
SQL server 维护计划中 “清除维护任务” 执行报错,错误如下: 执行查询“EXECUTE master.dbo.xp_delete_file 0,N'',N'',N'2019...”失败,错 ...
- 常用SQL语句大全(SQL Server)
一.基础 查看数据库状态 select state_desc from sys.databases where name='dbname' -- dbname数据库名 1.说明:创建数据 ...
- SQL Server经典sql语句大全(转)
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...
随机推荐
- JS之作用域与闭包
JS之作用域与闭包 作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...
- 02-oracle字符函数
字符函数(scott/tiger 登陆) --upper(col name)将字符大写 --lower(col name)将字符小写 --initcap(col name)字符串的首字母大写,其余小写 ...
- Oracle 分区表(转)
原文地址:http://love-flying-snow.iteye.com/blog/573303 废话少说,直接讲分区语法. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. ...
- javascript DOM相关语法
childNodes: 获取元素内的所有节点 包括文本节点:nodeType=3 , 元素节点:nodeType = 1 nodeType:它可以判断所有节点的类型 元素节点类型:1 文本节点:3 注 ...
- Ubuntu下配置安装Hadoop 2.2
---恢复内容开始--- 这两天玩Hadoop,之前在我的Mac上配置了好长时间都没成功的Hadoop环境,今天想在win7 虚拟机下的Ubuntu12.04 64位机下配置, 然后再建一个组群看一看 ...
- 深入理解JavaScript系列(45):代码复用模式(避免篇)
介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...
- 原创:微信小程序java实现AES解密并获取unionId
来自:微信小程序联盟 如果大家使用小程序的同时还在使用公众号的话,可能会用到unionId这种功能,由于公司业务需要,我们需要使用unionId,具体使用方法,请参考微信开放平台的说明,但是在微信小程 ...
- [转]时序列数据库武斗大会之什么是TSDB
由于工作上的关系,最近看了一些关于时序列数据库的东西,当然,我所看的也都是以开源方案为主. 趁着这股热劲还没退,希望能整理一些资料出来.如果正好你也有这方面的需求,那么希望这一系列的介绍能够帮助到你. ...
- SQL常用函数总结
SQL常用函数总结 这是我在项目开发中使用db2数据库写存储过程的时候经常用到的sql函数.希望对大家有所帮助: sql cast函数 (1).CAST()函数的参数是一个表达式,它包括用AS关键字分 ...
- IDEA 2017的插件mybatis plugin(绿色免安装)
https://blog.csdn.net/u014365133/article/details/78885189 插件下载 https://files.cnblogs.com/files/techl ...