【发布时间】:2016-10-07 10:05:59
【问题描述】:
我被困在某个地方,我需要你的帮助。
场景
我有两个数据库,即 test_db1 和 test_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;
之后,我在test_db1.users 表上为INSERT、UPDATE 和DELETE 事件编写了一些触发器,下面是每个触发器的作用:
- 在
INSERT中test_db1.users中,在test_db2.users中插入同一行 - 在
UPDATE中test_db1.users,更新test_db2.users中的同一行 - 在
DELETE在test_db1.users上,从test_db2.users中删除同一行
这里是触发代码sn-p。
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触发器失败,即,无论是什么原因? - 如果
UPDATE触发器失败,即无论是什么原因? - 如果
DELETE触发器失败,即,无论是什么原因?
如果有人可以告诉我如何获取异常及其属性,如错误代码、错误消息并将其存储到触发器内部的变量中,以便我执行插入以将它们存储到表中?
我正在运行 MySQL 版本:5.5+
谢谢!
【问题讨论】:
-
没有得到..刚刚尝试了文档中给出的示例,但似乎不起作用。