Hallo,
ich habe Probleme mit einer BigSerial-Spalte in zusammenhang mit partitionierten Tabellen und Triggern:
Ich habe einen Trigger geschrieben der die Daten, die in eine Parent-Tabelle eingefügt werden sollen, abfängt und stattdessen in eine Child-Tabelle schreibt.
CREATE TRIGGER T_PRODUCT_TRIGGER BEFORE INSERT ON "T_PRODUCT" FOR EACH ROW EXECUTE PROCEDURE trigger_insert_into_T_PRODUCT();
Das Problem ist, dass ich den Trigger nicht ‘INSTEAD OF’ ausführen lassen kann. -->; Der Datensatz wird nach dem Trigger-Insert in die Child-Tabelle nochmals in die Parent-Tabelle geschrieben.
Kann ich das irgendwie abfangen/unterbinden bzw. den Trigger irgendwie zu einem ‘INSTEAD OF’ machen?
Ich habe es schon mit Rules versucht… das scheiterte auch ziemlich schnell, da man dort nicht mit Variablen hantieren kann.
Hier meine Funktionen:
CREATE OR REPLACE FUNCTION _MaxPartitionSize() RETURNS bigint AS $$
BEGIN
RETURN 100000;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION trigger_insert_into_T_PRODUCT() RETURNS TRIGGER AS '
DECLARE
TablePostfixInt bigint;
TableName text;
IndexName text;
BEGIN
TablePostfixInt := CURRVAL(pg_get_serial_sequence(''"T_PRODUCT"'',''ProductSerialId'')) / _MaxPartitionSize();
TableName := ''T_PRODUCT_'' || TablePostfixInt;
IndexName := TableName || ''_INDEX'';
IF EXISTS (SELECT relname FROM pg_class WHERE relname = TableName) THEN
EXECUTE ''INSERT INTO "'' || TableName || ''" ("ProductArticleId", "ProductId", "ProductSerialnumber", "ProductCode", "ProductText", "TimeBegin", "TimeEnd") VALUES ('' || New."ProductArticleId" || '','' || New."ProductId" || '','''''' || New."ProductSerialnumber" || '''''','''''' || New."ProductCode" || '''''','''''' || New."ProductText" || '''''','''''' || New."TimeBegin" || '''''','''''' || New."TimeEnd" || '''''')'';
ELSE
EXECUTE ''CREATE TABLE "'' || TableName || ''" () INHERITS ("T_PRODUCT") '';
EXECUTE ''ALTER TABLE "'' || TableName || ''" OWNER TO postgres'';
EXECUTE ''ALTER TABLE "'' || TableName || ''" ADD CONSTRAINT "'' || TableName || ''_Key7" PRIMARY KEY ("ProductId","ProductArticleId")'';
EXECUTE ''ALTER TABLE "'' || TableName || ''" ADD CONSTRAINT "'' || TableName || ''_Was" FOREIGN KEY ("ProductArticleId") REFERENCES "T_ARTICLE" ("ArticleId") ON DELETE NO ACTION ON UPDATE NO ACTION'';
EXECUTE ''CREATE INDEX "'' || IndexName || ''" ON "'' || TableName || ''" ("ProductId","ProductArticleId","TimeBegin","TimeEnd","ProductSerialId") '';
EXECUTE ''INSERT INTO "'' || TableName || ''" ("ProductArticleId", "ProductId", "ProductSerialnumber", "ProductCode", "ProductText", "TimeBegin", "TimeEnd") VALUES ('' || New."ProductArticleId" || '','' || New."ProductId" || '','''''' || New."ProductSerialnumber" || '''''','''''' || New."ProductCode" || '''''','''''' || New."ProductText" || '''''','''''' || New."TimeBegin" || '''''','''''' || New."TimeEnd" || '''''')'';
END IF;
RETURN NULL;
END; ' LANGUAGE plpgsql;
ALTER FUNCTION trigger_insert_into_T_PRODUCT() OWNER TO postgres;
ich wäre für jede Hilfe sehr dankbar!