2012-09-25 133 views
0

有沒有辦法阻止刪除表中的所有行?我知道如何使用DDL觸發器來防止刪除表格或截斷。我曾經無法突出顯示整個命令,將where子句關閉,並刪除表中的所有行。除非存在where子句,否則我希望防止這種情況再次發生。防止刪除表中的所有行

回答

3

你可以用觸發器來做到這一點。

CREATE TRIGGER dbo.KeepRows 
ON dbo.TableName 
FOR DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF NOT EXISTS (SELECT 1 FROM dbo.TableName) 
    BEGIN 
    RAISERROR('Naughty developer, you tried to delete the last row!', 11, 1); 
    ROLLBACK TRANSACTION; 
    END 
END 
GO 

爲了避免刪除,然後回滾,可以是如果表是大挺貴的,你可以改爲實現這個作爲替代觸發器,這將阻止任何工作情況的發生(除了檢查當然)。這是假設列id是主鍵:

CREATE TRIGGER dbo.KeepRows2 
ON dbo.TableName 
INSTEAD OF DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT 1 FROM dbo.TableName WHERE id NOT IN (SELECT id FROM deleted)) 
    BEGIN 
    DELETE dbo.TableName WHERE id IN (SELECT id FROM deleted); 
    END 
    -- optional: 
    ELSE 
    BEGIN 
    RAISERROR('Nice try, you need a WHERE clause!', 11, 1); 
    END 
END 
GO 
+0

是否有使用列符號在代替實施例的方式,再次使用的假設,即列0將是PK即使沒有命名的id? – UserBlueOne

+0

@UserBlueOne你是說你不知道列的名字?不,您需要*名稱*作爲主鍵/唯一鍵的列;你不能使用序位。我想你可以在兩張桌子上執行一個「計數」,但我更願意通過鍵確定。只要您的表都具有單列主鍵,這些觸發器就可以非常容易地以自動方式生成。 –

+0

我會知道PK的名字,但只是好奇,如果可以使用序數值。 – UserBlueOne