zoukankan      html  css  js  c++  java
  • SQL Server 利用触发器对多表视图进行更新

    其步骤就是:利用update操作触发器产生的2个虚拟表【inserted】用来存储修改的数据信息和【deleted】表,然后将对应的数据更新到对应数据表中的字段信息中;

    1.首先创建3个表:

    a.信息表:

    复制代码
     1 USE [SQL-LI]
     2 BEGIN TRANSACTION CHUANGJIAN_XINXIN_TAB 
     3 --创建命名为【XINXIN_TAB】的数据表,同时不允许字段为空
     4 CREATE TABLE XINXIN_TAB
     5 (
     6 姓名 NVARCHAR(10) NOT NULL,
     7 性别 NVARCHAR(1) NOT NULL,
     8 学号 INT NOT NULL,
     9 班级 NVARCHAR(20) NOT NULL,
    10 出生日期 DATE NOT NULL,
    11 CONSTRAINT XUEHAO_YUESU PRIMARY KEY CLUSTERED
    12 ([学号]ASC)
    13 )
    14 COMMIT TRANSACTION CHUANGJIAN_XINXI_TAB
    15 GO
    复制代码

    b.明细分数表:

    复制代码
    USE [SQL-LI] 
    CREATE TABLE FENSHU_TAB
    (
    [学号] INT NOT NULL,
    [语文] DECIMAL(3,1) NOT NULL,
    [数学] DECIMAL(3,1) NOT NULL,
    [英语] DECIMAL(3,1) NOT NULL
    )
    GO
    复制代码

    c.综合分数表:

    复制代码
    USE [SQL-LI] 
    CREATE TABLE ZHONGHE_TAB
    (
    [姓名] NVARCHAR(10) NOT NULL,
    [学号] INT NOT NULL,
    [总分] DECIMAL(4,1) NOT NULL,
    [平均分] DECIMAL(3,1) NOT NULL)
    GO
    复制代码

    2.1.【信息表】和【明细分数表】插入对应表中的数据:

    插入【信息表】和【明细分数表】的数据

    【信息表】的数据:

    【明细分数表】的数据:

    2.2.运算记录【综合分数表】的数据:

    插入【ZHONGHE_TAB】中的数据

     【综合分数表】的数据:

    3.1.1.创建3个表关联的视图:

    复制代码
     1 USE [SQL-LI] 
     2 GO
     3 CREATE VIEW SHITU_FFENSHU_XINXI(姓名,学号,平均分,总分,班级,出生日期)
     4 AS
     5 SELECT TOP 800 X.姓名 ,F.学号 ,Z.平均分 ,Z.总分 ,X.班级 ,X.出生日期 
     6 FROM[DBO].XINXIN_TAB AS X INNER JOIN [DBO].FENSHU_TAB AS F ON X.学号 =F.学号 
     7     INNER JOIN [DBO].ZHONGHE_TAB AS Z ON F.学号 =Z.学号 
     8     ORDER BY F.学号 ASC
     9     GO
    10     
    复制代码

    查看创建的视图:

    3.2.1.通过视图修改多个数据表的信息????:

    1 UPDATE [SQL-LI].[dbo].[SHITU_FFENSHU_XINXI]
    2    SET [姓名] = 'aaaaa', --此字段在【信息表】中
    3        [平均分] =111    --此次字段在【分数】中
    4  WHERE [学号]=6080
    5 GO

    结果:

    下面就写个利用触发器对其多表进行更新的方法:

    a.这里就利用instead of 代替触发来代替对各表中的字段内的信息进行修改:

    复制代码
    USE [SQL-LI] 
    GO
    CREATE TRIGGER TRIGG_UPDATE --创建一个upda触发器DML
    --关联到[SHITU_FFENSHU_XINXI]视图上
    ON[DBO].[SHITU_FFENSHU_XINXI]
    INSTEAD OF UPDATE  --代替触发器执行UPDATE功能;【但是只能定义一个增删改的INSTEAD OF代替触发】。
    AS
    --声明接受变量用于存储【inserted】表上的数据
    DECLARE @XINGMING NVARCHAR(10),@XUEHAO INT,@AVGFEN DECIMAL(3,1),@ZONGFEN DECIMAL(4,1),
            @BANJI NVARCHAR(20),@CHUSHENGRIQI DATE;
            --筛选【inserted】表中学号最小的一行数据
    SELECT @XUEHAO =MIN(学号) FROM[inserted] 
    --遍历【inserted】表
    
    WHILE(@XUEHAO IS NOT NULL)
    BEGIN
    --将【inserted】表中的数据存放到相应的变量中
    SELECT @XUEHAO =MIN([学号])FROM[inserted] WHERE [学号]=@XUEHAO  
    SELECT @XINGMING=[姓名] FROM[inserted] WHERE[学号] =@XUEHAO 
    SELECT @AVGFEN=[平均分]FROM[inserted] WHERE[学号] =@XUEHAO 
    SELECT @ZONGFEN=[总分] FROM[inserted] WHERE[学号] =@XUEHAO 
    SELECT @BANJI =[班级]FROM[inserted] WHERE[学号] =@XUEHAO 
    SELECT @CHUSHENGRIQI=[出生日期]FROM[inserted] WHERE[学号] =@XUEHAO 
    
    --找出视图中的字段对应相应表的字段
    /*因为视图中的[姓名]/[班级]/[出生日期]字段是XINXIN_TAB 中的字段,故修改【XINXIN_TAB】中对应的字段
    数据之*/
    UPDATE[DBO].XINXIN_TAB 
    SET [姓名]=@XINGMING  ,[班级]=@BANJI  ,[出生日期]=@CHUSHENGRIQI 
    WHERE[学号]=@XUEHAO 
    
    --道理同上
    UPDATE[DBO].FENSHU_TAB 
    SET[学号]=@XUEHAO 
    WHERE[学号]=@XUEHAO 
    
    --道理同上
    UPDATE[DBO].ZHONGHE_TAB 
    SET[平均分]=@AVGFEN ,[总分]=@ZONGFEN 
    WHERE[学号]=@XUEHAO 
    
    --修改完成后就开始筛选【inserted】表中下一条数据记录
    SELECT @XUEHAO =MIN([学号])FROM[inserted] WHERE[学号]>@XUEHAO
    --然后给while中判断 
    END
    GO
    复制代码

    a1.注意的是视图不是数据表没有存放数据,将从【inserted】表中的数据提取后赋给对应数据表内的字段中;

    对象资源管理器中的图示:

     3.万事俱备,开始通过视图修改多表中的数据(验证):

    a.

    复制代码
    USE [SQL-LI] 
    --查看未修改前的视图数据信息
    SELECT* FROM[DBO].SHITU_FFENSHU_XINXI 
    GO
    
    UPDATE[DBO].SHITU_FFENSHU_XINXI 
    --修改【SHITU_FFENSHU_XINXI】中对应的字段数据
    SET[姓名]='liyifeng' ,[平均分]=66.6 ,[总分]=88.8 ,[班级]='计算机SQLServer' ,[出生日期]='2013-05-05' 
    --修改筛选
    WHERE[学号]=6080 
    GO
    --查看修改后的视图数据信息
    SELECT* FROM[DBO].SHITU_FFENSHU_XINXI 
    GO
    复制代码

    修改前后对比的结果图示:

     修改后的数据表中的数据:

    USE [SQL-LI] 
    SELECT* FROM[XINXIN_TAB]  WHERE[学号]=6080
    SELECT* FROM[FENSHU_TAB]  WHERE[学号]=6080
    SELECT* FROM[ZHONGHE_TAB] WHERE[学号]=6080
    GO

     4.触发器在数据库里面就像颗炸弹一样,只要满足气要求就会被触发,就会对数据库里面的数据进行触发修改,所以不需要室就尽量将其关闭掉,用的时候就将其开启:

    关闭:

    USE [SQL-LI] 
    GO
    DISABLE TRIGGER [DBO].TRIGG_UPDATE --关闭触发器【TRIGG_UPDATE】
    ON SHITU_FFENSHU_XINXI
    GO

    开启:

    USE [SQL-LI] 
    GO
    ENABLE TRIGGER [DBO].TRIGG_UPDATE  --开启触发器【TRIGG_UPDATE】
    ON[DBO].[SHITU_FFENSHU_XINXI] --触发器所在的视图
    GO

    GO

    希望我写的能为你解决一点问题,还望指教!谢谢!

    转载:http://www.cnblogs.com/liyifeng/archive/2013/05/05/3056968.html

  • 相关阅读:
    P2324 [SCOI2005]骑士精神
    Codeforces Round #574 (Div. 2) A~E Solution
    P4132 [BJOI2012]算不出的等式
    spring笔记(三)
    spring笔记(二)
    C3P0连接池参数解释
    spring笔记(一)
    hibernate笔记(四)
    hibernate笔记(三)
    hibernate笔记(二)
  • 原文地址:https://www.cnblogs.com/BluceLee/p/8757577.html
Copyright © 2011-2022 走看看