gpt4 book ai didi

sql - 如何有效地阻止对触发器中除一列之外的所有列进行更新?

转载 作者:行者123 更新时间:2023-12-04 06:06:54 26 4
gpt4 key购买 nike

我有一个包含 250 列的表,我必须在该表上编写一个触发器,该触发器将阻止对除一列之外的所有列进行更新。

有一列 evt_updatable 可以更新。触发器的职责是在用户尝试更新此列以外的任何内容时引发错误。

实现这一目标的不同方法是什么。
一种严格的方法是声明 500 个变量来存储插入和删除的值。如下面的代码片段所示。

SELECT         @newColdata1              = i.col1
@oldColdata1 = d.col1
@newColdata2 = i.col2
@oldColdata2 = d.col1
----------------------------
------------------------------ -- same thing for remaining 250 rows
FROM inserted i, deleted d
WHERE i.evt_code = d.evt_code;

比将它们全部比较以进行更改并在发生更改时引发错误。
有没有其他更好的方法来做到这一点。
因为它需要 500 个不同的变量声明和更多的比较。请在这方面帮助我

简单:在我的表中,如果用户尝试更改任何其他触发器应该引发错误的内容,他应该只能更改一个特定的列。

最佳答案

这是COLUMNS_UPDATED() 的一个很好的用途触发器中可用的函数。

如果仅更新了第四列,则它返回的位模式将类似于

00001000 00000000 00000000 00000000 ... (binary)

即第一个字节的值为 8,其余的为零,如果更新了任何其他列,则第一个字节将不等于 8,或者其他一个字节不为 0。

该函数返回一个 varbinary,每列一位。对于 250 列,它将返回 32 个字节的数据(250/8),这意味着您需要测试每个字节,即
IF (    (SUBSTRING(COLUMNS_UPDATED(), 1,1) = 8) 
AND (SUBSTRING(COLUMNS_UPDATED(), 2,1) = 0)
AND (SUBSTRING(COLUMNS_UPDATED(), 3,1) = 0)
.
.
.
AND (SUBSTRING(COLUMNS_UPDATED(),31,1) = 0)
AND (SUBSTRING(COLUMNS_UPDATED(),32,1) = 0)
)

这将测试是否仅更新了一个特定列。如果您有多个可以更新的列,那么您将需要一些按位运算符来过滤位模式。

关于sql - 如何有效地阻止对触发器中除一列之外的所有列进行更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8252979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com