亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

在SQL Server中對視圖進行增刪改

系統(tǒng) 2006 0
原文: 在SQL Server中對視圖進行增刪改

Lesktop開源IM 發(fā)布以后,有一些網(wǎng)友問及如何在嵌入IM后與自己網(wǎng)站的用戶系統(tǒng)整合( 即如何讓嵌入的IM直接使用網(wǎng)站原有的用戶數(shù)據(jù)庫,而不需要將已有的用戶數(shù)據(jù)導(dǎo)入到IM的數(shù)據(jù)庫中 )。Lesktop對Users表(存儲用戶登錄名,昵稱,密碼等信息的表)都是在存儲過程中進行增刪改的,顯然,如果直接去改Users表相關(guān)的存儲過程是比較麻煩的, 本文將介紹一種較為簡單的方法,在不需要修改存儲過程和源代碼的情況下整合用戶系統(tǒng)

為實現(xiàn)這個目的, 先介紹一下在SQL SERVER中,如何對視圖進行增刪改 。假使用戶有Name,Remark兩項信息,但是沒有存放在同一張表中,而是分開存儲在兩個表UserBase(ID, Name),UserExtent(ID, Remark)中。

image

為使用方便,建立一個視圖Users,用于表示用戶的完整信息,其定義如下:

    
      CREATE
    
    
      VIEW
    
     [dbo].[Users]


    
      as
    
    
      SELECT
    
     b.ID 
    
      as
    
     ID, b.Name 
    
      as
    
     Name, e.Remark 
    
      as
    
     Remark 


    
      FROM
    
     UserBase b, UserExtent e 


    
      WHERE
    
     b.ID = e.ID;
  

現(xiàn)在,我們希望通過Users視圖進行增刪改實現(xiàn)對UserBase,UserExtent表進行修改。顯然,如果對Users直接執(zhí)行insert,update,delete是不可能的,執(zhí)行時會發(fā)生以下錯誤:

image

在SQL Server中,對視圖增刪改可以通過觸發(fā)器來實現(xiàn),例如我們可以創(chuàng)建一個INSERT觸發(fā)器,當(dāng)在視圖Users上執(zhí)行INSERT時,在觸發(fā)器中實現(xiàn)對UserBase,UserExtent的INSERT操作。在觸發(fā)器中, 可以通過名稱為inserted的表,獲取到新插入的行 ,具體代碼如下:

    
      CREATE
    
    
      TRIGGER
    
     [dbo].[Users_Insert] 
    
      ON
    
     [dbo].[Users] INSTEAD 
    
      OF
    
     INSERT


    
      as
    
    
      declare
    
     @name nvarchar(32), @remark nvarchar(32)


    
      declare
    
     ins_cursor 
    
      cursor
    
    
      for
    
    
      select
    
     Name, Remark 
    
      from
    
     inserted


    
      open
    
     ins_cursor


    
      fetch
    
    
      next
    
    
      from
    
     ins_cursor 
    
      into
    
     @name, @remark;


    
      while
    
    (@@fetch_status = 0)


    
      begin
    
    
      --讀取所有行,并插入


    
        insert 
    
      into
    
     UserBase (Name) 
    
      values
    
     (@name);

    insert 
    
      into
    
     UserExtent(ID, Remark) 
    
      values
    
     (@@
    
      identity
    
    , @remark);

    
    
      fetch
    
    
      next
    
    
      from
    
     ins_cursor 
    
      into
    
     @name, @remark;


    
      end
    
    
      close
    
     ins_cursor
  

下面我們通過插入兩行數(shù)據(jù)測試觸發(fā)器:

    
      --清空所有數(shù)據(jù)
    
    
      delete
    
    
      from
    
     UserExtent;


    
      delete
    
    
      from
    
     UserBase;




    
      create
    
    
      table
    
     #temp(

    name nvarchar(32),

    remark nvarchar(32)

)

insert #temp (name,remark) 
    
      values
    
     (N
    
      'user1'
    
    , N
    
      '1'
    
    );

insert #temp (name,remark) 
    
      values
    
     (N
    
      'user2'
    
    , N
    
      '2'
    
    );




    
      --插入兩行數(shù)據(jù)
    
    

insert Users(name, remark)


    
      select
    
     name,remark 
    
      from
    
     #temp




    
      drop
    
    
      table
    
     #temp




    
      select
    
     * 
    
      from
    
     Users;


    
      select
    
     * 
    
      from
    
     UserBase;


    
      select
    
     * 
    
      from
    
     UserExtent;
  

執(zhí)行結(jié)果如下:

image

創(chuàng)建更新觸發(fā)器,與INSERT觸發(fā)器類似,受影響的行會保存在inserted中, 可以從inserted表中獲取受影響的行 ,并更新UserBase,UserExtent,具體代碼如下:

    
      CREATE
    
    
      TRIGGER
    
     [dbo].[Users_Update] 
    
      ON
    
     [dbo].[Users] INSTEAD 
    
      OF
    
    
      UPDATE
    
    
      as
    
    
      update
    
     UserExtent


    
      set
    
     UserExtent.Remark=ins.Remark


    
      from
    
     inserted ins


    
      where
    
     UserExtent.ID = ins.ID;




    
      update
    
     UserBase


    
      set
    
     UserBase.Name=ins.Name


    
      from
    
     inserted ins


    
      where
    
     UserBase.ID = ins.ID;
  

測試代碼:

    
      --清空所有數(shù)據(jù)
    
    
      delete
    
    
      from
    
     UserExtent;


    
      delete
    
    
      from
    
     UserBase;


    
      --插入兩行數(shù)據(jù)
    
    

insert Users (name,remark) 
    
      values
    
     (N
    
      'user1'
    
    , N
    
      '1'
    
    );

insert Users (name,remark) 
    
      values
    
     (N
    
      'user2'
    
    , N
    
      '2'
    
    );

insert Users (name,remark) 
    
      values
    
     (N
    
      'user3'
    
    , N
    
      '2'
    
    );


    
      --修改后兩行數(shù)據(jù)
    
    
      UPDATE
    
     Users 
    
      set
    
     Remark = N
    
      '3'
    
    
      where
    
     Remark = N
    
      '2'
    
    
      --輸出數(shù)據(jù)
    
    
      select
    
     * 
    
      from
    
     Users;


    
      select
    
     * 
    
      from
    
     UserBase;


    
      select
    
     * 
    
      from
    
     UserExtent;
  

測試結(jié)果:

image

創(chuàng)建刪除觸發(fā)器,在刪除的觸發(fā)器中, 可以通過deleted表,獲取被刪除的行 ,具體代碼如下:

    
      CREATE
    
    
      TRIGGER
    
     [dbo].[Users_Delete] 
    
      ON
    
     [dbo].[Users] INSTEAD 
    
      OF
    
    
      DELETE
    
    
      as
    
    
      delete
    
    
      from
    
     UserExtent 
    
      where
    
     ID 
    
      in
    
     (
    
      select
    
     ID 
    
      from
    
     deleted)


    
      delete
    
    
      from
    
     UserBase 
    
      where
    
     ID 
    
      in
    
     (
    
      select
    
     ID 
    
      from
    
     deleted)
  

測試代碼:

    
      --清空所有數(shù)據(jù)
    
    
      delete
    
    
      from
    
     UserExtent;


    
      delete
    
    
      from
    
     UserBase;


    
      --插入兩行數(shù)據(jù)
    
    

insert Users (name,remark) 
    
      values
    
     (N
    
      'user1'
    
    , N
    
      '1'
    
    );

insert Users (name,remark) 
    
      values
    
     (N
    
      'user2'
    
    , N
    
      '2'
    
    );

insert Users (name,remark) 
    
      values
    
     (N
    
      'user3'
    
    , N
    
      '2'
    
    );


    
      --刪除后兩行數(shù)據(jù)
    
    
      delete
    
    
      from
    
     Users 
    
      where
    
     Remark = N
    
      '2'
    
    
      --輸出數(shù)據(jù)
    
    
      select
    
     * 
    
      from
    
     Users;


    
      select
    
     * 
    
      from
    
     UserBase;


    
      select
    
     * 
    
      from
    
     UserExtent;
  

運行結(jié)果:

image

上文已介紹了如何對視圖進行增刪改,接下來將介紹如何通過建立視圖并添加增刪改觸發(fā)器實現(xiàn)Lesktop開源IM用戶系統(tǒng)的整合。首先介紹一下Lesktop開源IM數(shù)據(jù)庫中 Users 表的結(jié)構(gòu):

image

假使您的網(wǎng)站的用戶表(假使名稱為 MyUserTable )只有Name,Nickname:

image

那么,您可以建立一張擴展表(假使名稱為 UserExtentIM ),用于存儲其他信息:

image

接下來,您只需要 把Users表刪掉,重新建立一個名稱為Users的視圖,然后用上文處理Users, UserBase, UserExtent的方法,在Users視圖上建好觸發(fā)器,在觸發(fā)器中對MyUserTable,UserExtentIM表進行增刪改即可 ,Lesktop的存儲過程對User進行讀取和增刪改時,將通過觸發(fā)器自動轉(zhuǎn)換成對MyUserTable,UserExtentIM的操作,因此不需要修改任何存儲過程和源代碼,當(dāng)然也不會對你原有的數(shù)據(jù)庫造成影響。

在SQL Server中對視圖進行增刪改


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 橘梨纱视频一区二区在线观看 | 中文字幕视频在线观看 | 国产精品自在线天天看片 | 久久亚洲精品中文字幕二区 | 四虎影院视频 | 国产一区免费视频 | 99久久www免费 | 国产欧美专区在线观看 | 羞羞网站视频 | aa毛片免费全部播放完整 | 久久久久免费精品视频 | 三级aaa黄特色 | 暗香影院午夜国产精品 | 亚洲精品乱码久久久久久蜜桃 | 久久精选视频 | 欧洲成人爽视频在线观看 | 久久er99 | 亚洲精品国产字幕久久vr | 久久www免费人成_看片美女图 | 性性影院在线观看 | 久久精品国产免费观看99 | 婷婷色九月综合激情丁香 | 亚洲综合亚洲 | 性欧美高清久久久久久久 | 99资源在线| 美女视频很黄很黄又免费的 | 性色网站 | 中文字幕久精品免费视频蜜桃视频 | 午夜激情网站 | 亚洲小色网| 国产在线看不卡一区二区 | 久久视频这里只精品3国产 久久视频这里只有精品 | 欧美日韩北条麻妃一区二区 | 日本大臿亚洲香蕉大片 | 国产一区三区二区中文在线 | 猫咪视频成人永久免费观看 | 日本午夜大片a在线观看 | 岛国片欧美一级毛片 | 浮力影院欧美三级日本三级 | 国产资源福利 | 99热1|