Re: Triggers und History

Tech-Archive recommends: Fix windows errors by optimizing your registry



Hallo Albert!

Wir haben uns schon richtig verstanden. Hier was ich habe:
...

Es geht schon. Im Endeffekt kannst Du alles was Du schreiben kannst auch
generieren.

Sobald Du allerdings auf Feld-Ebene tracen willst, musst Du mittels eines
CURSORs durch die Rows in den INSERTED bzw. DELETE Tabellen gehen.

Überlege Dir zuerst wie das fertige Statement aussehen soll

z.b.:

CREATE TRIGGER <TableName>_History_Insert ON [<TableName>]
AFTER INSERT
AS

### dynamically generate a variable for each column { ###
DECLARE @i_Id int
DECLARE @i_Name varchar(max)
DECLARE @i_Status int
### } ###

DECLARE @HistoryId int

DECLARE C CURSOR FOR
SELECT Id, Name, Status FROM INSERTED

OPEN C

### dynamically generate the list of variables
FETCH NEXT FROM C INTO @i_Id, @i_Name, @i_Status

WHILE @@FETCH_STATUS = 0 BEGIN

-- insert the main entry
INSERT INTO History (TableName, RecordId, Operation)
VALUES ('<TableName>', @i_Id, 'I')

SET @HistoryId = @@IDENTITY

### dynamically generate such a block for each column { ###

-- insert the details (one statement for each field)
INSERT INTO HistoryDetails (HistoryId, FieldName, OldValue, NewValue)
SELECT @HistoryId, 'Id', NULL, @i_Id

INSERT INTO HistoryDetails (HistoryId, FieldName, OldValue, NewValue)
SELECT @HistoryId, 'Name', NULL, @i_Name

INSERT INTO HistoryDetails (HistoryId, FieldName, OldValue, NewValue)
SELECT @HistoryId, 'Status', NULL, @i_Status

### } ###

### dynamically generate the list of variables
FETCH NEXT FROM C INTO @i_Id, @i_Name, @i_Status
END

CLOSE C
DEALLOCATE C


===

Für den UPDATE Trigger musst Du die INSERTED und DELETED joinen und jeweils
unterschiedliche Variablen dafür haben, im Block vergleichst Du diese dann:

IF(@i_Name <> @d_Name)
INSERT INTO HistoryDetails (HistoryId, FieldName, OldValue, NewValue)
SELECT @HistoryId, 'Name', @d_Name, @i_Name



OK?
mfg GP


.



Relevant Pages

  • Re: Kopieren und dabei Eintrag =?ISO-8859-15?Q?=E4ndern?=
    ... in SQL99 war noch explizit "INSERT INTO" definiert. ... Meines Wissens war INTO schon immer optional. ... Zumindest in MySQL 4.0 war es schon so. ... ANSI Only-caused by ISO changes not yet considered by ANSI ...
    (de.comp.datenbanken.mysql)
  • =?iso-8859-1?Q?Re:_MSSQL_2005_und_sehr_gro=DFe_Menge_IF_NOT_EXISTS_INSERT?=
    ... Damit kannst Du auf das nicht sehr performante Not Exists verzichten. ... INSERT ... INTO ...... ... Microsoft MVP Office Access ...
    (microsoft.public.de.sqlserver)
  • Stringverkettung
    ... Diese Kategorien werden als Verzeichnisstruktur physikalisch ... INSERT INTO dbo.Tester VALUES ...
    (microsoft.public.de.sqlserver)
  • Re: ADOX.Catalog.Create
    ... Zum einzeln Erzeugen von Tabellen habe ich schon eigene Ideen. ... meiner Vorlage (Access 2000 Projekt) werden zuerst mit INSERT INTO ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)