关于更新视图

      在很多的时候,一个良好的数据库设计会因为后期的需求变化或其他原因,需要在当前表进行字段的扩展,这个是系统本身的设计问题,为了达到系统的功能需求,不可避免需要更改数据库的设计。

 

      但是有时候我们做系统集成,要与其他系统做接口的时候,如果需要更改表的设计,我认为就不是一个很好的设计思路了,做为这种需求,我们可以通过设计对应表来满足接口的需求。

 

      还有一种方案就是在不改变的原表,将原表改名,然后建立一个原表与接口对应信息表的视图,视图命名为原来的表名,这样就可以通过更新视图来处理各种业务了。

 

以下为实例代码:

 

 

-- 创建原表

create table tab( id int , nam varchar ( 10))

insert tab

select 1, 'AA' union all

select 2, 'BB' union all

select 3, 'CC'

go

 

-- 创建扩展表

create table tab1( id int , nam1 varchar ( 10))

insert tab1

select 1, 'ERP1' union all

select 2, 'ERP2' union all

select 3, 'ERP3'

go

 

-- 创建视图

create view T1

as

select tab. id, nam, nam1

from tab, tab1

where tab. id= tab1. id

go

-- 插入测试数据

insert T1

select 4, 'DD' , 'ERP4'

go

-- 提示以下错误

-- 消息 4405 ,级别 16 ,状态 1 ,第 8

-- 视图或函数 'T1' 不可更新,因为修改会影响多个基表。

-- 需要创建 Instead OF 触发器来处理更新的问题

create trigger trg_v1 on T1

instead of insert  

as  

begin  

      insert tab select id, nam from inserted 

      insert tab1 select id, nam1 from inserted 

end  

go

-- 再次插入测试数据

insert T1

select 4, 'DD' , 'ERP4'

 

-- 检查结果

select * from T1

select * from Tab

select * from Tab1

go

-- 同理创建删除的触发器

create trigger trg_v2 on T1

instead of delete  

as  

begin

   delete from Tab where id in ( select id from deleted)  

   delete from Tab1 where ID in ( select id from deleted)

end  

-- 删除测试

go

 

delete from T1

where id= 4

go

 

-- 检查结果

select * from T1

select * from Tab

select * from Tab1

go

-- 删除测试环境

drop table tab, tab1

drop trigger trg_v1, trg_v2

drop view T1

go

 

--测试环境:Windows2003 SP2 SQL Server2005 SP3

 

转载于:https://www.cnblogs.com/Gaojier/archive/2009/07/22/2783555.html

你可能感兴趣的:(数据库)