加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

对MSsql Server的view行使instead of trigger举办视图更新

发布时间:2018-08-17 12:51:37 所属栏目:电商 来源:站长网
导读:最近经常行使VIEW,但MSsql Server不应承对关联两个基表以上的VIEW举办更新操纵。因为项目上的必要,花了一个晚上的时刻研究了一下。抽点时刻把进程和心得记录下来。 先看看势力巨子说法: 可更新视图: Microsoft SQL Server 2000 以两种要领加强可更新视图的

       最近经常行使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

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读