精华内容
下载资源
问答
  • MySQL不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?下面是一种实现的方法。思路就是想办法在触发器中...

    MySQL

    不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?

    下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。

    mysql> create table t_control(id int primary key);

    Query OK, 0 rows affected (0.11 sec)

    mysql> insert into t_control values (1);

    Query OK, 1 row affected (0.05 sec)

    mysql> create table t_bluerosehero(id int primary key,col

    int);

    Query OK, 0 rows affected (0.11 sec)

    mysql> delimiter //

    mysql> create trigger tr_t_bluerosehero_bi before insert on

    t_bluerosehero

    -> for each row

    -> begin

    ->  if new.col>30 then

    ->          insert

    into t_control values (1);

    ->  end if;

    -> end;

    -> //

    Query OK, 0 rows affected (0.08 sec)

    mysql> delimiter ;

    mysql>

    mysql> insert into t_bluerosehero values (1,20);

    Query OK, 1 row affected (0.25 sec)

    mysql> insert into t_bluerosehero values (2,40);

    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

    mysql>

    mysql> select * from t_bluerosehero;

    +----+------+

    | id | col  |

    +----+------+

    |  1 |   20 |

    +----+------+

    1 row in set (0.00 sec)

    mysql>

    或者

    mysql> delimiter //

    mysql> create trigger tr_t_bluerosehero_bi before insert on

    t_bluerosehero

    -> for each row

    -> begin

    ->  declare i int;

    ->  if new.col>30 then

    ->          insert

    into xxxx values (1);

    ->  end if;

    -> end;

    -> //

    Query OK, 0 rows affected (0.06 sec)

    mysql> delimiter ;

    mysql> delete from t_bluerosehero;

    Query OK, 3 rows affected (0.05 sec)

    mysql> insert into t_bluerosehero values (1,20);

    Query OK, 1 row affected (0.06 sec)

    mysql> insert into t_bluerosehero values (2,40);

    ERROR 1146 (42S02): Table 'csdn.xxxx' doesn't exist

    mysql>

    展开全文
  • 如何能够即抛出自定义异常同时又能修改(其他表)记录呢? ``` create or replace trigger TMP_REC_WHO_CHANGE_ADDEPT before update of dept_admission_to on pat_visit for each row --监视pat_visit...
  • 用户提问该表中有俩非常重要的记录,这俩记录不可以被删除和修改。不要说设置权限什么的,不符合上级要求。阻止修改很简单,触发器中令new.xxx=XXX就可以了。可是删除怎么搞?不要说删除之后立刻添加,因为该表已有...

    用户提问

    该表中有俩非常重要的记录,这俩记录不可以被删除和修改。不要说设置权限什么的,不符合上级要求。阻止修改很简单,触发器中令new.xxx=XXX就可以了。可是删除怎么搞?不要说删除之后立刻添加,因为该表已有insert的触发器,这个时候出发该触发器会有问题的。刚刚看到说用回滚,我觉得这个方法好,可我回滚了半天也没用。能否贴出代码?小弟不胜感激。

    推荐答案

    由于 MySQL 没有直接抛出异常的语句

    因此这里通过在触发器里面,插入/删除自己这个表

    导致 MySQL 发生异常

    发生异常了, 就会自动回滚掉 删除数据的处理了.

    一个例子

    货物表

    CREATE TABLE Goods(

    id INT,

    Amount INT

    );

    订单表

    CREATE TABLE OrderDetail(

    ID INT,

    GoodsID INT,

    Amount INT

    );

    库存测试数据:

    INSERT INTO Goods VALUES (1, 100);

    要求:当订单表插入数据的时候,自动去货物表检查,是否有足够的库存

    如果有,那么更新货物表的库存 = 原库存– 本次订单数量

    如果库存不足,抱错返回.

    DELIMITER //

    CREATE TRIGGER BeforeInsertOrderDetail

    BEFORE INSERT ON OrderDetail

    FOR EACH ROW

    BEGIN

    DECLARE

    v_nowCount INT;

    SELECT

    Amount INTO v_nowCount

    FROM

    Goods

    WHERE

    ID = new.GoodsID;

    IF v_nowCount - new.Amount < 0 THEN

    -- 由于 MySQL 没有直接抛出异常的语句

    -- 因此这里通过在触发器里面,插入/删除自己这个表

    -- 导致 MySQL 发生异常

    DELETE FROM

    OrderDetail

    WHERE

    ID = new.GoodsID;

    ELSE

    UPDATE

    Goods

    SET

    Amount = Amount - new.Amount

    WHERE

    ID = new.GoodsID;

    END IF;

    END;

    //

    DELIMITER ;

    处理前

    mysql> select * from goods;

    +------+--------+

    | id | Amount |

    +------+--------+

    | 1 | 100 |

    +------+--------+

    1 row in set (0.00 sec)

    mysql> select * from OrderDetail;

    Empty set (0.00 sec)

    mysql> INSERT INTO OrderDetail VALUES(1, 1, 90);

    Query OK, 1 row affected (0.02 sec)

    mysql> INSERT INTO OrderDetail VALUES(1, 1, 20);

    ERROR 1442 (HY000): Can't update table 'orderdetail' in stored function/trigger

    because it is already used by statement which invoked this stored function/trigg

    er.

    处理后

    mysql> select * from goods;

    +------+--------+

    | id | Amount |

    +------+--------+

    | 1 | 10 |

    +------+--------+

    1 row in set (0.00 sec)

    mysql> select * from OrderDetail;

    +------+---------+--------+

    | ID | GoodsID | Amount |

    +------+---------+--------+

    | 1 | 1 | 90 |

    +------+---------+--------+

    1 row in set (0.00 sec)

    辅助答案

    用户:syz888

    2018年01月13日

    我做了一个测试,这样在删除记录时报错,而不能删除,你看可不可以

    delimiter $

    create procedure rb()

    begin

    rollback;

    end $

    create trigger trigger1 before delete on table

    for each now

    begin

    if old.xxx=XXX then

    call rb ;

    end if ;

    end $

    展开全文
  • MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?   下面是一种实现的方法。思路就是想办法在...

    MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?

     

    下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。

     

    mysql> create table t_control(id int primary key);
    Query OK,
    0 rows affected (0.11 sec)

    mysql
    > insert into t_control values (1);
    Query OK,
    1 row affected (0.05 sec)

    mysql
    > create table t_bluerosehero(id int primary key,col int);
    Query OK,
    0 rows affected (0.11 sec)

    mysql
    > delimiter //
    mysql
    > create trigger tr_t_bluerosehero_bi before insert on t_bluerosehero
       
    -> for each row
       
    -> begin
       
    ->  if new.col>30 then
       
    ->          insert into t_control values (1);
       
    ->  end if;
       
    -> end;
       
    -> //
    Query OK,
    0 rows affected (0.08 sec)

    mysql
    > delimiter ;
    mysql
    >
    mysql
    > insert into t_bluerosehero values (1,20);
    Query OK,
    1 row affected (0.25 sec)

    mysql
    > insert into t_bluerosehero values (2,40);
    ERROR
    1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql
    >
    mysql
    > select * from t_bluerosehero;
    +----+------+
    | id | col  |
    +----+------+
    |  1 |   20 |
    +----+------+
    1 row in set (0.00 sec)

    mysql
    >

    或者

     

    mysql> delimiter //
    mysql
    > create trigger tr_t_bluerosehero_bi before insert on t_bluerosehero
       
    -> for each row
       
    -> begin
       
    ->  declare i int;
       
    ->  if new.col>30 then
       
    ->          insert into xxxx values (1);
       
    ->  end if;
       
    -> end;
       
    -> //
    Query OK,
    0 rows affected (0.06 sec)

    mysql
    > delimiter ;
    mysql
    > delete from t_bluerosehero;
    Query OK,
    3 rows affected (0.05 sec)

    mysql
    > insert into t_bluerosehero values (1,20);
    Query OK,
    1 row affected (0.06 sec)

    mysql
    > insert into t_bluerosehero values (2,40);
    ERROR
    1146 (42S02): Table 'csdn.xxxx' doesn't exist
    mysql>

    展开全文
  • MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?   下面是一种实现的方法。思路就是想办法在...

    MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?

     

    下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。

     

    mysql> create table t_control(id int primary key);
    Query OK,
    0 rows affected (0.11 sec)

    mysql
    > insert into t_control values (1);
    Query OK,
    1 row affected (0.05 sec)

    mysql
    > create table t_bluerosehero(id int primary key,col int);
    Query OK,
    0 rows affected (0.11 sec)

    mysql
    > delimiter //
    mysql
    > create trigger tr_t_bluerosehero_bi before insert on t_bluerosehero
       
    -> for each row
       
    -> begin
       
    ->  if new.col>30 then
       
    ->          insert into t_control values (1);
       
    ->  end if;
       
    -> end;
       
    -> //
    Query OK,
    0 rows affected (0.08 sec)

    mysql
    > delimiter ;
    mysql
    >
    mysql
    > insert into t_bluerosehero values (1,20);
    Query OK,
    1 row affected (0.25 sec)

    mysql
    > insert into t_bluerosehero values (2,40);
    ERROR
    1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql
    >
    mysql
    > select * from t_bluerosehero;
    +----+------+
    | id | col  |
    +----+------+
    |  1 |   20 |
    +----+------+
    1 row in set (0.00 sec)

    mysql
    >

    或者

     

    mysql> delimiter //
    mysql
    > create trigger tr_t_bluerosehero_bi before insert on t_bluerosehero
       
    -> for each row
       
    -> begin
       
    ->  declare i int;
       
    ->  if new.col>30 then
       
    ->          insert into xxxx values (1);
       
    ->  end if;
       
    -> end;
       
    -> //
    Query OK,
    0 rows affected (0.06 sec)

    mysql
    > delimiter ;
    mysql
    > delete from t_bluerosehero;
    Query OK,
    3 rows affected (0.05 sec)

    mysql
    > insert into t_bluerosehero values (1,20);
    Query OK,
    1 row affected (0.06 sec)

    mysql
    > insert into t_bluerosehero values (2,40);
    ERROR
    1146 (42S02): Table 'csdn.xxxx' doesn't exist
    mysql>


    展开全文
  • MySQL 在触发器里中断记录的插入或更新?更新时间:2009年07月26日 21:56:46 作者:MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法...
  • MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?
  • 匿名用户1级2013-01-07 回答由于 MySQL 没有直接抛出异常的语句因此这里通过在触发器里面,插入/删除自己这个表导致 MySQL 发生异常发生异常了, 就会自动回滚掉 删除数据的处理了.一个例子货物表CREATE TABLE Goods...
  • 由此可见,我的存储过程计算时间差是根据table4插入记录出现的先后顺序来配对计算的,但是现在发现,这样计算出来的结果有问题,详细的异常问题解释可到我另一个问答中查看,https://ask.csdn.net/questions/691300...
  • 精通Oracle PL/SQL--详细书签版

    热门讨论 2012-08-21 13:06:28
    与市面上许多pl/sql图书只是纸上谈兵、局限于语法和功能本身不同,本书从实战出发,讲述如何正确、充分地运用语言特性,除了pl/sql的基本功能之外,也包括数据的高效处理、安全、触发器、高效的调试技术等。...
  • 程序中断方式

    2020-12-30 15:53:00
    1.中断的基本概念 程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时...为了记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器INTR,当其状态
  •  本书全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有新增功能和工具,如何执行功能强大的SQL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象-关系数据库。通过学习本书,您可以...
  • 为了进一步了解这项技术,您将学习Azure函数中的日志记录异常处理。在本书的后面,您将使用ASP.NETCore和物化CSS构建一个Twitterbot Web应用程序,它将与几个基于HTTP的Azure函数交互。Twitterbot Web应用程序允许...
  • 3.3.9 一个大的含有50M个URL的记录,一个小的含有500个URL的记录,找出两个记录里相同的URL 3.4.0 海量日志数据,提取出某日访问百度次数最多的那个IP 3.4.1 有10个文件,每个文件1G,每个文件的每一行都存放的是...
  • 9.2.3 DispatherUnhandledException事件——处理应用程序未处理的异常 173 9.2.4 SessionEnding事件——注销或关闭系统 174 9.2.5 Exit事件——退出应用程序 175 9.3 Application类的任务 177 9.3.1 处理命令行参数 ...
  • asp.net知识库

    2015-06-18 08:45:45
    如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法得到数据库架构信息 用于 Visual Studio .Net 的 IBM DB2 开发外接程序 第2章 并发操作的一致性问题 (2) Using...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    一、填空 1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程...9.简述Oracle数据库角色的种类、作用,以及如何利用角色为用户授权。 答案: Oracle数据库中角色分为系统预定义的角色和用户自定义的...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法...
  • 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法...
  • 实务6 如何找到oracle安装时生成的日志文件 实务7 安装oracle时,是否需要安装jdk 实务8 解压安装文件时,报告无权限 实务 实务9 安装oracle软件并创建完数据库后,服务内的oraclesid显示 实务9 “启动”而不是...
  • 实务6 如何找到oracle安装时生成的日志文件 实务7 安装oracle时,是否需要安装jdk 实务8 解压安装文件时,报告无权限 实务 实务9 安装oracle软件并创建完数据库后,服务内的oraclesid显示 实务9 “启动”而不是...
  • 书中涉及的内容非常广泛,包括DBMS的概念、术语和体系结构,ER模型和ER图,数据抽象和语义数据建模,UML类图表示法,基本关系模型,关系代数和关系演算,SQL,规范化,磁盘上组织记录文件的主要方法,文件的索引技术...
  • 4.3.4 SQL*Plus错误记录 84 4.3.5 SQL*Plus命令行选项 85 4.4 SQL*Plus管理命令 87 4.4.1 CLEAR命令 87 4.4.2 STORE命令 88 4.4.3 SHOW命令 88 4.5 关键的SQL*Plus“工作”命令 90 4.5.1 SQLPROMPT...
  • Java 面试宝典

    2013-02-01 10:02:08
    41、运行时异常与一般异常有何异同? ..................................................................... 28 42、error 和 exception 有什么区别? ...........................................................

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

触发器如何记录异常