Quantcast
Channel: Für Entwickler: SQL Server Forum
Viewing all articles
Browse latest Browse all 1772

trigger ersetzen?

$
0
0

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


Viewing all articles
Browse latest Browse all 1772

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>