Wie Sie verhindern, dass updates für eine Tabelle, mit einer Ausnahme für eine situation

Ich habe eine Tabelle, die Datensätze enthält, die Teil einer Rechnung. Ich kann Ihnen sagen, welche sind bereits Teil einer Rechnung, weil der Tisch hat eine BillId Spalte, die aktualisiert wird durch die Anwendung code, wenn das passiert. Ich möchte verhindern, dass Aktualisierungen zu irgendeinem Datensatz sein, der eine nicht-null-BillId. Ich denke, dass die folgenden sollte sich darum kümmern, dass:

CREATE TRIGGER [Item_Update_AnyBilled]
ON [dbo].[Item]
FOR UPDATE
AS 
BEGIN
SET NOCOUNT ON;
DECLARE @AnyBilled BIT;

SELECT  TOP(1) @AnyBilled = 1
  FROM  inserted i
        JOIN deleted d ON i.ItemId = d.ItemId
 WHERE  d.BillId IS NOT NULL; 

IF COALESCE(@AnyBilled, 0) = 1 BEGIN
    RAISERROR(2870486, 16, 1);  -- Cannot update a record that is part of a bill.
    ROLLBACK TRANSACTION;
END;
END;

Jedoch, dort ist eine Falte. Die Tabelle "Artikel" hat auch eine DATETIME-Spalte Geändert wird, und ein trigger updates.

CREATE TRIGGER [dbo].Item_Update_Modified 
ON  [dbo].[Item] 
AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;

UPDATE a
   SET Modified = getdate()
  FROM Item a JOIN inserted i ON i.ItemId = a.ItemId
END

Mit diesen Trigger an Ort und Stelle, das hinzufügen eines Elements zu einer Rechnung immer verursacht, die von RAISERROR ausgelöst. Vermutlich weil, wenn die BillId gefüllt ist, Item_Update_AnyBilled lässt es durch weil die gelöscht.BillId ist NULL, aber die Item_Update_Modified dann hingerichtet wird, und dass sekundäre Ursachen ändern Item_Update_AnyBilled zu bekommen, wieder ausgeführt, und auch dieses mal gelöscht.BillId ist nicht mehr NULL.

Wie kann ich verhindern, dass updates auf die Tabelle "Artikel", außer in dem Fall, wo die BillId wird aufgefüllt, oder, wenn die änderung nur auf die Spalte Geändert?

Ich würde es vorziehen, eine Lösung, die nicht verlangen, mich zu vergleichen, die inserted-und deleted-Werte für jede Spalte (oder verwenden Sie COLUMNS_UPDATED()) schaffen würde, die ein Wartungs-Problem (jemand hätte daran zu erinnern, zu aktualisieren, wird der trigger jedes mal eine neue Spalte Hinzugefügt oder aus der Tabelle gelöscht). Ich bin mit SQL Server 2005.

InformationsquelleAutor Mark Freeman | 2012-02-29

Schreibe einen Kommentar