李晓亮的博客

导航

【摘】利用视图进行更新

Updatable Views
You can modify the data of an underlying base table through a view, as long as the following conditions are true:

Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.

The columns being modified in the view must directly reference the underlying data in the table columns. The columns cannot be derived in any other way, such as through the following:

An aggregate function: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, and VARP.

A computation. The column cannot be computed from an expression that uses other columns. Columns that are formed by using the set operators UNION, UNION ALL, CROSSJOIN, EXCEPT, and INTERSECT amount to a computation and are also not updatable.

The columns being modified are not affected by GROUP BY, HAVING, or DISTINCT clauses.
查找的MSDN资料
更新视图,你第一条就不行啊,数据来源于2个基本表,肯定不能直接更新视图
用触发器,可以在插入其中一个表时。触发,插入另一个表数据
==============================================================================================================
视图是可以插入数据的 即使涉及到多个基表 在视图上建立对应的触发器就可以了。
这个是例子 注意看最后几个触发器 在 vouchers 视图上面建立的

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[vouchers]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[vouchers]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO


CREATE view vouchers
as

select
  vouchers_base.CardNumber,
  vouchers_base.Shield,
  vouchers_base.Name,
  vouchers_base.CardType,
  vouchers_base.ItemTblName,
  vouchers_base.itemCol,
  vouchers_base.BTTblName,
  vouchers_base.BTQName,
  vouchers_base.BWTblName,
  vouchers_base.BWQName,
  vouchers_base.VchListQName,
  vouchers_base.HaveBodyGrid,
  vouchers_base.BodyModify,
  vouchers_base.VoucherWidth,
  vouchers_base.VoucherHeight,
  vouchers_base.BodyTop,
  vouchers_base.BodyLeft,
  vouchers_base.BodyWidth,
  vouchers_base.BodyHeight,
  vouchers_base.SelfDef1,
  vouchers_base.SelfDef2,
  vouchers_base.SelfDef3,
  vouchers_base.DEF_ID,
  vouchers_base.DEF_ID_PRN,
  vouchers_base.cSub_Id,
  vouchers_base.Memo,
  vouchers_base.iOrder,
  vouchers_base.cIndustry,
  vouchers_base.bAllowMulTemp,
  vouchers_base.cDefWhere,
  vouchers_base.pubufts,
  vouchers_base.VchTblPrimarykeyNames,
  vouchers_base.ReceiptNOFieldName,
  vouchers_base.IsPrintLimited,
  vouchers_base.AllowDateTimeFormat,
  vouchers_base.NotAppiesAuth,
  vouchers_base.cHeadBusObjectId,
  vouchers_base.cBodyBusObjectId,
  vouchers_base.cHeadFuncName,
  vouchers_base.cBodyFuncName,
  vouchers_base.cFieldAuthid,
  vouchers_lang.ccardname,
  vouchers_lang.AppName,
  vouchers_lang.localeid,
  vouchers_lang.ufts

from vouchers_base 
left join vouchers_lang on vouchers_base.cardnumber=vouchers_lang.cardnumber and vouchers_lang.localeid=DBO.UDF_GetLocaleID()


GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO


Create Trigger TR_vouchers_InsteadofDelete on Vouchers
INSTEAD OF delete
AS
begin
delete Vouchers_lang from Vouchers_lang inner join deleted on Vouchers_lang.cardnumber = deleted.cardnumber
delete Vouchers_base from Vouchers_base inner join deleted on Vouchers_base.cardnumber = deleted.cardnumber
end


Create Trigger TR_vouchers_InsteadofInsert on Vouchers
INSTEAD OF INSERT
AS
begin
INSERT INTO vouchers_base (cardnumber,shield,name,cardtype,itemtblname,itemcol,bttblname,btqname,bwtblname,bwqname,vchlistqname,havebodygrid,bodymodify,voucherwidth,voucherheight,bodytop,bodyleft,bodywidth,bodyheight,selfdef1,selfdef2,selfdef3,def_id,def_id_prn,csub_id,memo,iorder,cindustry,ballowmultemp,cdefwhere)
select cardnumber,shield,name,cardtype,itemtblname,itemcol,bttblname,btqname,bwtblname,bwqname,vchlistqname,havebodygrid,bodymodify,voucherwidth,voucherheight,bodytop,bodyleft,bodywidth,bodyheight,selfdef1,selfdef2,selfdef3,def_id,def_id_prn,csub_id,memo,iorder,cindustry,ballowmultemp,cdefwhere from Inserted
INSERT INTO vouchers_lang(cardnumber,ccardname,appname,localeid)
select inserted.cardnumber,inserted.ccardname,inserted.appname,U8LangDefine.localeid From U8LangDefine,Inserted 
end


Create Trigger TR_vouchers_InsteadofUpdate on Vouchers
INSTEAD OF UPDATE
AS
begin
UPDATE vouchers_base SET vouchers_base.shield=Inserted.shield,vouchers_base.name=Inserted.name,vouchers_base.cardtype=Inserted.cardtype,vouchers_base.itemtblname=Inserted.itemtblname,vouchers_base.itemcol=Inserted.itemcol,vouchers_base.bttblname=Inserted.bttblname,vouchers_base.btqname=Inserted.btqname,vouchers_base.bwtblname=Inserted.bwtblname,vouchers_base.bwqname=Inserted.bwqname,vouchers_base.vchlistqname=Inserted.vchlistqname,vouchers_base.havebodygrid=Inserted.havebodygrid,vouchers_base.bodymodify=Inserted.bodymodify,vouchers_base.voucherwidth=Inserted.voucherwidth,vouchers_base.voucherheight=Inserted.voucherheight,vouchers_base.bodytop=Inserted.bodytop,vouchers_base.bodyleft=Inserted.bodyleft,vouchers_base.bodywidth=Inserted.bodywidth,vouchers_base.bodyheight=Inserted.bodyheight,vouchers_base.selfdef1=Inserted.selfdef1,vouchers_base.selfdef2=Inserted.selfdef2,vouchers_base.selfdef3=Inserted.selfdef3,vouchers_base.def_id=Inserted.def_id,vouchers_base.def_id_prn=Inserted.def_id_prn,vouchers_base.csub_id=Inserted.csub_id,vouchers_base.memo=Inserted.memo,vouchers_base.iorder=Inserted.iorder,vouchers_base.cindustry=Inserted.cindustry,vouchers_base.ballowmultemp=Inserted.ballowmultemp,vouchers_base.cdefwhere=Inserted.cdefwhere FROM vouchers_base, Inserted WHERE vouchers_base.cardnumber=Inserted.cardnumber
UPDATE vouchers_lang SET vouchers_lang.ccardname=Inserted.ccardname,vouchers_lang.appname=Inserted.appname FROM vouchers_lang,U8LangDefine,Inserted WHERE vouchers_lang.cardnumber=Inserted.cardnumber and vouchers_lang.localeid = DBO.UDF_GetLocaleID()
end

 

posted on 2011-08-14 12:06  LeeXiaoLiang  阅读(171)  评论(0)    收藏  举报