SQL Trigger Verständnisproblem

Kalicronic

Benutzer
Beiträge
7
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.
 
Werbung:
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=*#
 
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;
 
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?
 
Also Frage bleibt immer noch offen, wer kann mir da helfen?

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?
 
Werbung:
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;
/
 
Zurück
Oben