Hallo,
ich habe einen Trigger zum Protokollieren von Änderungen an Tabellen in einem Logbuch. Beim Aktivieren des Triggers kommt immer ein Fehler
Fehlerbericht -
Methoden für numeric können nicht aufgerufen werden.
Was mache ich falsch? Oder lässt sich das mit MSSQL nicht realisieren?
CREATE TRIGGER [dbo].T_LOGSPTPL ON [dbo].SPTPL AFTER INSERT, UPDATE, DELETE AS BEGIN -- Verwendung: -- wird bei entsprechenden DML-Vorgängen aktiviert -- erzeugt einen Eintrag in die Tabelle Logbuch2 -- erstellt für das Logbuch2-Verwaltungsprogramm am : 11.07.2016 -- erstellt für das Logbuch2-Verwaltungsprogramm von : FWPR DECLARE @nAR AS NUMERIC; DECLARE @sTabelle AS VARCHAR(20); DECLARE @nOldAuftragsNr AS NUMERIC; DECLARE @nNewAuftragsNr AS NUMERIC; DECLARE @sOldBestellNr AS VARCHAR(15); DECLARE @sNewBestellNr AS VARCHAR(15); DECLARE @nBereich AS NUMERIC; DECLARE @nARRef AS NUMERIC; DECLARE @sARRef AS VARCHAR(30); DECLARE @EVENT_TYPE AS VARCHAR(20); DECLARE @sUserName AS VARCHAR(35); SET NOCOUNT ON SELECT @sTabelle = 'SPTPL' SELECT @nBereich = 0 SELECT @nARRef = 0 SELECT @nARRef = '' IF EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) BEGIN SELECT @EVENT_TYPE = 'UPDATE' END ELSE IF EXISTS(SELECT * FROM INSERTED) BEGIN SELECT @EVENT_TYPE = 'INSERT' END ELSE IF EXISTS(SELECT * FROM DELETED) BEGIN SELECT @EVENT_TYPE = 'DELETE' END ELSE BEGIN SELECT @EVENT_TYPE = 'UNKNOWN' END DECLARE c CURSOR FAST_FORWARD FOR SELECT UserName FROM ProgrammProtokoll WHERE login = (select max(login) from programmprotokoll); OPEN c; FETCH NEXT FROM c INTO @sUserName; CLOSE c; DEALLOCATE c; IF @EVENT_TYPE = 'UPDATE' BEGIN DECLARE c CURSOR FAST_FORWARD FOR SELECT N.AR. O.AUFTRAGSNR, N.AUFTRAGSNR, O.BESTELLNR, N.BESTELLNR FROM INSERTED N, DELETED O WHERE ( ( O.AUFTRAGSNR <> N.AUFTRAGSNR ) OR ( O.AUFTRAGSNR IS NULL AND N.AUFTRAGSNR IS NOT NULL) OR ( O.AUFTRAGSNR IS NOT NULL AND N.AUFTRAGSNR IS NULL ) ) AND ( ( O.BESTELLNR <> N.BESTELLNR ) OR ( O.BESTELLNR IS NULL AND N.BESTELLNR IS NOT NULL) OR ( O.BESTELLNR IS NOT NULL AND N.BESTELLNR IS NULL ) ); OPEN c; FETCH NEXT FROM c INTO @nAR, @nOldAuftragsNr, @nNewAuftragsNr, @sOldBestellNr, @sNewBestellNr; WHILE @@fetch_status = 0 BEGIN INSERT INTO Logbuch2(Datum, Username, Text1, Text2, Tabelle, ARTabelle, Bereich, ARRef, Typ ) VALUES( GETDATE(), @sUserName, 'Auftrag ' + Convert(VARCHAR, @nNewAuftragsNr) + ' Bestellnummer: ' + @sOldBestellNr + ' in ' + @sNewBestellNr + ' durch ' + @sUserName + ' am ' + Convert(VARCHAR, GETDATE()) + ' geändert', '', @sTabelle, @nAR, @nBereich, @nARRef, 2 ); FETCH NEXT FROM c INTO @nAR, @nOldAuftragsNr, @nNewAuftragsNr, @sOldBestellNr, @sNewBestellNr; END; CLOSE c; DEALLOCATE c; ...; END; ELSE IF @EVENT_TYPE = 'INSERT' BEGIN DECLARE c CURSOR FAST_FORWARD FOR SELECT N.AR, N.AUFTRAGSNR, N.BESTELLNR FROM INSERTED N WHERE ( ( N.AUFTRAGSNR IS NOT NULL) AND ( LEN( N.AUFTRAGSNR > 0 ) ) ); OPEN c FETCH NEXT FROM c INTO @nAR, @nNewAuftragsNr, @sNewBestellNr; WHILE @@fetch_status = 0 BEGIN INSERT INTO Logbuch2(Datum, Username, Text1, Text2, Tabelle, ARTabelle, Bereich, ARRef, Typ ) VALUES( GETDATE(), @sUserName, 'Auftrag ' + Convert(VARCHAR, @nNewAuftragsNr) + ' Bestellnummer: ' + @sNewBestellNr + ' durch ' + @sUserName + ' am ' + Convert(VARCHAR, GETDATE()) + ' angelegt', '', @sTabelle, @nAR, @nBereich, @nARRef, 1 ); FETCH NEXT FROM c INTO @nAR, @nNewAuftragsNr, @sNewBestellNr; END; CLOSE c; DEALLOCATE c; END; ELSE IF @EVENT_TYPE = 'DELETE' BEGIN DECLARE c CURSOR FAST_FORWARD FOR SELECT O.AR, O.AUFTRAGSNR, O.BESTELLNR FROM DELETED O WHERE ( ( O.AUFTRAGSNR IS NOT NULL) AND ( LEN( O.AUFTRAGSNR > 0 ) ) ); OPEN c FETCH NEXT FROM c INTO @nAR, @nOldAuftragsNr, @sOldBestellNr; WHILE @@fetch_status = 0 BEGIN INSERT INTO Logbuch2(Datum, Username, Text1, Text2, Tabelle, ARTabelle, Bereich, ARRef, Typ ) VALUES( GETDATE(), @sUserName, 'Auftrag ' + Convert(VARCHAR, @nOldAuftragsNr) + ' Bestellnummer: ' + @sOldBestellNr + ' durch ' + @sUserName + ' am ' + Convert(VARCHAR, GETDATE()) + ' gelöscht', '', @sTabelle, @nAR, @nBereich, @nARRef, 3 ); FETCH NEXT FROM c INTO @nAR, @nOldAuftragsNr, @sOldBestellNr; END; CLOSE c; DEALLOCATE c; END; END;