在SQL Server中對檢視進行增刪改
Lesktop開源IM釋出以後,有一些網友問及如何在嵌入IM後與自己網站的使用者系統整合(即如何讓嵌入的IM直接使用網站原有的使用者資料庫,而不需要將已有的使用者資料匯入到IM的資料庫中)。Lesktop對Users表(儲存使用者登入名,暱稱,密碼等資訊的表)都是在儲存過程中進行增刪改的,顯然,如果直接去改Users表相關的儲存過程是比較麻煩的,本文將介紹一種較為簡單的方法,在不需要修改儲存過程和原始碼的情況下整合使用者系統。
為實現這個目的,先介紹一下在SQL SERVER中,如何對檢視進行增刪改。假使使用者有Name,Remark兩項資訊,但是沒有存放在同一張表中,而是分開儲存在兩個表UserBase(ID, Name),UserExtent(ID, Remark)中。
為使用方便,建立一個檢視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;
現在,我們希望通過Users檢視進行增刪改實現對UserBase,UserExtent表進行修改。顯然,如果對Users直接執行insert,update,delete是不可能的,執行時會發生以下錯誤:
在SQL Server中,對檢視增刪改可以通過觸發器來實現,例如我們可以建立一個INSERT觸發器,當在檢視Users上執行INSERT時,在觸發器中實現對UserBase,UserExtent的INSERT操作。在觸發器中,可以通過名稱為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
下面我們通過插入兩行資料測試觸發器:
--清空所有資料
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');
--插入兩行資料
insert Users(name, remark)
select name,remark from #temp
drop table #temp
select * from Users;
select * from UserBase;
select * from UserExtent;
執行結果如下:
建立更新觸發器,與INSERT觸發器類似,受影響的行會儲存在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;
測試程式碼:
--清空所有資料
delete from UserExtent;
delete from UserBase;
--插入兩行資料
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');
--修改後兩行資料
UPDATE Users set Remark = N'3' where Remark = N'2'
--輸出資料
select * from Users;
select * from UserBase;
select * from UserExtent;
測試結果:
建立刪除觸發器,在刪除的觸發器中,可以通過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)
測試程式碼:
--清空所有資料
delete from UserExtent;
delete from UserBase;
--插入兩行資料
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');
--刪除後兩行資料
delete from Users where Remark = N'2'
--輸出資料
select * from Users;
select * from UserBase;
select * from UserExtent;
執行結果:
上文已介紹瞭如何對檢視進行增刪改,接下來將介紹如何通過建立檢視並新增增刪改觸發器實現Lesktop開源IM使用者系統的整合。首先介紹一下Lesktop開源IM資料庫中Users表的結構:
假使您的網站的使用者表(假使名稱為MyUserTable)只有Name,Nickname:
那麼,您可以建立一張擴充套件表(假使名稱為UserExtentIM),用於儲存其他資訊:
接下來,您只需要把Users表刪掉,重新建立一個名稱為Users的檢視,然後用上文處理Users, UserBase, UserExtent的方法,在Users檢視上建好觸發器,在觸發器中對MyUserTable,UserExtentIM表進行增刪改即可,Lesktop的儲存過程對User進行讀取和增刪改時,將通過觸發器自動轉換成對MyUserTable,UserExtentIM的操作,因此不需要修改任何儲存過程和原始碼,當然也不會對你原有的資料庫造成影響。
相關文章
- Hibernate進行增刪查改
- SQL增刪改查SQL
- Odoo禁止Tree、Form檢視增刪改編輯OdooORM
- sql指令,增,刪,查,改SQL
- 用thinkphp進行增刪改查的操作PHP
- 總結在SQL Server檢視管理中限制條件SQLServer
- SQL 基礎增、刪、改、查SQL
- sql 常見增刪改查SQL
- sql server中如何檢視執行效率不高的語句SQLServer
- 基於Koa(nodejs框架)對json檔案進行增刪改查NodeJS框架JSON
- AngularJS中使用$http對MongoLab資料表進行增刪改查AngularJSHTTPGo
- 基本 SQL 之增刪改查(二)SQL
- sql-server檢視SQLServer
- Sql Server系列:檢視SQLServer
- SQL Server中對圖片進行儲存和輸出SQLServer
- HBase之四--(1):Java操作Hbase進行建表、刪表以及對資料進行增刪改查,條件查詢...Java
- JavaWeb中jdbc增刪查改JavaWebJDBC
- mybatis中的增刪改操作MyBatis
- 【檢視】利用USER_TAB_MODIFICATIONS檢視輔助監控表的增刪改等操作
- 利用Express+MySQL進行簡單的增刪改查ExpressMySql
- php 建立頁面表單並進行增刪改查PHP
- SQL Server觸發器建立、刪除、修改、檢視示例步驟SQLServer觸發器
- 常用SQL語句1-增刪改查SQL
- sql server 檢視tempdb使用的相關檢視SQLServer
- 增刪改查
- MySQL表的增刪改查(進階)下MySql
- abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之增刪改檢視(八)UI
- 在SQL Server中快速刪除重複記錄(轉)SQLServer
- Go實現對MySQL的增刪改查GoMySql
- AppBox升級進行時 - Entity Framework的增刪改查APPFramework
- spring data mongodb 如何以事物的方式進行增刪改查SpringMongoDB
- 在 WebSphere Process Server 中進行版本管理WebServer
- Node.js(nodejs)對本地JSON檔案進行增、刪、改、查操作(輕車熟路)Node.jsNodeJSJSON
- mac下通過dscl命令對使用者/使用者組進行增刪改查操作Mac
- SQL Server 2008對日期時間型別的改進SQLServer型別
- SQL Server檢視管理中的四個限制條件SQLServer
- Python中CRUD增刪改查教程Python
- SQL Server進行Crash RecoverySQLServer