2016-08-13 3 views
-1

implementieren Ich habe diese Tabelle InspectionsReview genannt:Fehlerbehebung zu SQL Server-Trigger

CREATE TABLE InspectionsReview 
(
    ID int NOT NULL AUTO_INCREMENT, 
    InspectionItemId int, 
    SiteId int, 
    ObjectId int, 
    DateReview DATETIME, 
    PRIMARY KEY (ID) 
); 

Hier, wie die Tabelle aussieht:

+----+------------------+--------+-----------+--------------+ 
| ID | InspectionItemId | SiteId | ObjectId | DateReview | 
+----+------------------+--------+-----------+--------------+ 
| 1 | 3    | 3  | 3045  | 20-05-2016 | 
| 2 | 5    | 45 | 3025  | 01-03-2016 | 
| 3 | 4    | 63 | 3098  | 05-05-2016 | 
| 4 | 5    | 5  | 3041  | 03-04-2016 | 
| 5 | 3    | 97 | 3092  | 22-02-2016 | 
| 6 | 1    | 22 | 3086  | 24-11-2016 | 
| 7 | 9    | 24 | 3085  | 15-12-2016 | 
+----+------------------+--------+-----------+--------------+ 

I Trigger schreiben müssen, die die neue Zeile überprüft, bevor sie eingeführt wird, Die Tabelle, wenn die Tabelle bereits eine Zeile mit den Spaltenwerten 'ObjectId' und 'DateReview' hat, die den Spaltenwerten der Zeile entsprechen, die eingefügt werden müssen. Wenn es gleich ist, muss ich die ID der beendeten Zeile abrufen und einfügen Triggervariable duplicate.

Wenn beispielsweise neue Zeile, die eingefügt werden muss, ist:

INSERT INTO InspectionsReview (InspectionItemId, SiteId, ObjectId, DateReview)] 
VALUES (4, 63, 3098, '05-05-2016'); 

Das Duplikat Variable in SQL Server Trigger muss 3.

gleich sein, da die Zeile in Tabelle InspectionsReview ID = waren 3 hat ObjectId und DateReview Werte gleich wie in der neuen Zeile, die eingefügt werden müssen. Wie kann ich das umsetzen?

+0

was ist der Datentyp der Spalte id? Ist es Identität? – TheGameiswar

+0

dieser Teil ist auch nicht klar .. "Ich möchte die ID der Zeile zu bekommen und es zu auslösen Variable aufgerufen genannt duplizieren" können Sie bitte Probe erwarteten Ausgang zeigen – TheGameiswar

+0

Für diesen Teil "Ich muss Trigger schreiben, die vor neuen prüft Zeile in den Inspection Review eingefügt "und dies", wenn es so ist, möchte ich die ID der Zeile zu erhalten und es zu auslösen Variable namens "Duplikat". Wenn Sie die Überprüfung ** vor ** Einfügen durchführen, wie können Sie dann die ID in eine andere Tabelle einfügen? – DVT

Antwort

0

Mit der zusätzlichen Annahme, dass Sie alle Duplikate in eine andere Tabelle protokollieren möchten, wäre meine Lösung, einen AFTER-Trigger zu erstellen, der nach dem Duplikat sucht und es in Ihre Logging-Tabelle einfügt. Natürlich, ob dies die Lösung ist, hängt davon ab, ob meine zusätzliche Annahme gültig ist.

Hier ist meine Logging-Tabelle.

CREATE TABLE dbo.InspectionsReviewLog (
    ID int 
    , ObjectID int 
    , DateReview DATETIME 
    , duplicate int 
); 

ist hier der Auslöser (ziemlich einfach mit der zusätzlichen Annahme)

CREATE TRIGGER tr_InspectionsReview 
ON dbo.InspectionsReview 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @tableVar TABLE(
     ID int 
     , ObjectID int 
     , DateReview DATETIME 
    ); 

    INSERT INTO @tableVar (ID, ObjectID, DateReview) 
    SELECT DISTINCT inserted.ID, inserted.ObjectID, inserted.DateReview 
    FROM inserted 
     JOIN dbo.InspectionsReview ir ON inserted.ObjectID=ir.ObjectID AND inserted.DateReview=ir.DateReview AND inserted.ID <> ir.ID; 

    INSERT INTO dbo.InspectionsReviewLog (ID, ObjectID, DateReview, duplicate) 
    SELECT ID, ObjectID, DateReview, 3 
    FROM 
     @tableVar; 


END;