Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Trigger & Funktion (Anfängerfrage)

  1. #1
    hadigari ist offline Neuer Benutzer
    Registriert seit
    18.01.2010
    Beiträge
    5

    Standard Trigger & Funktion (Anfängerfrage)

    Hallo Leute,

    bisher habe ich über externe Aufrufe durch jobs bestimmte Aktualisierungsabfragen durchgeführt.
    Nun muß ich direkt in der Datenbank durch Trigger/Funktionen mein Problem lösen
    Bin in diesem Thema ein newbie
    Aus dem Doku werde ich nicht schlau
    Benötige Codebeispiele - Idealerweise den Code zu meinem Problem

    Danke im voraus


    Tabelle "macs"

    CREATE TABLE macs (
    mac macaddr NOT NULL,
    time_first timestamp without time zone,
    time_last timestamp without time zone,
    scandatum date[],
    CONSTRAINT macs_pkey PRIMARY KEY (mac)
    )
    WITHOUT OIDS;

    View qry_macs, das aus einem anderen Tabelle Werte zusammenfasst

    CREATE OR REPLACE VIEW qry_macs AS
    SELECT node.mac, min(node.time_first) AS time_first
    FROM node
    GROUP BY node.mac;

    Mit folgendem Code ermittle ich die neue Adressen aus dem View qry_macs und ergänze die Macs in die Tabelle macs.

    insert into macs (mac,time_first)
    SELECT node.mac, min(node.time_first)
    FROM node LEFT JOIN macs ON node.mac = macs.mac
    WHERE macs.mac Is Null
    group by node.mac;

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von hadigari Beitrag anzeigen
    Hallo Leute,

    bisher habe ich über externe Aufrufe durch jobs bestimmte Aktualisierungsabfragen durchgeführt.
    Nun muß ich direkt in der Datenbank durch Trigger/Funktionen mein Problem lösen
    Bin in diesem Thema ein newbie
    Aus dem Doku werde ich nicht schlau
    Benötige Codebeispiele - Idealerweise den Code zu meinem Problem

    Danke im voraus


    Tabelle "macs"

    CREATE TABLE macs (
    mac macaddr NOT NULL,
    time_first timestamp without time zone,
    time_last timestamp without time zone,
    scandatum date[],
    CONSTRAINT macs_pkey PRIMARY KEY (mac)
    )
    WITHOUT OIDS;

    View qry_macs, das aus einem anderen Tabelle Werte zusammenfasst

    CREATE OR REPLACE VIEW qry_macs AS
    SELECT node.mac, min(node.time_first) AS time_first
    FROM node
    GROUP BY node.mac;

    Mit folgendem Code ermittle ich die neue Adressen aus dem View qry_macs und ergänze die Macs in die Tabelle macs.

    insert into macs (mac,time_first)
    SELECT node.mac, min(node.time_first)
    FROM node LEFT JOIN macs ON node.mac = macs.mac
    WHERE macs.mac Is Null
    group by node.mac;

    Nun, den SQL-Code kennst Du ja schon. Daraus machst Du eine Funktion. Diese soll immer dann laufen, wenn in der Tabelle 'node' ein neuer Eintrag reinkommt, richtig? Also brauchst einen AFTER INSERT - Trigger für diese Tabelle.

    Was genau hast Du versucht, was ist passiert? Fehlermeldungen?


    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

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

    Standard

    Ich glaube, da werden noch LISTEN und NOTIFY gesucht *grübel*

    Aber für Code Beispiele stelle ich normalerweise eine Rechnung ;-)
    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

  4. #4
    hadigari ist offline Neuer Benutzer
    Registriert seit
    18.01.2010
    Beiträge
    5

    Standard

    Hallo akretschmer,
    genau das ist mein problem.
    Ich möchte ein after Trigger erstellen, der eine Funktion aufruft.
    Der Funktion soll dann den 3. Code ausführen (Also neue Macs in die Tabelle macs hinzufügen).
    Ich habe pgadmin III Version 1.10.0 installiert um die Datenbank zu administrieren.


    Folgende Funktion habe ich geschrieben:
    CREATE OR REPLACE FUNCTION new_mac()
    RETURNS void AS
    'insert into macs (mac,time_first)
    SELECT node.mac, min(node.time_first)
    FROM node LEFT JOIN macs ON node.mac = macs.mac
    WHERE macs.mac Is Null
    group by node.mac;'
    LANGUAGE 'sql' VOLATILE;

    Die Funktion kann ich per select aufrufen : select new_mac();

    Folgende Trigger funktioniert nicht:

    CREATE TRIGGER new_mac AFTER INSERT ON node
    FOR EACH ROW EXECUTE PROCEDURE new_mac();

    FEHLER: Funktion new_mac muss Typ »trigger« zurückgeben

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von hadigari Beitrag anzeigen
    Hallo akretschmer,
    genau das ist mein problem.
    Ich möchte ein after Trigger erstellen, der eine Funktion aufruft.
    Der Funktion soll dann den 3. Code ausführen (Also neue Macs in die Tabelle macs hinzufügen).
    Ich habe pgadmin III Version 1.10.0 installiert um die Datenbank zu administrieren.


    Folgende Funktion habe ich geschrieben:
    CREATE OR REPLACE FUNCTION new_mac()
    RETURNS void AS
    'insert into macs (mac,time_first)
    SELECT node.mac, min(node.time_first)
    FROM node LEFT JOIN macs ON node.mac = macs.mac
    WHERE macs.mac Is Null
    group by node.mac;'
    LANGUAGE 'sql' VOLATILE;

    Die Funktion kann ich per select aufrufen : select new_mac();

    Folgende Trigger funktioniert nicht:

    CREATE TRIGGER new_mac AFTER INSERT ON node
    FOR EACH ROW EXECUTE PROCEDURE new_mac();

    FEHLER: Funktion new_mac muss Typ »trigger« zurückgeben

    Ja, ist doch eindeutig, oder?

    Deine Funktion gibt VOID zurück, ein TRIGGER muß aber TRIGGER liefern. Das war jetzt einfach, gell?

    Das Handbuch hat übrigens Beispiele für Triggerfunktionen. Dort siehst Du dann auch die Verwendung von NEW. Lesebefehl!

    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

  6. #6
    hadigari ist offline Neuer Benutzer
    Registriert seit
    18.01.2010
    Beiträge
    5

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Ja, ist doch eindeutig, oder?

    Deine Funktion gibt VOID zurück, ein TRIGGER muß aber TRIGGER liefern. Das war jetzt einfach, gell?

    Das Handbuch hat übrigens Beispiele für Triggerfunktionen. Dort siehst Du dann auch die Verwendung von NEW. Lesebefehl!

    Andreas
    Wenn ich den Return Wert durch TRIGGER ändere, dann kommt
    FEHLER: SQL-Funktionen können keinen Rückgabetyp »"trigger"« haben

    Was muß ich denn als Language verwenden ?

  7. #7
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von hadigari Beitrag anzeigen
    Wenn ich den Return Wert durch TRIGGER ändere, dann kommt
    FEHLER: SQL-Funktionen können keinen Rückgabetyp »"trigger"« haben

    Was muß ich denn als Language verwenden ?
    Ah ja, kann sein. Nehme pl/pgsql.

    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

  8. #8
    hadigari ist offline Neuer Benutzer
    Registriert seit
    18.01.2010
    Beiträge
    5

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Ah ja, kann sein. Nehme pl/pgsql.

    Andreas
    Hmmm ?

    CREATE OR REPLACE FUNCTION new_mac()
    RETURNS TRIGGER AS
    'insert into macs (mac,time_first)
    SELECT node.mac, min(node.time_first)
    FROM node LEFT JOIN macs ON node.mac = macs.mac
    WHERE macs.mac Is Null
    group by node.mac;'
    LANGUAGE 'pl/pgsql' VOLATILE;

    FEHLER: Sprache »pl/pgsql« existiert nicht

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

    Standard

    Zitat Zitat von hadigari Beitrag anzeigen
    FEHLER: Sprache »pl/pgsql« existiert nicht
    akretschmer hat dich doch schon zum Lesen geschickt, oder? ;-)
    Such mal nach "CREATE LANGUAGE".
    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

  10. #10
    hadigari ist offline Neuer Benutzer
    Registriert seit
    18.01.2010
    Beiträge
    5

    Standard

    Ich denke, ich habs hingekriegt
    Vielen dank für die Unterstützung
    Code:
    CREATE TRIGGER tr_new_mac
      AFTER INSERT
      ON node
      FOR EACH ROW
      EXECUTE PROCEDURE new_mac();
    Code:
    CREATE OR REPLACE FUNCTION new_mac()
      RETURNS "trigger" AS
    'insert into macs (mac,time_first)
    SELECT node.mac, min(node.time_first)
    FROM node LEFT JOIN macs ON node.mac = macs.mac
    WHERE macs.mac Is Null
    group by node.mac;'
      LANGUAGE 'plpgsql' VOLATILE;

Seite 1 von 2 12 LetzteLetzte

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