当前位置: 代码迷 >> Sql Server >> 关于触发器 INSTEAD OF UPDATE,该怎么处理
  详细解决方案

关于触发器 INSTEAD OF UPDATE,该怎么处理

热度:28   发布时间:2016-04-24 09:33:17.0
关于触发器 INSTEAD OF UPDATE
ALTER TRIGGER OrderCheck ON Material_Prove
    INSTEAD OF UPDATE
AS 
BEGIN
SET NOCOUNT ON;

IF UPDATE(COMMENT2) OR UPDATE(COMMON)
BEGIN
DECLARE @item VARCHAR(10),@COMMON_New VARCHAR(MAX),@COMMON_Old VARCHAR(MAX)

SELECT @item = ITEM FROM inserted

SELECT @COMMON_New = ISNULL(CAST(COMMON AS VARCHAR(MAX)),'')+ISNULL(CAST(COMMENT2 AS VARCHAR(MAX)),'')
FROM inserted

SELECT @COMMON_Old = ISNULL(CAST(COMMON AS VARCHAR(MAX)),'')+ISNULL(CAST(COMMENT2 AS VARCHAR(MAX)),'')
FROM deleted

IF @COMMON_New <> @COMMON_Old
BEGIN
IF EXISTS(
SELECT ITEM FROM CORDER_DTL
WHERE C_LINE_STAT IN (2,3,4) AND ITEM = @item
UNION ALL
SELECT ITEM FROM PORDER_DTL
WHERE P_LINE_STAT IN (2,3,4) AND ITEM = @item
UNION ALL
SELECT ITEM FROM MORDER_DTL
WHERE M_LINE_STAT IN (2,3,4) AND ITEM = @item
)
BEGIN
SELECT '存在未完成订单,不能修改!'
ROLLBACK TRAN
END
END
END
END

代码如上,为什么我在不满足IF条件是执行UPdate 根本不会更改数据库!
如下:(此段代码执行显示一行发生变化,可是数据根本不变!)
UPDATE MATERIAL_PROVE
SET POUND = 3,requ_id_1 = 1
WHERE ITEM = '000001'
------解决思路----------------------
INSTEAD OF 触发器只是先建立临时的inserted和deleted ,至于是update资料还是insert还是delete都要在触发器里面实现.

IF UPDATE (COL)
BEGIN
DO somthing
END
 ELSE
BEGIN
UPDATE T
SET    COL1     = I.COL1,
       COL2     = I.COL2..........
FROM   TB T,
       INSERTED I
WHERE  T.ID = I.ID
END


另外,你这种情况用after触发器没办法实现吗?
  相关解决方案