我被困在某个地方,我需要你的帮助。
我有两个数据库,即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;
之后,我在INSERT
表上为UPDATE
,DELETE
和test_db1.users
事件编写了一些触发器,以下是每个触发器的作用:
INSERT
的{{1}}上,在test_db1.users
test_db2.users
的{{1}}上,更新UPDATE
test_db1.users
的{{1}}上,从test_db2.users
这是触发器代码段。
DELETE
现在,问题!
目前,这并没有在触发器中定义任何错误/异常处理程序。所以,我也想处理它,但我不知道如何做到这一点。我只是不知道如何获得异常及其属性,例如异常 - 错误代码,错误消息?
我只想将捕获的异常/错误存储到每个触发器的test_db1.users
。test_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 +
谢谢!
答案 0 :(得分:3)
我通过DECLARE CONTINUE HANDLER
和GET 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