1

このトリガーを書き込もうとしていますが、うまくいきません..

私は何をする必要がありますか:

アイテム テーブルからアイテムを削除しますが、同時に、そのアイテムに関連付けられているすべての質問と、その質問に関連付けられているすべての質問の更新を削除します。これらの削除されたレコードは、削除時刻と、それらを削除したオペレーターの ID とともに、アーカイブされたテーブルに保存する必要があります。

アイテムに関連する多くの質問がある場合と同様に、質問にはいくつかの更新が関連付けられている場合があります。

SQLフィドルで作業する方がはるかに簡単なので、すべてのスキーマをSQLフィドルに入れましたが、必要に応じてここに入れます。

SQL フィドルへのリンク:

http://sqlfiddle.com/#!1/1bb25

編集:私はそれをここに置くかもしれないと思った..

Tables:


CREATE TABLE Operator
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Name        VARCHAR(40) NOT NULL
);

CREATE TABLE Item
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Name        VARCHAR(40) NOT NULL
);

CREATE TABLE Faq
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Question    VARCHAR(150) NOT NULL,
    Answer  VARCHAR(2500) NOT NULL,
    ItemID  INTEGER,
    FOREIGN KEY (ItemID) REFERENCES Item(ID)
);

CREATE TABLE Customer
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Name        VARCHAR(20) NOT NULL,
    Email       VARCHAR(20) NOT NULL
);

CREATE TABLE Question
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Problem VARCHAR(1000),
    AskedTime   TIMESTAMP NOT NULL,
    CustomerID  INTEGER NOT NULL,
    ItemID  INTEGER NOT NULL,
    FOREIGN KEY (ItemID) REFERENCES Item(ID),
    FOREIGN KEY (CustomerID) REFERENCES Customer(ID)
);

CREATE TABLE qUpdate
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Message VARCHAR(1000) NOT NULL,
    UpdateTime  TIMESTAMP NOT NULL,
    QuestionID  INTEGER NOT NULL,
    OperatorID INTEGER,
    FOREIGN KEY (OperatorID) REFERENCES Operator(ID),
    FOREIGN KEY (QuestionID) REFERENCES Question(ID)
);


-- Archive Tables

CREATE TABLE DeletedQuestion
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Problem VARCHAR(1000),
    AskedTime   TIMESTAMP NOT NULL,
    CustomerID  INTEGER NOT NULL,
    ItemID  INTEGER NOT NULL
    );

CREATE TABLE DeletedqUpdate
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Message VARCHAR(1000) NOT NULL,
    UpdateTime  TIMESTAMP NOT NULL,
    Question    INTEGER NOT NULL
);

    CREATE TABLE DeletedItem
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Name        VARCHAR(40) NOT NULL,
    OperatorDeleteID INTEGER NOT NULL,
    FOREIGN KEY (OperatorDeleteID) REFERENCES Operator(ID)
);

テスト用のいくつかのサンプル インサート

--Product Inserts
INSERT INTO Item (ID, Name) VALUES (1, 'testitem1');
INSERT INTO Item (ID, Name) VALUES (2, 'testitem2');

--Operator Inserts
INSERT INTO Operator (ID, Name) VALUES (1, 'testname1');
INSERT INTO Operator (ID, Name) VALUES (2, 'testname2');

--Faq Inserts

INSERT INTO Faq (ID, Question, Answer, ItemID) VALUES (1, 'testq1', 'testa1', 1);
INSERT INTO Faq (ID, Question, Answer, ItemID) VALUES (2, 'testq2', 'testa2', 2);

-- Customer Inserts

INSERT INTO Customer (ID, Name, Email) VALUES (1, 'testcust1', 'testemail1');
INSERT INTO Customer (ID, Name, Email) VALUES (2, 'testcust2', 'testemail2');

-- Question Inserts

INSERT INTO Question (ID, Problem, AskedTime, CustomerID, ItemID) VALUES (1,'testproblem1','2012-03-14 09:30',1,1);

INSERT INTO Question (ID, Problem, AskedTime, CustomerID, ItemID) VALUES (2,'testproblem1','2012-07-14 09:30',2,1);

INSERT INTO qUpdate (ID, Message, UpdateTime, OperatorID, QuestionID) VALUES (1, 'test1','2012-05-14 09:30', 1, 1);

INSERT INTO qUpdate (ID, Message, UpdateTime, OperatorID, QuestionID) VALUES (2, 'test2','2012-08-14 09:30', 2, 1);
4

1 に答える 1

1

最初に行うことは、PostgreSQL では、CREATE TRIGGERステートメントがトリガー関数をテーブルの 1 つ以上の操作にバインドすることを理解することです。そのため、関数の構文から始めましょう。トリガー関数はさまざまなスクリプト言語で記述できますが、最も一般的なのは plpgsql です。単純な関数は次のようになります。

CREATE OR REPLACE FUNCTION Question_delete_trig_func()
  RETURNS TRIGGER
  LANGUAGE plpgsql
AS $$
BEGIN
  INSERT INTO DeletedQuestion
    SELECT OLD.*;
  RETURN OLD;
END;
$$;

削除後にこれを実行するには:

CREATE TRIGGER Question_delete_trig
  AFTER DELETE ON Question
  FOR EACH ROW EXECUTE PROCEDURE Question_delete_trig_func();

それはあなたが始めるのに十分なはずです.

削除された行を保存するテーブルごとに、このようなトリガーが必要です。次に、削除を行う方法を決定する必要があります。適切な外部キーを として定義するだけON DELETE CASCADEで、PostgreSQL に任せることができます。

于 2012-04-10T22:30:05.723 に答える