2013-06-12 23 views
0

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

电子邮件部分工作完美,但是当添加票证过程代码时,电子邮件将不会发送,票证将不会打开,并且应该在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 = '[email protected]', 
@body = @ErrorInfo, 
@subject = @JobName ; 




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

END 
end 
GO 

谢谢, 伊丹。

+1

为什么没有使用插入触发器表的权限? –

+1

'inserted'和'deleted'是表,以便它们可以表示设置操作的结果。假设它们总是包含一行,设计一个触发器通常是一个糟糕的计划。如果你完全确定永远不会有多行,那么请添加一个行数检查并使用'RaIsError'来明确告知那些稍后来到的人他们试图执行不可接受的语句。 ('if(从插入中选择Count(*))> 1 RaIsError('FooTable_Insert:不会超过一行可以处理',25,42)with log') – HABO

回答

0

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

execute as user_name 

其中user_name必须使用PROC

+0

谢谢,问题出在网络DTC访问。 – user1050491