我有一个存储过程,可以在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]
答案 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%'
当然支持。
总的来说,我认为这比我预期的花费了更多的努力。