swuser
Goto Top

MSSQL Tabelle bzw.Tupel mit angelegt am, geändert am, angelegt von und geändert von -Attributen versehen

Hallo Comunity!

Ich möchte gern meine Datenbanktabelle mit vier Attributen erweitern:
"angelegt am", "geändert am", "angelegt von" und "geändert von".

Die Authentifizierung erfolgt (noch) nicht über die ActiveDirectory, sondern erstmal nur über den SQL-Server, später soll es eventuell eine Mischform geben.

Wie kann ich das realisieren?
Timestamp ist ja nicht der richtige Ansatz, oder?


Vielen Dank schon mal im Voraus!
Felix

Content-Key: 187072

Url: https://administrator.de/contentid/187072

Printed on: April 26, 2024 at 03:04 o'clock

Member: SlainteMhath
SlainteMhath Jun 26, 2012 at 10:32:47 (UTC)
Goto Top
Moin,

Kurzform:

"angelegt am", "angelegt von"
Per Default-Werte der Spalte

"geändert am", "geändert von".
Per UPDATE Trigger

lg,
Slainte
Member: SWuser
SWuser Jun 26, 2012 updated at 11:15:43 (UTC)
Goto Top
Zitat von @SlainteMhath:
Moin,

Kurzform:

> "angelegt am", "angelegt von"
Per Default-Werte der Spalte

> "geändert am", "geändert von".
Per UPDATE Trigger

lg,
Slainte

Okay, danke für die Info.
Habe mich mal mit den Triggern auseinandergesetzt.
Könntest du (oder auch jmd. anderes) mir da weitere Hilfe geben?

Hier mal ein Triggerversuch:

CREATE TRIGGER I_Update_Test_Update
ON dbo.datenbank
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.tabelle
SET modified = now()
WHERE ???
UPDATE dbo.tabelle
SET [modified by] = ???
WHERE ???

END

Bei den Fragezeichen weiß ich leider nicht weiter...
Wie gesagt, dass soll halt nur für den betreffenden Tupel/Datensatz gemacht werden.
Member: SlainteMhath
SlainteMhath Jun 26, 2012 at 11:25:16 (UTC)
Goto Top
Fürs Update:
CREATE TRIGGER I_Update_Test_Update 
ON dbo.datenbank 
AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;
UPDATE dbo.tabelle t
SET t.modified = now(), t.[modified by] = SUSER_SNAME()
JOIN inserted i
ON t.key = i.key


Für Insert defaults wie folgt setzen:
"angelegt am" = now()
"angelegt von" = SUSER_SNAME()
Member: LianenSchwinger
LianenSchwinger Jun 26, 2012 updated at 13:12:49 (UTC)
Goto Top
Also bei Orcale geht das wie folgt:

CREATE OR REPLACE TRIGGER aaa_u BEFORE UPDATE ON aaa FOR EACH ROW
BEGIN 
   :NEW.change_user := 'xyz';  
   :NEW.change_date := SYSDATE;
END;

Da gibt es doch bestimmt etwas ähnliches bei MSSQL.

Gruß Jörg
Member: SlainteMhath
SlainteMhath Jun 26, 2012 at 13:10:52 (UTC)
Goto Top
Also ich glaube nicht das dem TE ein Oracle Script, noch dazu eins das nicht ganz das macht was gefragt war, was bringt - aber danke fürs Posten ^^
Member: SWuser
SWuser Jun 26, 2012 at 13:25:15 (UTC)
Goto Top
Zitat von @SlainteMhath:
Fürs Update:
> CREATE TRIGGER I_Update_Test_Update 
> ON dbo.datenbank 
> AFTER UPDATE
> AS 
> BEGIN
> SET NOCOUNT ON;
> UPDATE dbo.tabelle t
> SET t.modified = now(), t.[modified by] = SUSER_SNAME()
> JOIN inserted i
> ON t.key = i.key
> 


Für Insert defaults wie folgt setzen:
"angelegt am" = now()
"angelegt von" = SUSER_SNAME()


Danke für deine Ausführungen! Kenne "UPDATE" halt nur in der Form mit "SET" und "WHERE".
Habe den Trigger angepasst.
Habe noch zwei Fehler:
1. "'now' is not a recognized built-in function name."
2. "Falsche Syntax in der Nähe von 'JOIN'."
Member: SWuser
SWuser Jun 26, 2012 at 13:26:24 (UTC)
Goto Top
Zitat von @LianenSchwinger:
Also bei Orcale geht das wie folgt:

> CREATE OR REPLACE TRIGGER aaa_u BEFORE UPDATE ON aaa FOR EACH ROW
> BEGIN 
>    :NEW.change_user := 'xyz';  
>    :NEW.change_date := SYSDATE;
> END;
> 

Da gibt es doch bestimmt etwas ähnliches bei MSSQL.

Gruß Jörg

Danke auch für deine "Mühe"! Aber mit Oracle kann ich noch nichts anfangen, bringe mir SQL erst anhand von MSSQL bei.
Member: LianenSchwinger
LianenSchwinger Jun 26, 2012 at 13:30:34 (UTC)
Goto Top
Ging auch nur um die Frage, ob das nicht auf ähnliche Weise geht.

Hier wird der Trigger ausgelöst "bevor" das Update erfolgt und die beiden Spalten auf den User und das Systemdatum gesetzt.

Gruß Jörg
Member: SWuser
SWuser Jun 26, 2012 at 13:56:52 (UTC)
Goto Top
Zitat von @SWuser:
> Zitat von @SlainteMhath:
> ----
> Fürs Update:
>
> > CREATE TRIGGER I_Update_Test_Update 
> > ON dbo.datenbank 
> > AFTER UPDATE
> > AS 
> > BEGIN
> > SET NOCOUNT ON;
> > UPDATE dbo.tabelle t
> > SET t.modified = now(), t.[modified by] = SUSER_SNAME()
> > JOIN inserted i
> > ON t.key = i.key
> > 
>
>
> Für Insert defaults wie folgt setzen:
> "angelegt am" = now()
> "angelegt von" = SUSER_SNAME()


Danke für deine Ausführungen! Kenne "UPDATE" halt nur in der Form mit "SET" und "WHERE".
Habe den Trigger angepasst.
Habe noch zwei Fehler:
1. "'now' is not a recognized built-in function name."
2. "Falsche Syntax in der Nähe von 'JOIN'."

Okay, Fehler 1 (now) habe ich selber lösen können, ber könntest du mir bitte nochmals beim 2. Fehler helfen? Und was passiert bei dem JOIN eigentlich?

Danke und Gruß!
Felix
Member: SlainteMhath
SlainteMhath Jun 26, 2012 at 14:03:57 (UTC)
Goto Top
Okay, Fehler 1 (now) habe ich selber lösen können, ber könntest du mir bitte nochmals beim 2.
Fehler helfen?

Versuchs mal so, hab grad keinen SQL greifbar. Wenns nichts klappt, les mal in der Doku zu UPDATE
[...]
 UPDATE t
   SET t.modified = [...]
 FROM dbo.tabelle t
 JOIN inserted i
   ON t.key = i.key
[...]

Und was passiert bei dem JOIN eigentlich?
In der Tabelle "inserted" steht der Datensatz der upgedated wurde. => Update nur für den Datensatz der dem Key aus dem geupdateten DS entspricht.
Member: MadMax
MadMax Jun 26, 2012 at 22:01:05 (UTC)
Goto Top
Moin,

bei SQL Server heißt das so:
[...]
 UPDATE dbo.tabelle
   SET modified = [...]
 FROM dbo.tabelle t
 JOIN inserted i
   ON t.key = i.key
[...]

Gruß, Mad Max
Member: SWuser
SWuser Jun 27, 2012 at 05:24:51 (UTC)
Goto Top
Super, vielen Dank euch allen für eure Hilfe!
Habe es nun hinbekommen!