我现在有2张表:
A表:
Id     int 主建,自动编号
Name   varchar(50)B表:
Id    int 主建,自动编号 
AId   int 
power  varchar(50)我现在建了一个视图VIEW,把这两个表关联了起来,关联条件是:其中A表的Id和B表的AId是相等的
我现在想通过更新视图VIEW来更新两个表,不知道怎么搞,我是这样搞的,
update view set Name='xx',power='vvvv' where Id=1
他竟然提示
<视图或函数 'view' 不可更新,因为修改会影响多个基表。>
我网上查了下,说这个功能是可以实现,要建个什么instead of触发器,可我不想触发任何事件啊,那我该怎么弄啊,各位大哥,帮小弟一个忙吧

解决方案 »

  1.   

    例子--instead of insert触发器在view上的使用create table t1 (a int,aa varchar(32))
    create table t2 (b int,bb varchar(32))
    --先创建两个基表
    go
    create view v1    --创建基表的视图
    as
    select t1.*,t2.* from t1 ,t2 where t1.a=t2.b
    goinsert v1 values(1,'aa',1,'bb')--这个时候对该view进行insert将失败,因为不能对两个基表以上的视图进行更新--所以现在再对v1创建一个instead of insert trigger
    --create trigger/proc的句子比较单独运行
    GO
    create trigger trg_v1 on v1      --在视图上建立instead of insert触发器,在insert view前触发
    instead of insert
    as
    begin
      insert t1 select a,aa from inserted
      insert t2 select b,bb from inserted
    end
    go
    insert v1 values(1,'aa',1,'bb')    --这个时候对view就可以进行insert了~Select * From t1
    Select * From t2GO
    Drop Table t1,t2
    Drop View v1
      

  2.   

    //***使用存储过程
    CREATE PROCEDURE dbo.Proc_SystemUser_Update  (
      @UserCode varchar(30),
      @UserName varchar(50),
      @UserState smallint
    )

    AS
    --更新用户信息
    UPDATE TB_SYSTEMUSER SET USERNAME=@USERNAME,USERSTATE=@USERSTATE WHERE USERCODE=@USERCODE

    --更新个人论坛信息.首先判断用户是否存在
    SELECT * FROM TB_BBSUSER WHERE USERCODE=@USERCODE

    IF(@@ROWCOUNT>0)
    BEGIN
    UPDATE TB_BBSUSER  SET USERNAME=@USERNAME WHERE USERCODE=@USERCODE
    END

    RETURN
      

  3.   

    视图确实是可update的 但很容易出错 就象你那样.容易产生幻影数据(假设你访问数据库全通过视图的话).如果id和power是一对一的话 你可以写两句tsql,分开更新视图.最好加上with check option子句
      

  4.   

    To:paoluo(一天到晚游泳的鱼) 
    主要我要更新的数据是在程序里面动态指定的啊,用你的方法可能不行把
      

  5.   

    To:billpu(加勒比小飞猪) 
    如果我分两句SQL写,分开更新的话,那我还不如不用视图,直接写两句SQL,更新两张表To:zhangxiaopin(zxp) 
    在触发器里面怎么调用外部写的存储过程?
      

  6.   

    暈, 這裡不是有說明嗎??insert v1 values(1,'aa',1,'bb')--这个时候对该view进行insert将失败,因为不能对两个基表以上的视图进行更新
      

  7.   

    To:paoluo(一天到晚游泳的鱼) begin
      insert t1 select a,aa from inserted
      insert t2 select b,bb from inserted
    end
    go
    insert v1 values(1,'aa',1,'bb')    --这个时候对view就可以进行insert了~这样的话,你还是先把数据插入到t1,t2啊,既然插入以后,还要对视图再进行插入干什么,视图里的数据不都是t1,t2中的吗,
      

  8.   

    还有就是我的本意是想通过更新视图来更新两张表中的内容,而且我想更新的内容没有确定性的数据,比如说我要更新A表中的Name='xx',我也可以更新Name='yy',
      

  9.   

    建立了這個觸發器後,
    你只用執行一條insert v1 values(1,'aa',1,'bb') 這個語句就可以往兩個表都插入數據,
    往兩個表插入數據就全部交給觸發器去做了。和將數據插入兩個表的效果是相同的。不同的是,用語句單獨插入,你需要寫兩條語句,而用這個只需要寫一條語句。這只是個簡單的例子,介紹在視圖上怎麼建立Instead  Of Insert觸發器。
      

  10.   

    不是說了有這段文字說明嗎??”--insert v1 values(1,'aa',1,'bb')--这个时候对该view进行insert将失败,因为不能对两个基表以上的视图进行更新“我暈了。再試下面這段代碼吧。--instead of insert触发器在view上的使用create table t1 (a int,aa varchar(32))
    create table t2 (b int,bb varchar(32))
    --先创建两个基表
    go
    create view v1    --创建基表的视图
    as
    select t1.*,t2.* from t1 ,t2 where t1.a=t2.b
    go--insert v1 values(1,'aa',1,'bb')--这个时候对该view进行insert将失败,因为不能对两个基表以上的视图进行更新--所以现在再对v1创建一个instead of insert trigger
    --create trigger/proc的句子比较单独运行
    GO
    create trigger trg_v1 on v1      --在视图上建立instead of insert触发器,在insert view前触发
    instead of insert
    as
    begin
      insert t1 select a,aa from inserted
      insert t2 select b,bb from inserted
    end
    go
    insert v1 values(1,'aa',1,'bb')    --这个时候对view就可以进行insert了~Select * From t1
    Select * From t2GO
    Drop Table t1,t2
    Drop View v1
      

  11.   

    这次怎么可以运行了,代码好象没有什么地方改变嘛,怎么回事,另外,还有没有instead of update的例子,我要的是更新的时候的,这个解决,马上给分,
      

  12.   

    哦,我看出来了,哈哈,有没有instead of update的例子啊,谢谢你,帮我搞了这么长时间.
      

  13.   

    本來想寫個例子讓你自己改寫的,沒想到你也蠻懶的,幫你寫個吧。:)
    --建立測試環境
    Create Table A
    (Id     int Identity(1,1),
    Name    varchar(50))
    Create Table B
    (Id     int Identity(1,1),
    AId    int,
    [power]  varchar(50))
    --插入數據
    Insert A Select 'aa'
    Union All Select 'bb'
    Insert B Select 1,'p1'
    Union All Select 2,'p2'
    GO
    --建立視圖
    Create View V_TEST
    As
    Select A.*,B.[power] From A Inner Join B On A.Id=B.AId
    GO
    --建立觸發器
    Create Trigger Trg_V1 On V_TEST
    Instead Of Update
    As
    Begin
    Update A Set Name=T.Name From A Inner Join Inserted T On A.Id=T.Id
    Update B Set [power]=T.[power] From B Inner Join A On A.Id=B.AId Inner Join Inserted T On A.Id=T.Id
    End
    GO
    --測試
    Update V_TEST Set Name='xx', [power]='vvvv' Where Id=1Select *From V_TEST
    GO
    --刪除測試環境
    Drop Table A,B
    Drop View V_TEST
    --結果
    /*
    Id Name power
    1 xx vvvv
    2 bb p2
    */