SQL: Schreiben Sie einen trigger, der Stationen eine Zeile wird eingefügt, wenn die Person besitzt bereits einen Shop

Ich habe folgende Tabelle namens-Manager:

Store   |   Person
ABC         Ms. Elara
XYZ         Mr. Saros
DEF         Ms. Orion

Ich Lerne über Trigger in PostgreSQL und ich bin versucht zu schreiben, ein trigger für die Tabelle oben, zu überprüfen und zu verbieten, insert-oder update einer Person, die in der Manager-Tabelle ein manager mehr als ein Geschäft.

Mein Ansatz ist, dass in der trigger-Funktion, die Sie auswählen, Tupel aus dem Manager-Tabelle, wo die Person ist gleich der Person, die in dem Tupel, die Sie versuchen, zu legen. Wenn es Tupel in der Manager-Tabelle, wo die Person ist gleich der Person, die in das neue Tupel eingefügt werden, dann wird die Zeile nicht eingefügt werden.

Ich bin nicht sicher, wie Sie Sie in der trigger-Funktion, die ich wählen kann alle Tupel aus Manager, wo die Person ist gleich der Person eingefügt werden. Alle Erkenntnisse sind geschätzt.

2 Antworten

  • Kaja Hussain
    4. Mai 2019

    Warum brauchen Sie einen Auslöser für diese ? U schreiben kann, eine postgres-Funktion prüft die Existenz einer bestimmten person, bevor Sie einfügen.

    So etwas wie dieses,

    Create function check_person_exists(par_person_id int)
    Declare var_exists_flag int;
    Begin
    var_exists_flag =0;p
    
    Select 1 from table where person_id = par_person_id into var_exists_flag;
    If var_exists_flag = 0
    Then
    Insert into ....
    Else 
    Raise notice ' the records already exists';
    Return;
    End
    

    PS: Der obige code einen syntax-Probleme .

  • GMc
    4. Mai 2019

    Sie können auch ein unique-index:

    CREATE UNIQUE INDEX Manager_IDX ON Manager (person);
    

    Dies würde auch funktionieren, wenn Sie versucht, zu aktualisieren, den Namen einer person auf einen Namen, der bereits vorhanden ist. Es hätte auch den Vorteil, dass es schnell zur Abfrage der Tabelle durch den Namen einer person.

    Haben Sie sagen, Sie wollten, erfahren Sie mehr über Auslöser, einen Weg, um zu starten, könnte es sein, über einen trigger (eigentlich 3, eine insert -, update-und delete-trigger) auf den manager, der sorgt automatisch für eine historische Aufzeichnung der änderungen (d.h. ein audit-trail) in einer anderen Tabelle (z.B. manager_audit). Die audit-Tabelle haben die gleiche definition wie in der Manager-Tabelle, aber mit mindestens einer extra Spalte (z.B. opcode), der tracks, was der Einsatz war. Beispiel I für insert D für Delete, U für Update. Sie könnten auch ein timestamp zu erfassen, wenn der Betrieb passiert ist und die anderen Felder (z.B. die Benutzer-id, die hat die änderung etc).

    Having said all das, und für was es Wert ist, erzwingen der Eindeutigkeit auf Dinge wie name vielleicht nicht die beste Idee. Es ist durchaus möglich, dass "Mr. Smith" könnte der name von zwei verschiedenen Menschen, die gerade arbeite in einem großen Unternehmen.