zoukankan      html  css  js  c++  java
  • SQL触发器、事务

    触发器:

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

                            当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器。登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。            

                     当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。

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

    对于INSERT 操作,inserted保留新增的记录,deleted无记录

    对于DELETE 操作,inserted无记录,deleted保留被删除的记录

    对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录

    示例一:DELETE触发器的创建和执行,用的Instead Of

    示例二:执行删除一条数据,用deleted来表示被删除的那条数据,从中获取

    示例三:insert添加一条数据,inserted表示新添加的数据,从中获取教师编号,并且根据教师编号来查看是男是女,调换男女。

    事务:

    数据库事务(Database Transaction)  是指作为单个逻辑工作单元执行的一系列操作。

    事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

    begin tran (或transaction)    --开始事务
    commit                                                              --提交事务
    rollback                                                              --回滚事务

    事务特性:

    A原子性(atomicity

    C一致性(consistency

    I隔离性(isolation

    D持久性(durability

    @@ERROR 是判断事务有没有错的条件,无错时值为0,有错时值不为0

    事务创建以及使用示例:

    select * from cangku
    begin tran  --开始事务
    insert into cangku values(10008,'Boxster',70,10,1004)--没有错
    if @@ERROR >0
    begin--每一个执行语句后面写这句话是为了如果上一句有错误,
    --下面不管有多少执行语句,都不会执行,直接到tranrollback
        goto tranrollback--到最后一个执行语句的tranrollback
    end
    insert into cangku values(10002,'极光',66.50,10,1002)--主键约束
    if @@ERROR>0
        goto tranrollback
    insert into cangku values(10009,'XF',40,10,1003)--没有错
    if @@ERROR>0
    begin
        tranrollback:        --需要加上冒号
        rollback tran        --回滚所有事务中执行过的命令(撤销所有执行语句)
    end
    else
    begin
        commit tran   --提交事务(只有真正的走到了commit才是真正的更改数据库的数据)
    end

     

  • 相关阅读:
    pytest文档55-plugins插件开发
    pytest文档54-Hooks函数terminal打印测试结果(pytest_report_teststatus)
    Linux内存占用过高排查过程
    系统日志:/var/log/messages
    win10 安装oracle 11gR2_database(内附下载地址)
    CentOS 7 下 Docker 的离线安装方法
    docker 常用命令
    【docker】如何将服务器加入集群,成为子节点
    Docker管理面板系列——Portainer
    基于Docker的Consul服务发现集群搭建
  • 原文地址:https://www.cnblogs.com/wy1992/p/6085841.html
Copyright © 2011-2022 走看看