私は6つのテーブルを持っています:
Staff ( StaffID, Name )
Product ( ProductID, Name )
Faq ( FaqID, Question, Answer, ProductID* )
Customer (CustomerID, Name, Email)
Ticket ( TicketID, Problem, Status, Priority, LoggedTime, CustomerID* , ProductID* )
TicketUpdate ( TicketUpdateID, Message, UpdateTime, TicketID* , StaffID* )
回答する質問: 製品 ID を指定して、その製品のレコードを削除します。製品が削除されると、関連するすべての FAQ がデータベースに残る可能性がありますが、ProductID フィールドには null 参照が含まれている必要があります。ただし、製品を削除すると、関連するチケットとその更新も削除されます。完全を期すために、削除されたチケットとその更新は、製品、チケット、および更新に関する履歴データを保持する監査テーブルまたは一連のテーブルにコピーする必要があります。(ヒント: この監査情報を維持し、製品が削除されたときに削除されたチケットとチケットの更新を自動的にコピーするには、追加のテーブルまたはセットまたはテーブルを定義する必要があります)。監査テーブルには、削除を要求したユーザーと削除操作のタイムスタンプを記録する必要があります。
追加のmaintain_auditテーブルを作成しました:
CREATE TABLE maintain_audit(
TicketID INTEGER NOT NULL,
TicketUpdateID INTEGER NOT NULL,
Message VARCHAR(1000),
mdate TIMESTAMP NOT NULL,
muser VARCHAR(128),
PRIMARY KEY (TicketID, TicketUpdateID)
);
さらに、1 つの関数とトリガーを作成しました。
CREATE OR REPLACE FUNCTION maintain_audit()
RETURNS TRIGGER AS $BODY$
BEGIN
INSERT INTO maintain_audit (TicketID,TicketUpdateID,Message,muser,mdate)
(SELECT Ticket.ID,TicketUpdate.ID,Message,user,now() FROM Ticket, TicketUpdate WHERE Ticket.ID=TicketUpdate.TicketID AND Ticket.ProductID = OLD.ID);
RETURN OLD;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER maintain_audit
BEFORE DELETE
ON Product
FOR EACH ROW
EXECUTE PROCEDURE maintain_audit()
DELETE FROM Product WHERE Product.ID=30;
これをすべて実行すると、次のようになります。
ERROR: null value in column "productid" violates not-null constraint
CONTEXT: SQL statement "UPDATE ONLY "public"."faq" SET "productid" = NULL WHERE $1 OPERATOR(pg_catalog.=) "productid""
皆さん、この問題を解決するのを手伝ってくれませんか?