2012-04-10 9 views
1

versucht, diese Trigger zu schreiben, aber ich kann es nicht wirklich funktionieren ..Sie benötigen Hilfe beim Schreiben von SQL-Trigger

Was ich tun muss:

ein Element aus der Elementtabelle löschen, aber gleichzeitig Löschen Sie alle Fragen, die dem Element zugeordnet sind, sowie alle Fragen, die mit dieser Frage verbunden sind. Diese gelöschten Datensätze müssen dann in den archivierten Tabellen mit dem Zeitpunkt des Löschens sowie der ID des Operators, der sie gelöscht hat, gespeichert werden.

Eine Frage kann mehrere Updates zugeordnet haben, da ein Artikel viele Fragen dazu haben kann.

Ich habe das ganze Schema in die SQL-Fiedel gelegt, da es viel einfacher ist, dort zu arbeiten, aber ich werde es hier einfügen, wenn nötig.

Die Verbindung zum SQL Geige:

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

EDIT: Ich dachte, es auch hier ..

setzen könnte
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) 
); 

Einige Proben Einsätze für die Prüfung

--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); 
+0

Dies scheint wie ziemlich einfaches Material für einen plpgsql Trigger. Hast du versucht, einen zu schreiben? Brauchen Sie bestimmte Informationen, bevor Sie dies tun? – kgrittn

+0

Um ehrlich zu sein, bin ich ein kompletter Anfänger in SQL, so dass ich im Allgemeinen Probleme habe. Ich habe unzählige Anleitungen gelesen, und ich finde die grundlegende Syntax schwer und setze verschiedene Werte aus mehreren Tabellen in mehrere Tabellen alle in einem Trigger. Hier ist, was ich nur für Artikel getan habe: http://sqlfiddle.com/#!1/1bb25/3 – Jimmy

Antwort

1

Das erste, was zu tun ist, ist zu verstehen, dass in PostgreSQL ein CREATE TRIGGER-Anweisung bindet einen Trigger Funktion an eine oder mehrere Operationen in einer Tabelle, also beginnen wir mit der Syntax der Funktion. Sie können Triggerfunktionen in verschiedenen Skriptsprachen schreiben, am häufigsten ist jedoch plpgsql. Eine einfache Funktion könnte wie folgt aussehen:

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

Um dies nach Löschungen auszuführen:

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

sein, dass genug sollten Sie den Start.

Sie sollten einen solchen Trigger für jede Tabelle haben, aus der gelöschte Zeilen gespeichert werden sollen. Dann müssen Sie bestimmen, wie Sie die Löschungen passieren. Sie könnten einfach die entsprechenden Fremdschlüssel als ON DELETE CASCADE definieren und dies von PostgreSQL übernehmen lassen.

+0

Vielen Dank für die Hilfe. Muss ich also keinen Trigger machen, der das für jeden Tisch tut? – Jimmy

+0

Es ist nicht der einzige Weg, um das Problem zu lösen, aber ich denke, das wäre der beste Weg, um es zu strukturieren. Beachten Sie auch, dass ich den bestmöglichen Code für das Beispiel verwendet habe. Sie können jedoch beispielsweise die Spalten auflisten, anstatt auf die definierte Spaltenreihenfolge für INSERT und SELECT zu zählen. – kgrittn

Verwandte Themen