Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Trigger-"Übersetzung" (MySQL -> MSSQL)? (https://www.delphipraxis.net/194630-trigger-uebersetzung-mysql-mssql.html)

DeddyH 14. Dez 2017 11:54

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:
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
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?

mkinzler 14. Dez 2017 12:25

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

DeddyH 14. Dez 2017 12:31

AW: Trigger-"Übersetzung" (MySQL -> MSSQL)?
 
Das erscheint schlüssig, probiere ich nach der Mittagspause gleich aus. Danke Dir :thumb:

DeddyH 18. Dez 2017 14:54

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