我需要一个触发器,在触发更新表中的特定列时触发,并使用来自其他两个表的数据更新其他列。
表1称为STOCK_ITEMS
相关列是所有外键
STOCKGROUP
是表STOCK_GROUPS
STOCKGROUP2
是表STOCK_GROUP2S
X_STOCK_GROUP3
是X_STOCK_GROUP3S
表X_STOCK_GROUP3S
包含其他两个库存组表的FK。
我们的想法是让前两列依赖于第三列,这样如果X_STOCK_GROUP3
的值发生变化,此触发器将使用来自{的数据设置STOCKGROUP
和STOCKGROUP2
的值。 {1}}
我试过了:
X_STOCK_GROUP3S
它不起作用。它不喜欢我的'='标志。或者还有其他我想念的东西(很可能!!)
任何和所有帮助表示赞赏。
答案 0 :(得分:1)
唐'知道我是否明白你想做什么。
X_STOCK_GROUP3S包含一些记录
(ID,STOCKGROUP,STOCKGROUP2)
(21,1000,300)
(22,2000,200)
(23,3000,100)
和STOCK_ITEMS包含类似的记录 (ID,...,STOCKGROUP,STOCKGROUP2,X_STOCK_GROUP3)
如果表STOCK_ITEMS的X_STOCK_GROUP3更新为21,则要将值STOCKGROUP设置为1000,将STOCKGROUP2设置为300.
这是你想要完成的吗? 那么你的代码缺少一些选择标准。 我会尝试这样的事情
CREATE TRIGGER STOCKGROUP
ON [dbo].[STOCK_ITEMS]
FOR UPDATE
AS
SET NOCOUNT ON;
IF UPDATE (X_STOCK_GROUP3)
UPDATE STOCK_ITEMS SET STOCKGROUP = (
SELECT STOCKGROUP FROM X_STOCK_GROUP3S
WHERE STOCK_ITEMS.X_STOCK_GROUP3 = X_STOCK_GROUP3S.ID
),
STOCKGROUP2 = (
SELECT STOCKGROUP2 FROM X_STOCK_GROUP3S
WHERE STOCK_ITEMS.X_STOCK_GROUP3 = X_STOCK_GROUP3S.ID
)
WHERE ID IN (SELECT ID FROM deleted);
GO
答案 1 :(得分:0)
好的,所以这是最终的,也是成功的结果:
荣誉称赞:Sonny Dhaliwal - 支持顾问 - Enprise Solutions。谢谢Sonny。
USE [MyDataBase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[X_SET_STOCK_GROUPS]
ON [dbo].[STOCK_ITEMS]
FOR UPDATE
AS
DECLARE @STOCKCODE VARCHAR(100),
@STOCKGROUP3 INTEGER,
@STOCKGROUP1 INTEGER,
@STOCKGROUP2 INTEGER
BEGIN
SELECT @STOCKCODE = STOCKCODE FROM inserted
SELECT @STOCKGROUP3 = X_STOCK_GROUP3 FROM inserted
SELECT @STOCKGROUP1 = (SELECT SECONDARY_GROUP FROM X_STOCK_GROUP3S
WHERE SEQNO = @STOCKGROUP3)
SELECT @STOCKGROUP2 = (SELECT PRIMARY_GROUP FROM X_STOCK_GROUP3S
WHERE SEQNO = @STOCKGROUP3)
BEGIN
UPDATE STOCK_ITEMS
SET STOCKGROUP = @STOCKGROUP1, STOCKGROUP2 = @STOCKGROUP2
WHERE STOCKCODE = @STOCKCODE
END
END
GO