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

Trigger zum Protokollieren von Aenderungen an Tabellen

$
0
0

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;



Viewing all articles
Browse latest Browse all 1772

Trending Articles



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