Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: SQL Noob wagt sich an einen Trigger

  1. #1
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard SQL Noob wagt sich an einen Trigger

    Hy,
    also ich hab jetzt ma ein bisschen in der Deutschen Doku gelesen und hier im Forum so über Trigger, wollte mal wissen ob ich das richtig verstanden habe und hab auch noch ein paar kleine Fragen.

    Also ein Trigger ruft immer eine Funktion auf, die dann handelt.

    Diese Funktion kann Werte alles mit den Werten machen.

    Ein AfterTrigger wartet bis der "Auslöser" fertig ist und ruft dann die Funktion auf

    Ein BeforeTrigger schnapp sich zum Beispiel beim "Instert" von Daten immer gleich die Datei und bearbeitet oder ergänzt sie und schreibt sie erst dann in die Datenbank.


    Doch wie funktioniert die Variablenübergabe in so einer SQL-Funktion?

    Mal angenommen ich möchte:


    Wert1,Wert2 importieren, möchte aber, dass mir die Funktion noch einen Wert3 ausspuckt (Also " (Wert1+Wert2) as Sum) und mit in die Tabelle schreibt in die Zeile Summe. Ich also der Funktion sage, ich rechne hier oben ´was aus dass ich Sum nenne und das sollst du dann in die Zelle "Wert3" eintragen und das jedes mal, wenn eine neue Zeile "Insert" wird.


    Kurz:

    Insert into tabelle1 (
    Wert1,Wert2)
    Values (
    5,2)

    löst einen Trigger aus,dessen Funktion:

    (Wert1+Wert2) as Sum

    Insert into tabelle1 (
    Wert3)
    Values
    (Sum)


    macht.


    Wie übergebe ich die Variablen, also dass er das auch für jede Zeile durchführt und nicht einfach ne neue Zeile anfängt in der Wert1 und Wert2 leer sind und nur Wert3 steht
    oder andersrum ....


    Gruß BoOnOdY


  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Hallo,

    gib dir mal diese Dokumentation:

    http://www.postgresql.org/docs/8.1/i...l-trigger.html

    Du kannst in einer Triggerfunktion auf die Spalten NEW.spaltenname und OLD.spaltenname zugreifen, abhängig davon, was für ein Trigger das ist.

    Bei einem BEFORE Trigger kannst du Werte in NEW.spaltenname schreiben, damit änderst du die Werte, die in die Tabelle geschrieben werden. Bei einem AFTER Trigger kannst du die Werte zwar auch ändern, aber da die Daten schon geschrieben sind, findet das keine Beachtung mehr.

    Was du also suchst, ist eine Zuweisung an NEW.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    (SELECT destination.dialcode
               FROM destination
              WHERE call_test.ausgangsnummer ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1) AS "location"
    INSERT INTO Call_test (destination) VALUES (NEW.[location]);
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    ich will mit dem "As" die variable Location definieren damit ich se einfügen kann, der meint aber die Klammern um das ganze wären Syntax fehler und wenn ich es ohne klammern schreibe ist der Syntaxfehler bei dem "As",


    So wieder zu meiner Frage, wie definiere ich variablen?

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Variable Location definieren? Bahnhof ...

    Du sagst doch schon, das die Funktion einen Datentyp vom Typ "Trigger" zurückliefert.

    Was für Variablen willst du denn definieren ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  5. #5
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Also ich glaube ich muss noch ein NEw ergänzen ...

    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    (SELECT destination.dialcode
               FROM destination
              WHERE NEW.[call_test.ausgangsnummer] ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1) AS "location"
    INSERT INTO Call_test (destination) VALUES (NEW.[location]);
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    So ich will das ich also:

    Var location = (SELECT destination.dialcode
    FROM destination
    WHERE NEW.[call_test.ausgangsnummer] ~~ (destination.dialcode || '%'::text)
    ORDER BY char_length(destination.dialcode) DESC
    LIMIT 1)

    und dann will ich
    diesen Wert location in die Datenbank packen, zusammen mit den anderen Werten, die ja schon in der Auslöseaktion eingetragen werden

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Ja, langsam verstehe ich, was du willst.

    Magst du nicht erst mal in die Dokumentation lesen zu plpgsql? Das mag dir hier niemand abnehmen und das wäre die Grundlage, um einen Trigger schreiben zu können.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  7. #7
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Gut sorry, bin ich schon drann und find da nichts so recht,
    also dazu hab ich auch noch ne Frage:

    Wenn man eine Aktion macht die einen Trigger auslöst, dann hat führt der doch weiter die Aktion aus oder?

    Also wenn ich ihm sage:

    Wenn jemand Daten in die Tabelle einfügt, dann hänge noch eine Zeile drann.

    Dann muss ich der Funktion doch nur sagen, dass sie die Zeile dran hängen soll und das Einfügen der restlichen Datensätze ist ihr egal, oder hab ich das falsch verstanden?

  8. #8
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    (SELECT destination.dialcode
               FROM destination
              WHERE call_test.ausgangsnummer ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1) AS "location"
    INSERT INTO Call_test (destination) VALUES (NEW.[location]);
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    ich will mit dem "As" die variable Location definieren damit ich se einfügen kann, der meint aber die Klammern um das ganze wären Syntax fehler und wenn ich es ohne klammern schreibe ist der Syntaxfehler bei dem "As",
    Da fehlt auch ein ; am Ende vom Select, aber nicht ist noch nicht das ganze Problem. Wenn Du innerhalb einer plpgsql-Function mit dem Result eines Selects arbeiten willst, suchst Du SELECT INTO.
    Lies dazu bitte http://www.postgresql.org/docs/8.1/i...TS-DIAGNOSTICS



    So wieder zu meiner Frage, wie definiere ich variablen?
    Mit DECLARE am Anfang.
    http://www.postgresql.org/docs/8.1/i...larations.html
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Tut mir leid, dass ich mir da so schwer tue

    Aber dann müsste ja es entweder so aussehen

    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    SELECT INTO call_test.destination destination.dialcode
               FROM destination
              WHERE (NEW.[call_test.ausgangsnummer]) ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1 AS "location" ;
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    Da sagt er der Fehler würde bei den INTO liegen, ersetzt das Select into das Insert into?


    oder mit einem Declare:

    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    declare ort alias for (
    SELECT destination.dialcode
               FROM destination
              WHERE (NEW.[call_test.ausgangsnummer]) ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1) ;
    INSERT INTO Call_test (destination) VALUES (ort);
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    oder?

  10. #10
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    Tut mir leid, dass ich mir da so schwer tue

    Aber dann müsste ja es entweder so aussehen

    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    SELECT INTO call_test.destination destination.dialcode
               FROM destination
              WHERE (NEW.[call_test.ausgangsnummer]) ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1 AS "location" ;
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    Da sagt er der Fehler würde bei den INTO liegen, ersetzt das Select into das Insert into?


    oder mit einem Declare:

    Code:
    CREATE OR REPLACE FUNCTION f_destination() RETURNS trigger AS $$
    BEGIN
    declare ort alias for (
    SELECT destination.dialcode
               FROM destination
              WHERE (NEW.[call_test.ausgangsnummer]) ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1) ;
    INSERT INTO Call_test (destination) VALUES (ort);
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    oder?


    ohne groß zu testen:

    CREATE or REPLACE function ... as $$
    DECLARE
    my_var text;
    BEGIN
    ...



    Steht aber auch so in den Bleistiften...


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 09.10.2008, 13:03
  2. [noob] Kontrollstrukturen
    Von pktm im Forum Trigger und Funktionen
    Antworten: 3
    Letzter Beitrag: 10.06.2008, 22:46
  3. NOob Frage
    Von Bubschie im Forum Trigger und Funktionen
    Antworten: 1
    Letzter Beitrag: 04.03.2008, 13:59
  4. Ich hab da mal einen Wunsch...
    Von akretschmer im Forum Smalltalk
    Antworten: 1
    Letzter Beitrag: 11.01.2007, 14:15
  5. Trigger und Rules kommen sich in die Quere
    Von rolf.schaufelberger im Forum Trigger und Funktionen
    Antworten: 0
    Letzter Beitrag: 06.10.2006, 18:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum