![]() |
Datenbank: MSSQL • Version: 2008 • Zugriff über: egal
Trigger-"Übersetzung" (MySQL -> MSSQL)?
Ich habe in MySQL einen BEFORE UPDATE-Trigger geschrieben und versuche nun, diesen auch in MSSQL einzusetzen. Leider ist das nicht so einfach wie erhofft, daher bitte ich um Unterstützung durch einen MSSQL-Experten. Kurz zur Logik: es gibt ein Feld "uid", das durch ein Datenbank-Update zunächst NULL ist. Bei künftigen Updates soll dann Folgendes geschehen:
- Feld ist nicht NULL? Alten Wert behalten, ggf. neuen verwerfen - Feld ist NULL, und es wurde ein Wert übergeben? Dann diesen übernehmen - Feld ist NULL, kein Wert übergeben? Dann einen automatisch ermittelten schreiben In MySQL sieht das bei mir so aus:
SQL-Code:
NEW und OLD gibt es in dieser Form bei MS nicht, da muss man wohl auf die "inserted"- bzw. "deleted"-Tabellen zugreifen. Leider scheitern alle meine bisherigen Versuche entweder an der Syntax oder der Logik oder beidem. Kann mir jemand helfen?
CREATE TRIGGER `Tabelle_KEEP_UID` BEFORE UPDATE ON Tabelle FOR EACH ROW
BEGIN DECLARE uidval varchar(36); IF (OLD.uid IS NOT NULL) THEN SET uidval = OLD.uid; ELSE IF (NEW.uid IS NOT NULL) THEN SET uidval = NEW.uid; ELSE SET uidval = lower(UUID()); END IF; END IF; SET NEW.uid = uidval; END |
AW: Trigger-"Übersetzung" (MySQL -> MSSQL)?
Wenn ich die Doku richtig verstehe, befinden sich die alten Werte in deleted und die neuen in inserted
SQL-Code:
CREATE TRIGGER `Tabelle_KEEP_UID` BEFORE UPDATE ON Tabelle FOR EACH ROW
BEGIN DECLARE @uidval varchar(36); @uidval2 varchar(36); @ID ... select @uidval = deleted.uid from deleted; select @id = inserted.id, @uidval2 = inserted.uid from inserted; if (@uidval is null) then set @uidval = uidval2; end if if (@uidval is null) then set @uidval = lower(UUID()); end if update Tabelle set uid = @uidval where ID = @ID; END |
AW: Trigger-"Übersetzung" (MySQL -> MSSQL)?
Das erscheint schlüssig, probiere ich nach der Mittagspause gleich aus. Danke Dir :thumb:
|
AW: Trigger-"Übersetzung" (MySQL -> MSSQL)?
Nur zur Info: so funktioniert es endlich wie gewünscht (ist jetzt so etwas wie AFTER UPDATE FOR EACH ROW).
SQL-Code:
CREATE TRIGGER Tabelle_KEEP_UID ON Tabelle
FOR UPDATE AS DECLARE trg_cur CURSOR FOR SELECT ID, uid FROM deleted; DECLARE @ID integer; DECLARE @uidval varchar(36); DECLARE @uidval2 varchar(36); OPEN trg_cur; FETCH NEXT FROM trg_cur INTO @ID, @uidval; WHILE @@FETCH_STATUS = 0 begin SELECT @uidval2 = uid FROM inserted WHERE ID = @ID; if (@uidval is null) set @uidval = @uidval2; if (@uidval is null) set @uidval = lower(newid()); update Tabelle set uid = @uidval where ID = @ID; FETCH NEXT FROM trg_cur INTO @ID, @uidval; end; CLOSE trg_cur; DEALLOCATE trg_cur; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz