|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。server|视图
比来经常利用VIEW,但MSsqlServer不同意对联系关系两个基表以上的VIEW举行更新操纵。因为项目上的必要,花了一个早晨的工夫研讨了一下。抽点工夫把历程和心得纪录上去。
先看看威望说法:
可更新视图:
MicrosoftSQLServer2000以两种办法加强可更新视图的种别:
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
Merge将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用 |
|