Hallo Experts,
um die Anzeige veränderter und neu eingefügter Datensätze (Veränderung von Warenbeständen, Versandinformationen) in der DB (SQL Server 2005) Ereignisgesteuert zu betreiben haben wir einige Trigger implementiert. Seit dem tauchen vermehrt Sperren und Time Outs auf. So dass der Trigger von hochfrequentierten Tabellen sein Zweckfast schon nicht erfüllen, denn ca. 10% aller betroffene Datensätze werden nicht commited.
Die Frage ist ob grundsätzlich die Trigger lieber nicht benutzt werden sollen, oder gibt es einen effizienteren weg einen Trigger zu implementieren? In meinem Fall (s. unten) enthellt die Prozedur einen delete und ein insert befehl aufgrund der Daten ´, die durch eine UDF zurückgegeben werden. Immer nur einzelne Datensetze
So z. B ein Trigger der beim Vorhandensein eines Satzes in DELETED oder INSERTED Tabellen eine Prozedur ausführt:
CREATE TRIGGER [dbo].[update_XXX]
ON [dbo].[XXX_DATA]
AFTER UPDATE, INSERT
as
declare @XXX_typ int;
declare @XXX_nummer int;
IF EXISTS(SELECT 1 FROM deleted where XXX_TYP in (2, 3, 4))
BEGIN
select @XXX_typ = d.XXX_TYP from deleted d;
select @XXX_nummer =d.XXX_NUMMER from deleted d;
END
else
IF EXISTS(SELECT 1 FROM INSERTED where XXX_TYP in (2, 3, 4))
BEGIN
select @XXX_typ = i.XXX_TYP from INSERTED i;
select @XXX_nummer = i.XXX_NUMMER from INSERTED i;
END
if @XXX_typ not in (1,5,6)
BEGIN
exec proc_update_XXX_DATA_to_yyy @XXX_typ = @XXX_typ, @XXX_nummer=@XXX_nummer;
END
--second part: "Update Webshop"
BEGIN
if @XXX_typ = 3
BEGIN
IF EXISTS(SELECT 1 FROM deleted d inner join VERAENDERUNGEN_LOG gwa on gwa.NUMMER = d.XXX_NUMMER and d.XXX_TYP=3)
BEGIN
update gwa
set gwa.INSERT_TIMSTP = getdate()
from VERAENDERUNGEN_LOG gwa
inner join deleted d on d.XXX_NUMMER = gwa.NUMMER
and gwa.STATUS = 0
END
ELSE
BEGIN
INSERT INTO VERAENDERUNGEN_LOG
SELECT XXX_NUMMER, 0, getdate()
FROM deleted
end
IF EXISTS(SELECT 1 FROM INSERTED i inner join VERAENDERUNGEN_LOG gwa on gwa.NUMMER = XXX_NUMMER and i.XXX_TYP=3)
BEGIN
update gwa
set gwa.INSERT_TIMSTP = getdate()
from VERAENDERUNGEN_LOG gwa
inner join INSERTED i on i.XXX_NUMMER = gwa.NUMMER
and gwa.STATUS = 0
END
ELSE
BEGIN
INSERT INTO VERAENDERUNGEN_LOG
SELECT XXX_NUMMER, 0, getdate()
FROM INSERTED
end
END
END
Irina