表                 字段(编号)(varchar)   字段(varchar)           字段(text)
restorebase        prodnr                   desript1              descmemo
bomchangeproduct   masternr                 descript1             sizememo
我的是sql2000因为有备注行字段(descmemo、sizememo)导致不能用触发器    我要达到这样的效果 当表restorebase里的 字段desript1、descmemo发生更新时 同时自动去更新另一个表bomchangeproduct对就的字段  查了些资料据说能用instead of 触发器和创建视图来更新,我是新手对视图还没用过,看了些资料也没讲视图和触发器的关系,还有用存储能实现吗?  不管是视图,还是存储都可以,希望会的朋友帮忙写一个,我也学习学习怎么建的!

解决方案 »

  1.   

    视图触发器CREATE TABLE TBM(ID INT NOT NULL PRIMARY KEY,MDATA INT NOT NULL)
    CREATE TABLE TBD(ID INT NOT NULL,ITM INT NOT NULL,DDATA INT NOT NULL,CONSTRAINT PK_TBD PRIMARY KEY CLUSTERED(ID,ITM))
    GO
    truncate table TBM
    truncate table TBD
    ALTER VIEW V_DETAIL
    AS
    SELECT A.ID,A.MDATA,B.ITM,B.DDATA 
    FROM TBM A LEFT JOIN TBD B
    ON A.ID=B.ID
    GO
    INSERT INTO TBM 
    SELECT 1,101
    UNION ALL
    SELECT 2,102
    INSERT INTO TBD 
    SELECT 1,1,211
    UNION ALL 
    SELECT 1,2,212
    SELECT * FROM V_DETAIL
    SELECT * FROM TBD WHERE NOT EXISTS(SELECT ID FROM TBM)
    GO
    drop trigger TR_V_DETAIL
    CREATE TRIGGER TR_V_DETAIL
    ON V_DETAIL
    INSTEAD OF INSERT,UPDATE,DELETE
    AS
    SET NOCOUNT ON
    --删除从表
    DELETE A
    FROM TBD A,DELETED D
    WHERE A.ID=D.ID
    AND A.ITM=D.ITM
    AND NOT EXISTS(SELECT 1 FROM INSERTED WHERE ID=D.ID AND ITM=D.ITM)          --修改数据的情况不需要删除
    ---删除主表
    DELETE A
    FROM TBM A,DELETED D
    WHERE A.ID=D.ID
    AND NOT EXISTS(SELECT 1 FROM INSERTED WHERE ID=D.ID)  --修改数据的情况不需要删除
    AND NOT EXISTS(SELECT 1 FROM TBD WHERE ID=D.ID)      --有其他从表的数据不能删除
    --修改从表数据
    UPDATE A SET DDATA=I.DDATA
    FROM TBD A,INSERTED I
    WHERE A.ID=I.ID
    AND A.ITM=I.ITM
    --修改主表数据
    UPDATE A SET MDATA=I.MDATA
    FROM TBM A,INSERTED I
    WHERE A.ID=I.ID
    --插入主表数据
    INSERT TBM(ID,MDATA)
    SELECT ID,MAX(MDATA) AS MDATA
    FROM INSERTED I
    WHERE NOT EXISTS(SELECT 1 FROM TBM WHERE ID=I.ID)
    GROUP BY ID
    --插入从表数据
    INSERT TBD(ID,ITM,DDATA)
    SELECT ID,ITM,DDATA
    FROM INSERTED I
    WHERE NOT EXISTS(SELECT 1 FROM TBD WHERE ID=I.ID AND ITM=I.ITM)
    GO
    --测试一条插入原有主表的数据
    INSERT V_DETAIL(ID,ITM,MDATA,DDATA) VALUES (2,1,102,221)
    SELECT * FROM V_DETAIL
    SELECT * FROM TBM
    SELECT * FROM TBD
    GO --结果只插入从表
    --测试一次插入两条数据
    INSERT V_DETAIL
    SELECT 3,103,1,231
    UNION ALL
    SELECT 3,103,2,232
    SELECT * FROM V_DETAIL
    SELECT * FROM TBM
    SELECT * FROM TBD
    GO --结果只插入一条主表数据,从表2条
    --测试修改一条从表的数据
    UPDATE V_DETAIL SET ITM=10 WHERE  ID=1
    --测试修改主从两表表数据
    UPDATE V_DETAIL SET DDATA=900,MDATA=800 WHERE ID=3
    --测试删除只有一条从表数据的记录
    DELETE V_DETAIL WHERE ID=2 AND ITM=1  --结果主表的数据一起删除
    --测试删除有多条从表数据记录中得一条
    DELETE V_DETAIL WHERE ID=1 AND ITM=1  --结果主表数据保留,从表数据被删
    --测试删除一个主表ID的所有记录
    DELETE V_DETAIL WHERE ID=3            --结果从主表一起删除
      

  2.   

    參照聯機例子和說明
    http://msdn.microsoft.com/zh-cn/library/ms175521%28v=SQL.90%29.aspx
      

  3.   

    直接inserted of 触发器解决问题
      

  4.   

    就不人按上面提供的表的字段帮忙写一下吗?现一个 inserted of 的触发器,要考虑的是我的是sql2000的表,资料是查到inserted of 支持text类型!