对MSsqlServer的view使用insteadoftrigger进行视图更新
来源:互联网 发布:c 定义json对象数组 编辑:程序博客网 时间:2024/05/22 03:29
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
最近常常使用view,但MSsqlServer不允许对关联两个基表以上的view进行更新操作。由于项目上的需要,花了一个晚上的时间研究了一下。抽点时间把过程和心得记录下来。
先看看权威说法:
可更新视图:
Microsoft2000以两种方法增强可更新视图的类别:
INSTEADOF触发器:可以在视图上创建INSTEADOF触发器,以使视图可更新。执行INSTEADOF触发器,而不是执行定义触发器的数据修改语句。该触发器使用户得以指定一套处理数据修改语句时需要执行的操作。因此,如果在给定的数据修改语句(INSERT、UPDATE或DELETE)上存在视图的INSTEADOF触发器,则通过该语句可更新相应的视图。有关INSTEADOF触发器的更多信息,请参见INSTEADOF触发器。
分区视图:如果视图属于称为"分区视图"的指定格式,则该视图的可更新性受限于某些限制。本主题稍后将讨论分区视图及其可更新性。
必要时,SQLServer将"本地分区视图"辨别为所有参与表和视图都在同一SQLServer上的视图,而将"分布式分区视图"辨别为视图中至少有一个表驻留在不同(远程)服务器上的视图。
如果视图没有INSTEADOF触发器,或者视图不是分区视图,则视图只有满足下列条件才可更新:
select_statement在选择列表中没有聚合函数,也不包含TOP、GROUPBY、UNION(除非视图是本主题稍后要描述的分区视图)或DISTINCT子句。聚合函数可以用在FROM子句的子查询中,只要不修改函数返回的值。有关更多信息,请参见聚合函数。
select_statement的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。
select_statement中的FROM子句至少引用一个表。select_statement必须不仅只包含非表格格式的表达式(即不是从表派生出的表达式)。例如,以下视图是不可更新的:
CREATEviewNoTableAS
SELECTGETDATE()ASCurrentDate,
@@LANGUAGEASCurrentLanguage,
CURRENT_USERASCurrentUser
INSERT、UPDATE和DELETE语句在可以引用可更新视图之前,也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新,并且所编写的UPDATE或INSERT语句只修改视图的FROM子句引用的一个基表中的数据时,UPDATE和INSERT语句才能引用视图。只有当视图在其FROM子句中只引用一个表时,DELETE语句才能引用可更新的视图。
分区视图比较麻烦,本文采用INSTEADOF触发器的方法解决!
我的实验如下:先建立两个表Table1、Table2。表结构分别如下:
备注:
1, 其中Table2中的d字段为自动性,步长为默认值1
2, Table1中的a字段为自动性,步长为默认值1
然后,建立视图view1:
SELECTdbo.Table2.d,dbo.Table2.e,dbo.Table1.b,dbo.Table1.c
FROMdbo.Table2INNERJOIN
dbo.Table1ONdbo.Table2.a=dbo.Table1.a
显然,该视图包含字段d,e,b,c四个字段
问题很明确?如何向这个视图增加数据呢?几番尝试最终得到正确的sql为:
CREATETRIGGERTrig_INS_view1ONview1
INSTEADOFINSERT
AS
DECLARE@aINT
DECLARE@bINT
BEGIN
SETNOCOUNTON
INSERTINTOTable1SELECTb,cFROMinserted
select@a=(max(a)+1)fromTable1
select@b=efrominserted
INSERTINTOTable2(a,e)VALUES(@a,@b)
END
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
最近常常使用view,但MSsqlServer不允许对关联两个基表以上的view进行更新操作。由于项目上的需要,花了一个晚上的时间研究了一下。抽点时间把过程和心得记录下来。
先看看权威说法:
可更新视图:
Microsoft2000以两种方法增强可更新视图的类别:
INSTEADOF触发器:可以在视图上创建INSTEADOF触发器,以使视图可更新。执行INSTEADOF触发器,而不是执行定义触发器的数据修改语句。该触发器使用户得以指定一套处理数据修改语句时需要执行的操作。因此,如果在给定的数据修改语句(INSERT、UPDATE或DELETE)上存在视图的INSTEADOF触发器,则通过该语句可更新相应的视图。有关INSTEADOF触发器的更多信息,请参见INSTEADOF触发器。
分区视图:如果视图属于称为"分区视图"的指定格式,则该视图的可更新性受限于某些限制。本主题稍后将讨论分区视图及其可更新性。
必要时,SQLServer将"本地分区视图"辨别为所有参与表和视图都在同一SQLServer上的视图,而将"分布式分区视图"辨别为视图中至少有一个表驻留在不同(远程)服务器上的视图。
如果视图没有INSTEADOF触发器,或者视图不是分区视图,则视图只有满足下列条件才可更新:
select_statement在选择列表中没有聚合函数,也不包含TOP、GROUPBY、UNION(除非视图是本主题稍后要描述的分区视图)或DISTINCT子句。聚合函数可以用在FROM子句的子查询中,只要不修改函数返回的值。有关更多信息,请参见聚合函数。
select_statement的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。
select_statement中的FROM子句至少引用一个表。select_statement必须不仅只包含非表格格式的表达式(即不是从表派生出的表达式)。例如,以下视图是不可更新的:
CREATEviewNoTableAS
SELECTGETDATE()ASCurrentDate,
@@LANGUAGEASCurrentLanguage,
CURRENT_USERASCurrentUser
INSERT、UPDATE和DELETE语句在可以引用可更新视图之前,也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新,并且所编写的UPDATE或INSERT语句只修改视图的FROM子句引用的一个基表中的数据时,UPDATE和INSERT语句才能引用视图。只有当视图在其FROM子句中只引用一个表时,DELETE语句才能引用可更新的视图。
分区视图比较麻烦,本文采用INSTEADOF触发器的方法解决!
我的实验如下:先建立两个表Table1、Table2。表结构分别如下:
备注:
1, 其中Table2中的d字段为自动性,步长为默认值1
2, Table1中的a字段为自动性,步长为默认值1
然后,建立视图view1:
SELECTdbo.Table2.d,dbo.Table2.e,dbo.Table1.b,dbo.Table1.c
FROMdbo.Table2INNERJOIN
dbo.Table1ONdbo.Table2.a=dbo.Table1.a
显然,该视图包含字段d,e,b,c四个字段
问题很明确?如何向这个视图增加数据呢?几番尝试最终得到正确的sql为:
CREATETRIGGERTrig_INS_view1ONview1
INSTEADOFINSERT
AS
DECLARE@aINT
DECLARE@bINT
BEGIN
SETNOCOUNTON
INSERTINTOTable1SELECTb,cFROMinserted
select@a=(max(a)+1)fromTable1
select@b=efrominserted
INSERTINTOTable2(a,e)VALUES(@a,@b)
END
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 对MSsqlServer的view使用insteadoftrigger进行视图更新
- 对MSsql Server的view使用instead of trigger进行视图更新
- 使用ViewPager时,如何对view进行更新
- 使用ViewPager时,如何对view进行更新
- oracle 视图(view)的使用
- 对数据库视图view的理解
- 对任何视图的手势进行控制
- MSSQLSERVER日期函数的使用
- 利用C#对远程服务进行操作,如MSSQLSERVER等。
- MSSQLSERVER数据库- 视图
- 如何使用AutoLayout对两个以及两个以上的平行或者相互依赖的view进行布局
- Spring boot 使用Thymeleaf对web视图进行渲染
- DB2视图VIEW使用
- 在Oracle的连接视图上进行数据更新操作
- 对数据库根据符合条件的记录 逐个进行更新使用的连接语句
- 对视图进行 DML 操作
- FORM 更新多表视图(Form直接更新View对应的数据表)
- ViewGroup和View的理解和当子视图发生更新时通知viewgroup更新
- SQLSERVER的函数
- HOWTO:在实例之间传输登录和密码
- 数据转换-delphi资料网上搜集(来源:万一的博客)
- MSFlexGrid 实现不连续选择单元格和实现保存MSFlexGrid数据到.DAT文件,并能从.DAT读出
- Symbian开发学习笔记之二
- 对MSsqlServer的view使用insteadoftrigger进行视图更新
- 刷新SP到一方便制作XSD文件
- GridView 自定义分页
- 如何跨进程发送字符串?(收藏)
- 如何调用NetMessageBufferSend发送消息?(改编)
- JAVA ResultSet概论
- 微软推出Windows Server 2008官网提供下载试用
- 如何切换中英文输入法及全角/半角?(原创)
- 如何禁止RICHTEXT控件自动换行?(改编)