我现在有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触发器,可我不想触发任何事件啊,那我该怎么弄啊,各位大哥,帮小弟一个忙吧
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触发器,可我不想触发任何事件啊,那我该怎么弄啊,各位大哥,帮小弟一个忙吧
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
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
主要我要更新的数据是在程序里面动态指定的啊,用你的方法可能不行把
如果我分两句SQL写,分开更新的话,那我还不如不用视图,直接写两句SQL,更新两张表To:zhangxiaopin(zxp)
在触发器里面怎么调用外部写的存储过程?
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中的吗,
你只用執行一條insert v1 values(1,'aa',1,'bb') 這個語句就可以往兩個表都插入數據,
往兩個表插入數據就全部交給觸發器去做了。和將數據插入兩個表的效果是相同的。不同的是,用語句單獨插入,你需要寫兩條語句,而用這個只需要寫一條語句。這只是個簡單的例子,介紹在視圖上怎麼建立Instead Of Insert觸發器。
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
--建立測試環境
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
*/