【SQL开源代码栏目提醒】:网学会员为广大网友收集整理了,在SQL Server中对视图进行增删改 - 数据库,希望对大家有所帮助!
在
SQL Server中对视图进行增删改 2011-03-21 17:53:35 分类
SQL Server 阅读12 评论0 字号大中小 订阅 Lesktop
开源IM发布以后有一些网友问及如何在嵌入IM后与自己网站的用户系统整合即如何让嵌入的IM直接使用网站原有的用户数据库而不需要将已有的用户数据导入到IM的数据库中。
Lesktop对Users表存储用户登录名昵称密码等信息的表都是在存储过程中进行增删改的显然如果直接去改Users表相关的存储过程是比较麻烦的本文将介绍一种较为简单的方法在不需要修改存储过程和源
代码的情况下整合用户
系统。
为实现这个目的先介绍一下在
SQL SERVER中如何对视图进行增删改。
假使用户有NameRemark两项信息但是没有存放在同一张表中而是分开存储在两个表UserBaseID NameUserExtentID 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视图进行增删改实现对UserBaseUserExtent表进行修改。
显然如果对Users直接执行insertupdatedelete是不可能的执行时会发生以下错误 在
SQL Server中对视图增删改可以通过触发器来实现例如我们可以创建一个INSERT触发器当在视图Users上执行INSERT时在触发器中实现对UserBaseUserExtent的INSERT操作。
在触发器中可以通过名称为inserted的表获取到新插入的行具体
代码如下 CREATE TRIGGER dbo.Users_Insert ON dbo.Users INSTEAD OF INSERT as declare name nvarchar32 remark nvarchar32 declare ins_cursor cursor for select Name Remark from inserted open ins_cursor fetch next from ins_cursor into name remark whilefetch_status 0 begin --读取所有行并插入 insert into UserBase Name values name insert into UserExtentID 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 nvarchar32 remark nvarchar32 insert temp nameremark values Nuser1 N1 insert temp nameremark values Nuser2 N2 --插入两行数据 insert Usersname remark select nameremark from temp drop table temp select from Users select from UserBase select from UserExtent 执行结果如下 创建更新触发器与INSERT触发器类似受影响的行会保存在inserted中可以从inserted表中获取受影响的行并更新UserBaseUserExtent具体
代码如下 CREATE TRIGGER dbo.Users_Update ON dbo.Users INSTEAD OF UPDATE as update UserExtent set UserExtent.Remarkins.Remark from inserted ins where UserExtent.ID ins.ID update UserBase set UserBase.Nameins.Name from inserted ins where UserBase.ID ins.ID 测试
代码 --清空所有数据 delete from UserExtent delete from UserBase --插入两行数据 insert Users nameremark values Nuser1 N1 insert Users nameremark values Nuser2 N2 insert Users nameremark values Nuser3 N2 --修改后两行数据 UPDATE Users set Remark N3 where Remark N2 --输出数据 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 nameremark values Nuser1 N1 insert Users nameremark values Nuser2 N2 insert Users nameremark values Nuser3 N2 --删除后两行数据 delete from Users where Remark N2 --输出数据 select from Users select from UserBase select from UserExtent 运行结果 上文已介绍了如何对视图进行增删改接下来将介绍如何通过建立视图并添加增删改触发器实现Lesktop
开源IM用户系统的整合。
首先介绍一下Lesktop
开源IM数据库中Users表的结构 假使您的网站的用户表假使名称为MyUserTable只有NameNickname 那么您可以建立一张扩展表假使名称为UserExtentIM用于存储其他信息 接下来您只需要把Users表删掉重新建立一个名称为Users的视图然后用上文处理Users UserBase UserExtent的方法在Users视图上建好触发器在触发器中对MyUserTableUserExtentIM表进行增删改即可Lesktop的存储过程对User进行读取和增删改时将通过触发器自动转换成对MyUserTableUserExtentIM的操作因此不需要修改任何存储过程和源
代码当然也不会对你原有的数据库造成影响