MSSQL触发器不适用于存储过程

时间:2013-06-12 15:37:33

标签: sql-server stored-procedures triggers

我的代码是有一个触发器,可以识别作业失败的时间,发送电子邮件并使用链接数据库中的存储过程更新我们的票证系统。

电子邮件部分工作正常,但是当添加电子邮件不会发送的票证程序代码时,票证将无法打开,并且应该在msdb.dbo.sysjobhistory中的特定行实际上已丢失,例如插入失败或者该行被删除。

程序代码行本身工作正常,如果我运行没有触发器部分的相同代码,它也可以正常工作。

代码在触发器之外工作正常,这让我觉得我错过了关于触发器工作方式的一些东西。

    alter TRIGGER trig_open_ticket_failed
ON msdb.dbo.sysjobhistory
after INSERT
AS begin
 DECLARE @MaxInstance int
Declare @failedFlag int
Declare @JobName varchar(50)
Declare @ErrorInfo varchar(max)
Declare @stepName varchar(50)
set @MaxInstance= (select MAX(instance_id) 
    from msdb.dbo.sysjobhistory
    )



 select top 1 @failedFlag = hs.run_status, @stepName=hs.step_name
 from msdb.dbo.sysjobhistory hs join msdb.dbo.sysjobs sj
 on hs.job_id=sj.job_id
 where instance_id= @MaxInstance

 if @failedFlag=0 
 BEGIN


SELECT TOP 1 @JobName= 'LKSQL job failed:' + SJ.name, @ErrorInfo=hs.message
 from msdb.dbo.sysjobhistory hs join msdb.dbo.sysjobs sj
on hs.job_id=sj.job_id
where instance_id= @MaxInstance 
set @errorInfo= 'Job: '+ @JobName +' Failed with error: '+ @errorInfo;


EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'name',
@recipients = 'adrs@email.com',
@body = @ErrorInfo,
@subject = @JobName ;




exec [mainsql01].[SlickTicket].[dbo].[AddTicket] 'servicesFailed',@jobName, @ErrorInfo,    '5','4' ;

END
 end
GO

谢谢你, IDAN。

1 个答案:

答案 0 :(得分:0)

默认情况下,您的触发器将作为调用者执行,我猜测它无权使用您的addticket过程。尝试添加

 execute as user_name 

其中user_name有权使用该proc