1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SQL Trigger Verständnisproblem

Dieses Thema im Forum "Oracle" wurde erstellt von Kalicronic, 5 Mai 2017.

  1. Kalicronic

    Kalicronic Benutzer

    Hallo Leute,

    Ich habe eine Hausaufgabe in der ich einen Trigger erstellen soll.

    Meine Aufgabe ist es in einer Tabelle "tasks2" das Attribut "status" bei einem Statuswechsel zu überprüfen. Status enthält constrains wie Neu, Gesehen, In Bearbeitung, usw.

    Ein Beispiel:
    Wenn der Status auf "Neu" ist darf er nur auf "Zurückgezogen" oder "Gesehen" gesetzt werden.
    Dies muss also überprüft werden und gegebenenfalls verhindert werden, wenn ein nicht zugelassener Status gewählt wurde.

    Code:
    CREATE OR REPLACE TRIGGER prüfeZustand2 
    BEFORE 
     INSERT OR UPDATE OF status ON tasks2
     WHEN (status )  
    BEGIN 
     
    END; 
    
    Leider verstehe ich einfach nicht so ganz das Prinzip, wie die Bedingungen eingesetzt werden und hänge da nun dran.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich kann Dir es in PostgreSQL zeigen, könnte in Ora ähnlich gehen.

    Code:
    test=# create table kalicronic(id int primary key, status text);
    CREATE TABLE
    
    create or replace function trg_insert() returns trigger as $$
    begin
      if new.status != 'neu' then
      raise exception 'falscher Status';
      return false;
      end if;
      return new;
    end;
    $$language plpgsql;
    
    
    create or replace function trg_update() returns trigger as $$
    begin
      if old.status = 'neu' then
      if new.status != 'neu1' then
      raise exception 'falscher Folgestatus';
      return false;
      end if;
      end if;
      if old.status = 'neu1' then
      if new.status != 'neu2' then
      raise exception 'falscher Folgestatus';
      return false;
      end if;
      end if;
      return new;
    end;
    $$language plpgsql;
    
    
    create trigger trg1 before insert on kalicronic for each row execute procedure trg_insert();
    create trigger trg2 before update on kalicronic for each row execute procedure trg_update();
    
    Und nun testen wir:

    Code:
    test=*# insert into kalicronic values(1,'neu');
    INSERT 0 1
    test=*# insert into kalicronic values(2,'neu');
    INSERT 0 1
    test=*# insert into kalicronic values(3,'neu1');
    FEHLER:  falscher Status
    test=*# update kalicronic set status = 'neu1' where id = 1;
    UPDATE 1
    test=*# update kalicronic set status = 'neu2' where id = 1;
    UPDATE 1
    test=*# update kalicronic set status = 'neu2' where id = 2;
    FEHLER:  falscher Folgestatus
    test=*#
    
     
  3. Kalicronic

    Kalicronic Benutzer

    Also, erstmal vielen dank.
    Da ich mit PL/SQL arbeiten soll und nicht so ein richtigen plan davon habe, wäre es schon sinnvoll mir das auch in dieser Sprache zu erklären.
    Ich verstehe zwar was du dort gemacht hast, aber das umzusetzen in PL/SQL, fällt mir schwer.

    Im folgendem Code verstehe ich die oberen zeilen bis Insert or Update..., aber danach weis ich nicht wie ich es genau einsetzen soll.
    Code:
    CREATE OR REPLACE  TRIGGER prüfeZustand2
    BEFORE
    INSERT OR UPDATE OF status ON tasks2
    
    [REFERENCING OLD AS o NEW AS n]
    [FOR EACH ROW]
    WHEN (condition)
    BEGIN
    --- sql statements
    END;
    
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Joa. Ich hab kein Oraggle. Von daher kann ich da auch keinen da laufenden Krams mir ausdenken... sorry.
     
  5. Kalicronic

    Kalicronic Benutzer

    Das war jetzt kein Vorwurf.
    Ich hab ja nicht ohne Grund in den Oracle Bereich geschrieben und mich ja auch bedankt dafür.
    Und die Frage geht ja auch nicht an dich Persönlich, sondern an alle die hier rumwerkeln. =)

    Also Frage bleibt immer noch offen, wer kann mir da helfen?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Vielleicht fängst einfach an, es selbst hinzubekommen? Doku nehmen, da findet sich bestimmt ein Beispiel (zumindest die PG-Doku hat viele gute Beispiele), da lernt man das auch recht schnell. Ist ja jetzt nicht soooo dolle anspruchsvoll, was da als Aufgabe ansteht, oder?
     
  7. drdimitri

    drdimitri Datenbank-Guru

    Das würde dann in etwa so aussehen:
    Code:
    CREATE OR REPLACE TRIGGER TRG_TASKS
    BEFORE UPDATE ON TASKS
    FOR EACH ROW
    BEGIN
        IF :OLD.STATUS ='Neu' AND :NEW.STATUS NOT IN('Zurückgezogen','Gesehen') THEN
          RAISE_APPLICATION_ERROR(-20001,'Der Status Neu darf nur auf Zurückgezogen oder Gesehen geändert werden');
        END IF;
    END;
    /
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden