• SQL server 触发器、视图


    一.触发器

    1.触发器为特殊类型的存储过程,可在执行语言事件时自动生效。SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

      主要讲述DML触发器,DML触发器有两种:AFTER(FOR),INSTEAD OF触发器,同时DML 触发器使用 deleted 和 inserted 逻辑(概念)表。它们在结构上类似于定义了触发器的表,即对其尝试执行了用户操作的表。在 deleted 和 inserted 表保存了可能会被用户更改的行的旧值或新值。

    • 对于INSERT 操作,inserted保留新增的记录,deleted无记录
    • 对于DELETE 操作,inserted无记录,deleted保留被删除的记录
    • 对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录

    2.禁用所有触发器的语句
    alter table student disable trigger all
    --启用所有触发器的语句
    alter table student enable trigger all
    --如果知道触发器的名字,可以将all改成所要关闭或启用的触发器的名称

    create trigger TR_student_Delete --创建一个delete触发器
    on student --对于那一个表的
    instead of delete --替换掉delete 语句
    as
    insert into student values('成龙','男','三班',1007,1008,1009)
    go
    --执行一个delete语句,针对student表
    delete from student where code =4
    --执行上面语句的时候触发了TR_student_Delete触发器
    --因为里面是instead of 是替换掉我执行的这个delete语句
    --所以,code为4的数据没有被删除
    --并且添加进去了一行新的数据

    create trigger TR_student_Delete2 --创建一个delete触发器
    on student --对于那一个表的
    for delete --在执行了外部的delete语句后执行触发器里面的语句
    as --与after相同
    insert into student values('全智贤','女','二班',1004,1005,1006)
    go
    --执行delete语句
    delete from student where code =30
    --执行delete语句在student表上的时候,发现有触发器
    --查看到是for或after
    --首先执行完要执行的这个语句
    --然后执行触发器里面的语句


    --执行删除一条数据,
    --用deleted来表示被删除的那条数据,可以从中获取值
    create trigger TR_Teacher_delete
    on teacher
    instead of delete
    as
    declare @code int
    select @code =(select code from deleted)
    update teacher set name ='刘德华' where code = @code
    go
    --执行
    delete from teacher where code = 1005
    --上面的语句是应该在触发器前执行,所以用deleted表示这条数据
    --可以在触发器中获取这行数据里面的任何列
    --可以直接拿去使用


    --insert添加一条数据,inserted表示新添加的数据,
    --从中获取教师编号,
    --并且根据教师编号来查看是lesson是音乐么,如果是音乐变成语文。
    create trigger TR_teacher_Insert
    on teacher
    for insert
    as
    declare @code int
    select @code = (select code from inserted)
    declare @lesson char(10)
    select @lesson = lesson from teacher where code =@code
    if @lesson='音乐'
    update teacher set lesson ='语文' where code =@code
    go
    --执行
    insert into teacher values('谭咏麟','音乐',55,'1950-04-05')

    --对于INSERT 操作,inserted保留新增的记录,deleted无记录
    --对于DELETE 操作,inserted无记录,deleted保留被删除的记录
    --对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录

    二.视图

    1.select* from cangku
       select * from gongying
    --将以上两个语句写成一个语句显示
    select cangku.ccode,cname,cprice,cshu,cgcode,gongying.gname,gtel from cangku , gongying where cangku.cgcode=gongying.gcode
    --join on
    select cangku.ccode,cname,cprice,cshu,cgcode,gongying.gname,gtel from cangku join gongying on cangku.cgcode=gongying.gcode

    2.视图创建(语句进行创建视图)
    create view cangkugongying--创建视图的语法
    as--as go中间放上我所需要的一个查询语句
    select cangku.ccode,cname,cprice,cshu,cgcode,gongying.gname,gtel from cangku join gongying on cangku.cgcode=gongying.gcode
    go
    --调用视图
    select *from cangkugongying--视图就是一个虚拟的表,所以可以from

    3.视图创建(鼠标操作创建视图)

    在视图上右击选择新建视图,

    在弹出的页面选择要建立关系的表的名称,

    选择需要的列的名称,并保存取名。

    保存完毕后就可以利用语句直接调用视图。视图就是一个虚拟的新建表。

    select * from xin
    select cname,cshu from xin

  • 相关阅读:
    九章强化最后一章
    强化第一章
    双指针
    数据结构强化1
    动态规划强化
    动态规划
    selenium上传文件,怎么操作
    在python 3.6的eclipse中,导入from lxml import etree老是提示,Unresolved import:etree的错误
    在python 3.6下用pip 安装第三方库,比如pip install requests,老是报错 Fatal error in launcher: Unable to create process using '"'
    python3 + selenium + eclipse 中报错:'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
  • 原文地址:https://www.cnblogs.com/Fate-rail/p/4995208.html
Copyright © 2020-2023  润新知