- 热门文章:
- · SQL 语法参考手册(SQL)
- · 刷新SP到一数据库方便制作XSD文件
- · 如何跨进程发送字符串?(收藏)
- · 如何调用NetMessageBufferSend发送消息?(改编)
- · 如何隐藏窗口的TITLE标题?(原创)
- · 如何切换中英文输入法及全角/半角?(原创)
- · 如何禁止RICHTEXT控件自动换行?(改编)
- · 如何在DW中按下左右光标时切换到相邻单元格?(原创)
- · 如何在DDDW中敲入字母时DDDW始终下拉状态?(原创)
- · 如何使鼠标单击ITEM单元格时黑色选中色变为其他颜色?(原创)
- · 如何使指定ITEM单元格变色?(原创)
- · SQL Server日期计算(收藏)
对MSsql Server的view使用instead of trigger进行视图更新
最近常常使用VIEW,但MSsql Server不允许对关联两个基表以上的VIEW进行更新操作。由于项目上的需要,花了一个晚上的时间研究了一下。抽点时间把过程和心得记录下来。
先看看权威说法:
可更新视图:
Microsoft SQL Server 2000 以两种方法增强可更新视图的类别:
INSTEAD OF 触发器:可以在视图上创建 INSTEAD OF 触发器,以使视图可更新。执行 INSTEAD OF 触发器,而不是执行定义触发器的数据修改语句。该触发器使用户得以指定一套处理数据修改语句时需要执行的操作。因此,如果在给定的数据修改语句(INSERT、UPDATE 或 DELETE)上存在视图的 INSTEAD OF 触发器,则通过该语句可更新相应的视图。有关 INSTEAD OF 触发器的更多信息,请参见设计 INSTEAD OF 触发器。
分区视图:如果视图属于称为"分区视图"的指定格式,则该视图的可更新性受限于某些限制。本主题稍后将讨论分区视图及其可更新性。
必要时,SQL Server 将"本地分区视图"辨别为所有参与表和视图都在同一 SQL Server 上的视图,而将"分布式分区视图"辨别为视图中至少有一个表驻留在不同(远程)服务器上的视图。
如果视图没有 INSTEAD OF 触发器,或者视图不是分区视图,则视图只有满足下列条件才可更新:
select_statement 在选择列表中没有聚合函数,也不包含 TOP、GROUP BY、UNION(除非视图是本主题稍后要描述的分区视图)或 DISTINCT 子句。聚合函数可以用在 FROM 子句的子查询中,只要不修改函数返回的值。有关更多信息,请参见聚合函数。
select_statement 的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。
select_statement 中的 FROM 子句至少引用一个表。select_statement 必须不仅只包含非表格格式的表达式(即不是从表派生出的表达式)。例如,以下视图是不可更新的:
CREATE VIEW NoTable AS
SELECT GETDATE() AS CurrentDate,
@@LANGUAGE AS CurrentLanguage,
CURRENT_USER AS CurrentUser
INSERT、UPDATE 和 DELETE 语句在可以引用可更新视图之前,也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新,并且所编写的 UPDATE 或 INSERT 语句只修改视图的 FROM 子句引用的一个基表中的数据时,UPDATE 和 INSERT 语句才能引用视图。只有当视图在其 FROM 子句中只引用一个表时,DELETE 语句才能引用可更新的视图。
分区视图比较麻烦,本文采用INSTEAD OF 触发器的方法解决!
我的实验如下:先建立两个表Table1、Table2。表结构分别如下:
备注:
1, 其中Table2中的d字段为自动性,步长为默认值1
2, Table1中的a字段为自动性,步长为默认值1
然后,建立视图VIEW1:
SELECT dbo.Table2.d, dbo.Table2.e, dbo.Table1.b, dbo.Table1.c
FROM dbo.Table2 INNER JOIN
dbo.Table1 ON dbo.Table2.a = dbo.Table1.a
显然,该视图包含字段d,e,b,c四个字段
问题很明确?如何向这个视图增加数据呢?几番尝试最终得到正确的sql为:
CREATE TRIGGER Trig_INS_VIEW1 ON VIEW1
INSTEAD OF INSERT
AS
DECLARE @a INT
DECLARE @b INT
BEGIN
SET NOCOUNT ON
INSERT INTO Table1 SELECT b,c FROM inserted
select @a=(max(a)+1) from Table1
select @b=e from inserted
INSERT INTO Table2(a,e) VALUES (@a,@b)
END
下一篇:SQL 语法参考手册(SQL) >>
相关文章:
- · sql server数据库定时自动备份
- · (MS SQL Server)SQL语句导入导出大全
- · SQL语句导入导出大全
- · 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- · 如何才能快速知道数据库中每个表的大小?
- · SQL 以日期动态更新维护的数据,一周排程时间日期设计
- · 使用dbms_rectifier_diff解决高级复制中的数据冲突问题
- · 数据库主键int型和str型效率比较
- · 一次TempDB损毁的处理过程
- · 数据量过大时数据库操作的处理
- · SQL语句导入导出大全
- · SQL 语法参考手册(SQL)
- · Informix SQL函数的详细用法
- · 根据表中数据生成insert语句的存储过程
- · SQL SERVER日志清除的两种方法
- · 分组统计方法:用Group By
- · 数据库主键int型和str型效率比较
- · PL/SQL小技巧一个:在子类中怎么调用父类被重载的方法
- · SQL Server merge replication: 巧用Merge Agent的hostname参数创建dynamic filter
- · PowerDesigner设计数据库
- · 如何实时查看数据库当前活动连接
- · SQL语句优化技术分析
- · datawindow java
- · vb连接sql模块代码
- · SQL server阻塞(来自微软技术支持人员)
- · SQL Server 2000+ MS WIN2003群集服务配置
- · SQL SERVER定时作业的设置方法
- · sql server 中字段类型及说明
- · 海量数据库的查询优化及分页算法方案
- · GeowayGIS空间信息综合应用开发平台
- · 公安110接处警GIS系统解决方案
- · SQL Server加过密的存储过程可以被解密?
- · 海量数据库的查询优化及分页算法方案
- · 写PL/SQL程序时碰到的一些问题
- · DataGuard - 利用Cascaded Redo Log Destinations避免WAN稳定性问题
- · 使用GUID作为数据表主键的好处
- · 如何让你的SQL运行得更快!
- · SQL server阻塞(来自微软技术支持人员)
