我在SQL Server 2012上很新,我遇到了一个奇怪的问题。
我在数据库的表上开发了AFTER UPDATE
触发器。我在我们的开发环境中创建了触发器,这是SQL Server 2012的快速版,没问题。
现在我必须在我们的生产环境中创建相同的触发器,即SQL Server 2012企业版,创建脚本永远不会停止执行,并且不会创建触发器。
关于创建触发器需要做什么的任何想法?
剧本:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter TRIGGER [dbo].[til_aks_ved_betaling]
ON [dbo].[betalingsOplysningerbo]
AFTER UPDATE
AS
BEGIN
declare @snr uniqueidentifier
declare @@status varchar(1024)
SET NOCOUNT ON;
select
@snr = indmeldelse_snr
from
inserted
if UPDATE(betalingsDato)
begin
set @@status = 'Kalder med snr = ' + convert(varchar(38), @snr)
exec xp_logevent 60000, @@status , informational
exec overfoer_betalingsdato @snr
end
END
答案 0 :(得分:0)
这里有2件事,对于新人来说很常见,UPDATE是DELETE和INSERT,所以在你认为它是更新之前确保你有两件事。其次,这些特殊的表将返回所有受单个sql调用影响的行。例如,Update Table SET This = 'That'
将更新表中的每条记录,而INSERTED则包含许多记录。
答案 1 :(得分:0)
尝试这样的事情......
ALTER TRIGGER [dbo].[til_aks_ved_betaling]
ON [dbo].[betalingsOplysningerbo]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
declare @snr VARCHAR(1000);
declare @status varchar(1024);
DECLARE @Temp TABLE (indmeldelse_snr uniqueidentifier , [Status] varchar(1024))
INSERT INTO @Temp (indmeldelse_snr , [Status])
SELECT i.indmeldelse_snr , i.[Status]
FROM inserted i INNER JOIN deleted d
ON i.Snr = d.Snr AND i.betalingsDato <> d.betalingsDato
WHILE EXISTS(SELECT * FROM @Temp)
BEGIN
SELECT TOP 1 @snr = 'Kalder med snr = ' + convert(varchar(38),indmeldelse_snr )
,@status = [Status]
FROM @Temp
exec xp_logevent 60000, @status , informational
exec overfoer_betalingsdato @snr
DELETE FROM @Temp WHERE indmeldelse_snr = @snr
END
END