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