我希望这对于任何 SQL 人员来说都是一个足够简单的问题...
我们有一个保存系统配置数据的表,它通过触发器与历史表绑定(bind),这样我们就可以跟踪谁更改了什么以及何时更改。
我需要向该表中添加另一个值,但它会经常从代码中更改,并且要求我们不跟踪它的历史记录(我们不想用每天有数千条更新。
目前,我们的触发器有点像这样......
CREATE TRIGGER
[dbo].[SystemParameterInsertUpdate]
ON
[dbo].[SystemParameter]
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
INSERT INTO SystemParameterHistory
(
Attribute,
ParameterValue,
ParameterDescription,
ChangeDate
)
SELECT
Attribute,
ParameterValue,
ParameterDescription,
ChangeDate
FROM Inserted AS I
END
如果属性列值以特定字符串(例如“NoHist_”)为前缀,我希望能够添加一些逻辑来阻止它创建记录
鉴于我几乎没有使用触发器的经验,我想知道如何最好地实现这个...我尝试了如下的 where 子句
where I.Attribute NOT LIKE 'NoHist_%'
但似乎不起作用。该值仍会复制到历史表中。
如果您能提供任何帮助,我们将不胜感激。
<小时/>好的 - 正如 Cade Roux 所预测的那样,这在多次更新中都失败了。我将不得不采取新的方法来解决这个问题。请问大家还有什么建议吗?
<小时/>各位 - 请在这里教育我...为什么在这种情况下 LEFT() 比 LIKE 更好?我知道我已经接受了答案,但我想知道我自己的教育。
最佳答案
鉴于 WHERE 子句不起作用,也许这会:
CREATE TRIGGER
[dbo].[SystemParameterInsertUpdate]
ON
[dbo].[SystemParameter]
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
If (SELECT Attribute FROM INSERTED) LIKE 'NoHist_%'
Begin
Return
End
INSERT INTO SystemParameterHistory
(
Attribute,
ParameterValue,
ParameterDescription,
ChangeDate
)
SELECT
Attribute,
ParameterValue,
ParameterDescription,
ChangeDate
FROM Inserted AS I
END
关于sql-server - 仅当 SQL Server 中满足条件时才触发触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280904/