如何将MySQL触发器异常/故障信息存储到表或变量

时间:2016-06-07 13:13:56

标签: mysql database triggers

我被困在某个地方,我需要你的帮助。

方案

我有两个数据库,即test_db1test_db2,并且两个数据库都有users表。两个数据库最初都是空的(0行)。

此处的users表架构:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

之后,我在INSERT表上为UPDATEDELETEtest_db1.users事件编写了一些触发器,以下是每个触发器的作用:

  • INSERT的{​​{1}}上,在test_db1.users
  • 中插入相同的行
  • test_db2.users的{​​{1}}上,更新UPDATE
  • 中的相同行
  • test_db1.users的{​​{1}}上,从test_db2.users
  • 删除相同的行

这是触发器代码段。

DELETE

现在,问题!

目前,这并没有在触发器中定义任何错误/异常处理程序。所以,我也想处理它,但我不知道如何做到这一点。我只是不知道如何获得异常及其属性,例如异常 - 错误代码,错误消息?

我只想将捕获的异常/错误存储到每个触发器的test_db1.userstest_db2.users表中(如果失败):

此处的DELIMITER // -- TRIGGER FOR INSERT DROP TRIGGER IF EXISTS `test_db1_users_bi`; CREATE TRIGGER `test_db1_users_bi` BEFORE INSERT ON `users` FOR EACH ROW BEGIN INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); END; // -- TRIGGER FOR UPDATE DROP TRIGGER IF EXISTS `test_db1_users_bu`; CREATE TRIGGER `test_db1_users_bu` BEFORE UPDATE ON `users` FOR EACH ROW BEGIN UPDATE `test_db2`.`users` SET name = NEW.name, age = NEW.age WHERE id = NEW.id; END; // -- TRIGGER FOR DELETE DROP TRIGGER IF EXISTS `test_db1_users_bd`; CREATE TRIGGER `test_db1_users_bd` BEFORE DELETE ON `users` FOR EACH ROW BEGIN DELETE FROM `test_db2`.`users` WHERE id = OLD.id; END; // -- DELIMITER; 表架构看起来像:

test_db1

仅供参考:以下是可能的失败:

  • 如果errors不存在或无法连接?
  • 如果errors触发失败,即无论什么原因?
  • 如果DROP TABLE IF EXISTS `errors`; CREATE TABLE `errors` ( `id` int(11) AUTO_INCREMENT, `error_code` varchar(30) DEFAULT NULL, `error_message` TEXT DEFAULT NULL, `emailed` TINYINT DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 触发失败,即无论什么原因?
  • 如果test_db2触发失败,即无论什么原因?

如果有人可以让我知道如何获取异常及其属性,如错误代码,错误消息并将其存储到内部触发器中的变量,以便然后我将执行insert以将它们存储到表中?

我正在运行MySQL版本:5.5 +

谢谢!

3 个答案:

答案 0 :(得分:3)

我通过DECLARE CONTINUE HANDLERGET DIAGNOSTICS CONDITION找到了一个黑客,所以我想必须在这里分享。

这是我的完整最终脚本,它为两个数据库users表保留备份(同步),这意味着test_db1上的任何更新(我们可以将其称为productionDB)将发生在{ {1}}(我们可以将其称为stagingDB):

test_db2

希望这些人在来到这里时会有所帮助。

干杯,

答案 1 :(得分:1)

查看DECLARE HANDLER的语法

http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html

此外,如果您尝试调试SP,这可能会对您有所帮助:

http://www.bluegecko.net/mysql/debugging-stored-procedures/

触发后,您可以使用以下内容:

    CREATE TRIGGER `my_table_AINS` AFTER INSERT ON `my_table` FOR EACH ROW
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        RESIGNAL;
    DECLARE EXIT HANDLER FOR SQLWARNING
        RESIGNAL;
    DECLARE EXIT HANDLER FOR NOT FOUND
        RESIGNAL; 
    -- Do the work of the trigger.
END

希望这可以帮到你。

答案 2 :(得分:0)

这看起来像主服务器和从服务器/数据库方案。您可以查看二进制日志记录。因此,主服务器中的任何操作都将被记录为一个事件,并且同样会应用于从属服务器。 Checkout MySQL official reference