zoukankan      html  css  js  c++  java
  • 关于更新视图

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

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

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

    以下为实例代码:

    <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

    -- 创建原表

    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

  • 相关阅读:
    个人博客
    个人博客
    5.4
    4.30
    4.29
    4.28
    4.27
    4.26
    4.25
    4.24
  • 原文地址:https://www.cnblogs.com/Gaojier/p/2783555.html
Copyright © 2011-2022 走看看