verwaiste constraints?

Hallo,
ich habe ein Problem mit bestimmten constraint-triggern:
auf eine Tabellenspalte waren constraints definiert. Nun habe ich diese Tabellenspalte gelöscht. Offensichtlich ist der constraint-trigger nicht gelöscht worden, denn bei einem insert kommt die Fehlermeldung, dass die für einen constraint entsprechende Tabellenspalte fehlt. Definiere ich die Spalte mit dem erwarteten Namen neu, funktionierts wieder.
Mit
alter table xx drop constraint yy
oder mit
alter table xx drop column yy cascade
kann ich den constraint, dessen Name mit der Fehlermeldung ausgegeben wird, nicht löschen.
Wie kann ich diese scheinbar verwaisten constraints löschen?

Vielen Dank für die Hilfe!

eSBe

  1. welche Version von PG?
  2. mit was arbeitest Du, PGAdmin oder sowas oder direkt in psql?
  3. Du kannst eigene Fehler wie gleiche table in untersch. Schemas und flasch gesetzte search_path ausschließen?


    Du kannst mal schauen, ob Du Deinen verwaisten Constraint in pg_constraint findest, und evtl.
    dort löschen. Vorher würde ich aber andere Dinge versuchen:
    (das ist ein Syskatalog, ich weiß nicht, welche Nebenwirkungen das haben kann)
  • es direkt in psql machen
  • table neu erstellen mit create table foo_copy as select * from foo; dann foo löschen und wie erst die Kopie neu erstellen. Dadurch bekommt die table eine neue OID und das Problem sollte behoben sein.

Falls es eine aktuelle Version ist und Du eigene Fehler (search_path ?) ausschließen kannst: versuch es zu reproduzieren und schreib einen Bugreport.


Andreas

Denkfehler: Trigger werden auf eine Tabelle angewandt, nicht auf eine Spalte.

Nun, die Funktion, die vom Trigger aufgerufen wird, kann durchaus eine Spalte ansprechen, aber man kann jederzeit Funktionen schreiben, die Spalten ansprechen, die es nicht gibt.

Du müsstest also deine Triggerfunktion ändern.

er hat, so vermute ich mal, einen CHECK-Constraint auf wohl mehrere Spalten, zumindest habe ich das so interpretiert.

Also sowas:

test=# create table ads (a int, b int, c int check (a+b=5));
CREATE TABLE
test=#
test=#
test=# insert into ads values (2,3,1);
INSERT 0 1
test=# insert into ads values (2,2,1);
ERROR:  new row for relation "ads" violates check constraint "ads_check"
test=#

Aber nix genaues weiß man nicht…