0
有沒有辦法阻止刪除表中的所有行?我知道如何使用DDL觸發器來防止刪除表格或截斷。我曾經無法突出顯示整個命令,將where子句關閉,並刪除表中的所有行。除非存在where子句,否則我希望防止這種情況再次發生。防止刪除表中的所有行
有沒有辦法阻止刪除表中的所有行?我知道如何使用DDL觸發器來防止刪除表格或截斷。我曾經無法突出顯示整個命令,將where子句關閉,並刪除表中的所有行。除非存在where子句,否則我希望防止這種情況再次發生。防止刪除表中的所有行
你可以用觸發器來做到這一點。
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將是PK即使沒有命名的id? – UserBlueOne
@UserBlueOne你是說你不知道列的名字?不,您需要*名稱*作爲主鍵/唯一鍵的列;你不能使用序位。我想你可以在兩張桌子上執行一個「計數」,但我更願意通過鍵確定。只要您的表都具有單列主鍵,這些觸發器就可以非常容易地以自動方式生成。 –
我會知道PK的名字,但只是好奇,如果可以使用序數值。 – UserBlueOne