postgresql / views / rules



  • hallo,
    vielleicht kann mir ja hier wer helfen.

    ich habe zwei tabellen pers(id,name) und kund(kid,wert) und eine view v_kund(id,name,kid,wert).

    bsp.:

    SELECT * FROM v_kund;
    
    id | name | kid | wert
    ----------------------
     1 | rudi |  1  | xyz
     2 | franz|  2  | abc
    

    um in diese VIEW INSERTs, UPDATEs und DELETEs machen zu können, habe ich dementsprechend RULES definiert (DO INSTEAD).
    INSERT und UPDATE funktionieren wunderbar, bei DELETE hab ich probleme.

    CREATE RULE v_kund_delete AS 
    ON DELETE TO v_kund DO INSTEAD 
    (
      DELETE FROM pers WHERE (pers.id = old.kid ); 
      DELETE FROM kund WHERE (kund.kid = old.kid );  
    );
    

    es wird immer nur aus einer der beiden tabellen gelöscht, je nach dem welches der DELETEs ich als erstes angebe (in diesem fall werden nur die daten aus pers gelöscht).

    irgendwelche ideen?

    oder weiss jemand ein gutes postgresql forum?

    mfg



  • Müsste es nicht heissen:

    CREATE RULE v_kund_delete AS
    ON DELETE TO v_kund DO INSTEAD
    (
      DELETE FROM pers WHERE (pers.id = old.[b][u]id[/u][/b] );
      DELETE FROM kund WHERE (kund.kid = old.kid );  
    );
    


  • nein, glaub nicht.
    die beiden tabellen haben ja die selbe id.

    die insert rule schaut so aus:

    CREATE v_kund_insert AS
    ON INSERT TO v_kund DO INSTEAD
    (
      INSERT INTO pers (id, name ) VALUES (nextval('pers_id_seq'::text ), new.name ); 
     INSERT INTO kund (kid, wert ) VALUES (currval('pers_id_seq'::text ), new.wert );  
    );
    

    es wird in der kund tabelle also die selbe id eingefügt wie in der pers tabelle.

    update schaut so aus:

    CREATE v_kund_update AS
    ON UPDATE TO v_kund DO INSTEAD 
    (
      UPDATE pers SET name = new.name WHERE (pers.id = old.kid ); 
      UPDATE kund SET wert = new.wert WHERE (kund.kid = old.kid );  
    );
    

    mit dem aufruf:

    UPDATE v_kund SET name='hansi' WHERE kid = 5;
    

    daher auch bei beiden updates old.kid

    nur das delete haut irgendwie nicht so hin wie es soll....warum auch immer

    mfg


Anmelden zum Antworten