【问题标题】:Alter a Delete Trigger to Check a Column Value更改删除触发器以检查列值
【发布时间】:2013-05-30 23:26:43
【问题描述】:

我正在使用具有触发器的数据库,该触发器通过引发错误而不提交删除来防止删除某个表中的记录。如果要删除的记录的列具有特定值,我需要修改行为以允许删除。

这是当前代码:

CREATE TRIGGER [dbo].[MyTable_PreventDelete] 
ON [dbo].[MyTable]
INSTEAD OF DELETE
AS
    -- TODO: Only run the code below if Deleted = 0
    ROLLBACK
    RAISERROR('ERROR: That column may not be deleted.',16,1)
    RETURN
GO

我试图简单地将错误调用包装在条件中,但似乎我不能简单地直接引用受影响行的列:

...
CREATE TRIGGER [dbo].[MyTable_PreventDelete] 
ON [dbo].[MyTable]
INSTEAD OF DELETE
AS
IF IsDeleted = 0
BEGIN
    ROLLBACK
    RAISERROR('ERROR: That column may not be deleted.',16,1)
    RETURN
END
GO

【问题讨论】:

  • 你使用的是sql server还是其他数据库?
  • 如果批处理中的一些记录是可删除的,而有些则不是,你想要什么行为?在 SQL Server 中,触发器对批量数据而非单行数据进行操作。
  • SQL Server 2005。如果批处理中的任何记录Deleted=0,则整个事务应该失败

标签: sql sql-server-2005 triggers sql-delete


【解决方案1】:

经过更多调查,这就是我们所做的。这些操作的每个触发器中引用了 3 个临时表(INSERTED、UPDATED、DELETED)。在这种情况下,我们将检查 DELETED 中受影响的记录(这反映了批次中受影响的记录)。如果任何没有设置标志,则会引发错误:

IF EXISTS(SELECT 1 FROM DELETED d WHERE d.Deleted=0)
BEGIN
    ROLLBACK
        -- the rollback is unnecessary
        RAISERROR('ERROR: That column may not be deleted.',16,1)
    END
    ELSE
        BEGIN
        DELETE c
        FROM [dbo].[MyTable] c
        INNER JOIN DELETED d
    ON c.PrimaryKey = d.PrimaryKey
    END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2021-09-08
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多