繁体   English   中英

需要帮助编写 SQL 触发器

[英]Need Help Writing SQL Trigger

一直在尝试编写此触发器,但我无法真正解决它..

我需要做什么:

从项目表中删除一个项目,但同时删除与该项目相关的任何问题以及与该问题相关的任何问题更新。 然后需要将这些删除的记录存储在存档表中,其中包含删除时间以及删除它们的操作员的 ID。

一个问题可能有几个与之相关的更新,因为一个项目可能有许多与之相关的问题。

我已将所有架构放在 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);

首先要了解PostgreSQL中, CREATE TRIGGER语句将触发器function绑定到表上的一个或多个操作,所以让我们从function的语法开始。你可以用各种脚本语言编写触发器函数,但是最常见的是 plpgsql。 一个简单的 function 可能如下所示:

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 为您完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM