从SQL Agent Job调用时,工作存储过程失败

时间:2018-08-31 19:21:26

标签: stored-procedures sql-server-2008-r2 sql-agent-job

我有一个存储过程,可以在SQL Server Management Studio中正常运行且没有错误。但是,当同一存储过程作为SQL代理作业的一个步骤执行时,它将终止于:

  

错误3930::当前事务无法落实,并且不支持写入日志文件的操作。回滚交易。

存储过程位于名为 fun requestDirections(onSuccess: (DirectionsResult) -> Unit, onError: (String) -> Unit, vararg wayPoints: LatLng) { Single.fromCallable { val dirApiRequest: DirectionsApiRequest = DirectionsApi.getDirections(getGeoContext(), "", "") dirApiRequest.mode(travelMode) dirApiRequest.destination(destinationPosition) dirApiRequest.origin(originPosition) dirApiRequest.units(unit) dirApiRequest.waypoints(*wayPoints) dirApiRequest.optimizeWaypoints(optimize) return@fromCallable dirApiRequest.await() } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { directionsResult -> onSuccess(directionsResult) }, { error -> onError(error.message?: "directions API failed") } //Log.e(TAG, "failed to get Directions: ${error.message}") ) } private fun getGeoContext(): GeoApiContext { return GeoApiContext().setQueryRateLimit(3) .setApiKey("SOIdfwioewoinAIEsoiehf") .setConnectTimeout(3, TimeUnit.SECONDS) .setReadTimeout(3, TimeUnit.SECONDS) .setWriteTimeout(3, TimeUnit.SECONDS) } 的模式中。它使用的大多数表也都位于[Billing]模式中。

主存储过程开始数据库事务。主存储过程调用的存储过程在继承的事务上完成所有工作。主要存储过程负责提交或回滚事务。

运行SQL Agent作业步骤的数据库用户不是Sysadmin角色,也不是dbo。它属于db_datareader和db_datawriter数据库角色,并已在[Billing]模式中被赋予删除,执行,插入,引用,选择和更新权限。

这是主要的存储过程:

[Billing]

1 个答案:

答案 0 :(得分:0)

正如@Lukasz Szozda在他对我的问题的评论中所暗示的那样,问题是当SQL Agent作业执行BCP.EXE命令时,它正在SQL Agent所使用的服务帐户下运行,这对我来说是相当严格的“本地系统”帐户。在这一点上,对我来说显而易见的是,必须使用代理帐户。因此,我在Operating System (CmdExec)下创建了一个代理,这是唯一有意义的选择。

我回到工作步骤以将其更改为使用代理,但随后注意到,在其当前类型为Transact-SQL script (TSQL)的情况下,无法分配代理帐户。

尝试了几件事之后,最终决定将作业步骤中的TSQL语句放入新的存储过程中,然后从SQL命令行可执行文件SQLCMD.EXE中调用该存储过程。然后,我将作业步骤类型从Transact-SQL script (TSQL)更改为Operating System (CmdExec)。然后,我可以将Run As字段设置为我先前创建的代理。我指定了命令以CMD.EXE /c SQLCMD.EXE -S [ServerName] -Q "EXEC [NewProcedureName] [parameters]"的身份运行。

如果您对我为什么在SQLCMD.EXE下运行CMD.EXE感到好奇,那是因为新存储过程的参数之一是特定格式的当前日期({{1 }}),SQL Server作业执行环境不支持,但'%date:~4,10%'当然支持。

总的来说,我认为这比我预期的花费了更多的努力。