Benutzer mit den meisten Antworten
Automatisches Datum (SQL Server management Studio 2008 R2)

Frage
-
Hallo, also folgendes ich habe eine tabell mit den Spalten "Firm_ID, Name, Created_Date, Flag_Deleted" mit folgenden Data Type "int, nvarchar(100), datetime, bit".
So nun möchte ich das sobald eine zahl in der Firm_ID steht automatisch das aktuelle Datum eingetragen wird, da habe ich mir gedacht das ich das ganze über eine Trigger funktion schalte.
Und hier liegt nun auch mein Problem meine Syntax für den Trigger sieht wie folgt aus:"create trigger Datum
insert into dbo.Firm (Created_Date)
values (GETDATE)
where Firm_ID = 'text'
GO"Könnte mir bitte jemand sagen wie ich das ganze umschreiben muss damit es funktioniert ?
Danke schon mal an jede Hilfe (:
Antworten
-
Developer_93 wrote:
Hallo, also folgendes ich habe eine tabell mit den Spalten "Firm_ID,
Name, Created_Date, Flag_Deleted" mit folgenden Data Type "int,
nvarchar(100), datetime, bit".
So nun möchte ich das sobald eine zahl in der Firm_ID steht automatisch
das aktuelle Datum eingetragen wird, da habe ich mir gedacht das ich das
ganze über eine Trigger funktion schalte. Und hier liegt nun auch mein
Problem meine Syntax für den Trigger sieht wie folgt aus:
"create trigger Datum
insert into dbo.Firm (Created_Date)
values (GETDATE)
where Firm_ID = 'text'
GO"
Könnte mir bitte jemand sagen wie ich das ganze umschreiben muss damit es
funktioniert ?
Danke schon mal an jede Hilfe (:Eine Möglichkeit besteht, das ohne Trigger zu machen, indem Du auf dem Feld einen Defualt festlegst, der immer zum Zug kommt, wenn ein Datensatz hinzugefügt wird ohne das Feld anzugeben.
Versuch' mal folgendes:
ALTER Table dbo.Firm ADD CONSTRAINT DF_Firm_Created_Date DEFAULT GETDATE() FOR Created_Date
Dann musst Du überhaupt nichts mehr programmieren.
Wenn Du es unbedingt mit einem Trigger lösen willst:
CREATE TRIGGER Insert_Firm_set_Created_Date ON dbo.Firm AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE dbo.Firm SET Created_Date = GETDATE() FROM dbo.Firm T INNER JOIN INSERTED I ON T.PKColumn = I.PKColumn END
Um die Records zu erhalten, die eingefügt wurden, gibt es die konzeptionelle Tabelle INSERTED. Diese enthält alle neu hinzugefügten Datensätze (es kann ja mehr als einer hinzugefügt worden sein) mit allen Feldern Feldern, die da drin sind. Diese Tabelle kannst Du dann mit der realen Tabelle verjoinen und erhälst dann ein Resultset, welches Du updaten kannst.
HTH
Henry- Als Antwort vorgeschlagen Falk Krahl Freitag, 9. September 2011 19:07
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 22. September 2011 15:37
Alle Antworten
-
Wenn es denn unbedingt ein Trigger sein muß:
create trigger tr_createDate
ON DeineTabelle
AFTER INSERT, UPDATE
AS
IF UPDATE (Firm_ID) and is_numeric(inserted.Firm_ID) = 1
BEGIN
update DeineTabelle set Created_Date = getdate()
ENDIch würde es aber lieber mit einem Default Value für die Created_Date-Spalte erledigen oder gleich das Datum beim Einfügen bzw. aktualisieren der Tabelle mit schreiben.
Trigger sind nicht unbedingt Performance-Wunder.
-
Developer_93 wrote:
Hallo, also folgendes ich habe eine tabell mit den Spalten "Firm_ID,
Name, Created_Date, Flag_Deleted" mit folgenden Data Type "int,
nvarchar(100), datetime, bit".
So nun möchte ich das sobald eine zahl in der Firm_ID steht automatisch
das aktuelle Datum eingetragen wird, da habe ich mir gedacht das ich das
ganze über eine Trigger funktion schalte. Und hier liegt nun auch mein
Problem meine Syntax für den Trigger sieht wie folgt aus:
"create trigger Datum
insert into dbo.Firm (Created_Date)
values (GETDATE)
where Firm_ID = 'text'
GO"
Könnte mir bitte jemand sagen wie ich das ganze umschreiben muss damit es
funktioniert ?
Danke schon mal an jede Hilfe (:Eine Möglichkeit besteht, das ohne Trigger zu machen, indem Du auf dem Feld einen Defualt festlegst, der immer zum Zug kommt, wenn ein Datensatz hinzugefügt wird ohne das Feld anzugeben.
Versuch' mal folgendes:
ALTER Table dbo.Firm ADD CONSTRAINT DF_Firm_Created_Date DEFAULT GETDATE() FOR Created_Date
Dann musst Du überhaupt nichts mehr programmieren.
Wenn Du es unbedingt mit einem Trigger lösen willst:
CREATE TRIGGER Insert_Firm_set_Created_Date ON dbo.Firm AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE dbo.Firm SET Created_Date = GETDATE() FROM dbo.Firm T INNER JOIN INSERTED I ON T.PKColumn = I.PKColumn END
Um die Records zu erhalten, die eingefügt wurden, gibt es die konzeptionelle Tabelle INSERTED. Diese enthält alle neu hinzugefügten Datensätze (es kann ja mehr als einer hinzugefügt worden sein) mit allen Feldern Feldern, die da drin sind. Diese Tabelle kannst Du dann mit der realen Tabelle verjoinen und erhälst dann ein Resultset, welches Du updaten kannst.
HTH
Henry- Als Antwort vorgeschlagen Falk Krahl Freitag, 9. September 2011 19:07
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 22. September 2011 15:37
-
Hallo Christa
Christa Kurschat wrote:
create trigger tr_createDate
ON DeineTabelle
AFTER INSERT, UPDATE
AS
IF UPDATE (Firm_ID) and is_numeric(inserted.Firm_ID) = 1
BEGIN
update DeineTabelle set Created_Date = getdate()
ENDIrgendwie fehlt da noch die Where Bedingung im Update
Ich schenke Dir folgendes:
WHERE Firm_ID = inserted.Firm_ID
Gruss
Henry -
Also erstmal vielen dank an die schnellen guten Antworten.
Ich habe das Problem jetzt mit einem Trigger gelöst und zwar so :"CREATE TRIGGER [dbo].[Datum]
ON [dbo].[Firm]
AFTER INSERT
AS
BEGIN
UPDATE Firm set Created_Date=GETDATE()
where Firm_ID=(SELECT Firm_ID from inserted)
END;"Desweitern habe ich die Firm_ID also den Primary_Key auf increment gesetzt so das dieser immer automatisch eingetragen wird.
Dann habe ich noch bei der Column "Name" einen Unique Key gesetzt doch dieser funktioniert leider nicht, da ich trotzedem zwei identische Firmen eintragen kann in der Column "Name".
Also woran liegt des ?
-
@henry, danke, Geschenke nehme ich immer gern ;-))
@Developer93
Ich denke, Du hast Dich ein bißchen verrannt.
Wenn Du einen Identity für die Firm_ID hast, dann brauchst Du keinen Trigger, sondern solltest den Default-Wert nutzen. Henry hat Dir ja ein Beispiel eingestellt.
Der Trigger, so wie Du ihn gebaut hast, funktioniert genau für das Einfügen eines Datensatzes.
Trigger feuern nicht pro Datensatz sondern pro Statement. Wenn Du mehr ale einen Datensatz einfügst, bekommst Du einen Fehler, weil (select Firm_ID from inserted) mehr als einen Satz bringen würde.Entweder nimmst Du "where Firm_ID in (SELECT Firm_ID from inserted)" oder verwendest einen join:
UPDATE f
set f.Created_Date=GETDATE()
from Firm f inne rjoin inserted i on
f.Firm_ID=i.Firm_ID -
@Chritsa Kurschat
Danke für den Tipp :)
Hab des Problem aber schon hinbekommen Unique Key und alles andere in der Tabelle funktioniert jetzt.
Des Problem war das ich beim Unique Key ganz vergessen hab zu speicher damit die Änderung auch wirksam wird. xD
Aber da jetzt alles funktioniert bin ich zufrieden.
Danke an alle die geantwortet haben war wirklich sehr hilfreich.
-
Ich bin nicht sicher, ob der Trigger so richtig ist.
Was Du machst, ist ein Sub-Select auf Inserted und erwartest, dass da immer genau ein Datensatz kommt. Das muss aber nicht sein. Es können durchaus mehrere Datensätze in INSERTED drin sein, dann nämlich, wenn Du ein Multirow Insert machst, also z.B. sowas
INSERT INTO Firm([Name]) SELECT [Name] FROM ImportTabelle
Damit könntest Du z.B. Firmen importieren, alle auf einen Schlag, mit einem einzigen Statement. Dieses wird dann aber "krachen", weil Dein SubSelect nun nicht einen einzelnen Wert, sondern ein ResultSet zurückliefert. Wenn Du schon keinen Join machen willst, dann musst Du ein "IN(<SubSelect>)" statt eines "=(<SubSelect>)" verwenden.
Ich rate Dir allerdings wirklich an, statt des Triggers den DEFAULT auf GETDATE zu setzen. Das ist auch einfacher mit der Maintenance.
Gruss
Henry
- Bearbeitet Henry Habermacher Donnerstag, 8. September 2011 11:14