在很多的时候,一个良好的数据库设计会因为后期的需求变化或其他原因,需要在当前表进行字段的扩展,这个是系统本身的设计问题,为了达到系统的功能需求,不可避免需要更改数据库的设计。
但是有时候我们做系统集成,要与其他系统做接口的时候,如果需要更改表的设计,我认为就不是一个很好的设计思路了,做为这种需求,我们可以通过设计对应表来满足接口的需求。
还有一种方案就是在不改变的原表,将原表改名,然后建立一个原表与接口对应信息表的视图,视图命名为原来的表名,这样就可以通过更新视图来处理各种业务了。
以下为实例代码:
-- 创建原表
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