[Oracle] Trigger

Pherseus

Erfahrenes Mitglied
Hi ich versuche mit gerade an Triggern. Hab folgendes Script geschrieben:

Code:
 CREATE OR REPLACE TRIGGER tri_username
 BEFORE INSERT ON users
 FOR EACH ROW
 DECLARE 
 	count int;
 BEGIN
    count := 0;
    SELECT COUNT(*) INTO count FROM users WHERE username=:new.username;
    IF(count <> 0) THEN
 	   raise_application_error(-200001,'Name schon vorhanden');
    END IF;
 END;

Dabei kommt dann aber immer: Warnung: Trigger wurde mit Kompilierungsfehlern erstellt.

Jetzt hab ich gelesen da mit show errors, die fehler angezeigt werden können.
Allerdings wenn ich das dann so hier schreibe:

Code:
 CREATE OR REPLACE TRIGGER tri_username
 BEFORE INSERT ON users
 FOR EACH ROW
 DECLARE 
 	count int;
 BEGIN
    count := 0;
    SELECT COUNT(*) INTO count FROM users WHERE username=:new.username;
    IF(count <> 0) THEN
 	   raise_application_error(-200001,'Name schon vorhanden');
    END IF;
 END;
 
 
 show errors

Wird der fehler trotzdem nicht angezeigt. Was muss ich machen damit er mir einen Fehler anzeigt. Und vielleicht kann mir ja auch jemand sagen was an dem Trigger falsch ist :D
 
Hi

wenn ich mich nicht irre,

solltest du nur new.username
statt :new.username
verwenden.

Bin mir auch nicht ganz sicher, ob du den Select auf users beim Insert auf die selbe Tabelle machen kannst.

vop
 
Hallo!

Hi ich versuche mit gerade an Triggern. Hab folgendes Script geschrieben:

Ich hoffe doch sehr, dass das nur ein kleines Übungsbeispiel war das so nicht in einem Produktivsystem zu finden ist...
für soetwas wie Eindeutigkeit nimmt man doch keinen Trigger sondern eher einen Unique Constraint ...

gruss Tom
 
count ist ein reserviertes Wort und kann nicht als Variablenname verwendet werden. Mit SQL>show errors zeigt dir SQL*Plus auch die Fehlermeldung, siehe hier:

Code:
SQL> create trigger t1
  2  before insert on users
  3  for each
  4  row
  5  declare count int;
  6  begin
  7  count := 0;
  8  select count(*) into count from users where username = :new.username;     
  9  if(count <> 0) then
 10   raise_application_error(-200001,'Name schon vorhanden');
 11   end if;
 12   end;
 13  /

Warning: Trigger created with compilation errors.

SQL> show errors
Errors for TRIGGER T1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1      PL/SQL: Statement ignored
5/4      PLS-00204: function or pseudo-column 'COUNT' may be used inside
         a SQL statement only

SQL>

Also einfach count mit einem gültigen Namen ersetzen und der Trigger funktioniert. Allerdings muß ich meinem Vorposter beipflichten: für sowas sind nun Trigger überhaupt nicht gedacht. Dafür gibt es unique contraints (z.B. primary key), die sowas zum einen wesentlich effizienter lösen (Verwendung von Indizes) und zum anderen auch das Design nicht unnötig verkomplizieren. Trigger gehören von Amts wegen nur dort eingesetzt, wo sie wirklich notwendig sind (u.a. wegen Performance, Fehlersuche, etc.).
 
Das ganze war nur eine Übung für eine Klausur und da wir mit Oracle gerade erst anfangen, wusste ich nicht das es für sowas nicht verwendet wird. Naja danke für die hinweise :D
 

Neue Beiträge

Zurück