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?
mit was arbeitest Du, PGAdmin oder sowas oder direkt in psql?
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.
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.