Ich muss die Uhr auf meinem SQL Server verwenden, um eine Zeit in eine meiner Tabellen zu schreiben, also dachte ich, ich würde nur GETDATE() verwenden. Das Problem ist, dass ich wegen meines INSTEAD OF-Triggers einen Fehler bekomme. Gibt es eine Möglichkeit, eine Spalte auf GETDATE() zu setzen, wenn eine andere Spalte eine Identitätsspalte ist?Linq to SQL mit INSTEAD OF Trigger und einer Identitätsspalte
Dies ist der Linq-to-SQL:
internal void LogProcessPoint(WorkflowCreated workflowCreated, int processCode)
{
ProcessLoggingRecord processLoggingRecord = new ProcessLoggingRecord()
{
ProcessCode = processCode,
SubId = workflowCreated.SubId,
EventTime = DateTime.Now // I don't care what this is. SQL Server will use GETDATE() instead.
};
this.Database.Add<ProcessLoggingRecord>(processLoggingRecord);
}
Das ist der Tisch. EventTime ist, was ich als GETDATE() haben möchte. Ich möchte nicht, dass die Spalte null ist.
Und hier ist der Auslöser:
ALTER TRIGGER [Master].[ProcessLoggingEventTimeTrigger]
ON [Master].[ProcessLogging]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT [Master].[ProcessLogging] ON;
INSERT INTO ProcessLogging (ProcessLoggingId, ProcessCode, SubId, EventTime, LastModifiedUser)
SELECT ProcessLoggingId, ProcessCode, SubId, GETDATE(), LastModifiedUser FROM inserted
SET IDENTITY_INSERT [Master].[ProcessLogging] OFF;
END
Ohne in alle Variationen immer ich versucht habe, dieser letzte Versuch erzeugt diesen Fehler:
InvalidOperationException Mitglied AutoSync Scheitern . Damit Elemente nach dem Einfügen automatisch synchronisiert werden, muss der Typ entweder eine automatisch generierte Identität oder einen Schlüssel aufweisen, der nach dem Einfügen von der Datenbank nicht geändert wird.
Ich könnte EventTime aus meiner Entität entfernen, aber ich möchte das nicht tun. Wenn es jedoch weg wäre, wäre es NULL während der INSERT und GETDATE() würde verwendet werden.
Gibt es eine Möglichkeit, dass ich einfach GETDATE() in der Spalte EventTime für INSERTs verwenden kann?
Anmerkung: Ich möchte nicht, C# 's DateTime.Now aus zwei Gründen verwenden: 1. Einer dieser Einsätze von SQL Server selbst erzeugt wird (von einem anderen Stored Procedure) 2. Mal unterschiedlich auf verschiedenen Maschinen sein können, und ich möchte genau wissen, wie schnell meine Prozesse ablaufen.
Das hat perfekt funktioniert! Vielen Dank! –