防止位列从 1 更新为 0 的 SQL 触发器?

标签 sql sql-server-2008

在 SQL Server 2008 中给定一个位类型的列,我如何编写触发器以允许从 0 更新到 1,但不允许从 1 更新到 0?

换句话说,一旦该位设置为 1,它就应该一直为 1。

触发器必须适用于多个更新,例如:

UPDATE Table SET BitField = 0

对于 BitField = 1 的任何行都应该失败。

编辑:为了提供一些背景,问题中的位/标志标记是否需要处理货币交易。如果该位=1,则交易已经被处理。如果该位被重置为0,则交易可能会重复,所以我需要在数据库级别强制执行该位不能被重置为0。

我需要防止针对数据库运行的直接查询以及应用程序级别的错误。我不能确定存储过程是否会始终用于更新表,因此我相信触发器是执行此逻辑的唯一方法。

最佳答案

看起来你需要一个简单的后触发器

CREATE TABLE YourTable(
    PK int Primary key,
    bitCol bit
)

CREATE TRIGGER YourTableTrigger
   ON  YourTable
   AFTER UPDATE
AS 

    DECLARE @nrOfViolations int 

    select @nrOfViolations = count(*) from deleted  d
    join YourTable t on d.PK = t.PK
    where d.bitCol = 1 and t.bitCol = 0

    if @nrOfViolations > 0
    BEGIN
        RAISERROR('Failed', 16, 1);
        ROLLBACK TRANSACTION
    END 

关于防止位列从 1 更新为 0 的 SQL 触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10642083/

相关文章:

mysql - 获取不同值集随时间变化的总和

c# - 将 sql 语句的结果存储到字符串中,并将其与列表框中选择的项目进行比较

mysql - SQL 表中的 Tkinter 下拉菜单

java - Eclipse 中数组的默认详细信息格式化程序

c# - 将 EF 模型从 SSCE 4.0 切换到 SQL Server 2008 R2

sql - 如何在 SQL Server 2008 中使用 SQL 查询生成具有约束的表的创建脚本

sql-server-2008 - SQL SERVER 2008 JOIN 提示

sql-server - 如何在不使用 GO 的情况下强制 sql server 一次执行一个命令?

mysql - 是否有等效的 EXPLAIN 可以在 ALTER TABLE 查询之前工作?

sql - 一个查找表还是多个查找表?