我有两张桌子。一个表中有一个字段,用于简单地保存一个计数器,另一个表有许多搜索字段,其中一个字段必须包含另一个表中的计数器值。
我正在尝试创建一个触发器
- 当第二个表中发生更新时,将第一个表中的值加 1
- 第一个表中的增量值将用于设置第二个表中的字段
- 只有当第二个表中发生更新并且字段(即状态)等于特定值时,才会出现 1 和 2。
- 处理多条记录的 1,2 和 3。
1)我已经设法编写了这个触发器,但是 a)它看起来非常慢 b)我找到了一篇解释得很好的文章,但正如示例所示,这仅适用于一个记录。如果更新了多条记录,它确实提供了一个解决方案,但我的问题是如何处理为每条记录增加第一个表中的值,然后为每条记录更新一个新值?
知道为什么它很慢(好吧,使用 sql server 管理控制台)?
我找到的文章可以在http://benreichelt.net/blog/2005/12/13/making-a-trigger-fire-on-column-change/找到
我根据这篇文章写的触发器如下:
CREATE TRIGGER [dbo].[trig_DataTable] ON [dbo].[DataTable]
FOR UPDATE
AS
IF UPDATE(Status)
BEGIN
SET NOCOUNT ON;
DECLARE @newStatus NVARCHAR(50)
DECLARE @oldStatus NVARCHAR(50)
DECLARE @maxRefNo INT
DECLARE @id BIGINT
SET @maxRefNo = (SELECT MAX(RefNo) FROM CounterTable) + 1
UPDATE CounterTable SET RefNo = @maxRefNo
SET @newStatus = (SELECT Status FROM Inserted)
SET @oldStatus = (SELECT Status FROM Deleted)
IF (@newStatus != @oldStatus) AND (@newStatus = 'Approved')
BEGIN
SET @Id = (SELECT Id FROM Inserted)
UPDATE DataTable
SET UniqueRef = @maxRefNo
WHERE Id = @Id
END
END
关于上述问题的另一个快速问题!由于上述触发器仅适用于单个记录,我是否需要使用 where 部分?需要这个似乎没有意义。
不是很重要,因为我需要的是与上面相同的行为,但它需要处理包含在 INSERTED/DELETED 表中的多个记录。
我能否编写一个函数来获取下一个可用数字并更新 CounterTable,然后从文章中解释的类似 SQL 调用此函数
INSERT INTO PriceHistory(ItemId, OldPrice, NewPrice, UniqueRef)
SELECT I.ItemId, D.Price, I.Price, dbo.GetNextRefNo()
FROM INSERTED I INNER JOIN DELETED D ON I.ItemId = D.ItemId
WHERE I.Price != D.Price
我不确定说实话......我会在一秒钟内试一试,但如果你们中的任何人对如何实现这一点有任何想法,请告诉我......会很棒!谢谢。
我希望以上是有道理的。
干杯。
T。