# [Oracle] Trigger



## Pherseus (15. Dezember 2005)

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


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


```
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


----------



## vop (15. Dezember 2005)

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


----------



## Thomas Darimont (18. Dezember 2005)

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


----------



## ishino (19. Dezember 2005)

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


```
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.).


----------



## Pherseus (19. Dezember 2005)

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


----------

