gpt4 book ai didi

mysql - 调试 MySQL 触发器

转载 作者:IT老高 更新时间:2023-10-29 00:08:10 25 4
gpt4 key购买 nike

我喜欢触发器有一个原因 - 它们就是有效。我讨厌触发器有一个原因 - 当它们不起作用时,忘记尝试调试。哦,甜蜜的挫折。

基本上,我想查看已运行的更新、删除、插入等查询。我想看到那个查询……在我的终端或日志中的某个地方,MySQL 执行它的确切方式和时间,以及可能的任何相应的输出/错误。想法/技巧?

我正在尝试使用一些连接来调试更新查询,而没有连接。我的查询要复杂得多,但为简洁起见,这里有一个例子。

DELIMITER |
CREATE TRIGGER ireallyhateyourightnow AFTER UPDATE ON watch_this_table
FOR EACH ROW BEGIN
IF (OLD.my_value != NEW.my_value) THEN
update
my_table
set
my_column = NEW.my_value;
END IF;
END|
DELIMITER ;

这里有一些额外的上下文可能有助于影响建议或答案。同样,我对语义/语法不太感兴趣,更感兴趣的是看到 MySQL 运行查询,但无论如何,此时我对任何事情都持开放态度。

  • Strace 不工作/显示查询。
  • 非复制环境,但如果 bin 日志显示触发语句,我一定会设置它。
  • “show full processlist”是否显示触发器执行和/或在其中执行的语句(运行 show full processlist 后我从未看到它们以 perl 可以运行的速度运行,但我可能只是错过了它)?
  • 一般查询日志不显示这些查询(当然不是错误日志)。
  • 我不再使用别名了。
  • 创建触发器时没有语法错误。
  • IF 语句有效。
  • 当我将新值插入“test/temp”表并手动运行更新查询时,它起作用了(我什至实际插入了整个更新查询)
  • 我无法向您显示查询,但正如我刚才提到的,如果有帮助,我手动运行时它会起作用。
  • 我已经删除了所有错误的字符、制表符、回车符、换行符等。
  • 我认为 MySQL 套接字只会显示本地连接/数据,而不会显示 MySQL 内部工作。
  • MyISAM 所以 INNODB 日志不是一个选项
  • lsof 似乎没有显示任何其他有用的东西。
  • 我在 CentOS 5.5 上使用 MySQL 5.0.77。

最佳答案

an alternate way of testing it by having a temporary debug table .在此处的示例中,他们在自己的 debug 数据库中创建了它。

第 1 步:创建表

DROP TABLE IF EXISTS debug;
CREATE TABLE debug (
proc_id varchar(100) default NULL,
debug_output text,
line_id int(11) NOT NULL auto_increment,
PRIMARY KEY (line_id)
)

第 2 步:创建调试 SP 以填充调试表

DELIMITER $$

DROP PROCEDURE IF EXISTS `debug_insert` $$
CREATE PROCEDURE `debug_insert`(in p_proc_id varchar(100),in p_debug_info text)
begin
insert into debug (proc_id,debug_output)
values (p_proc_id,p_debug_info);
end $$

DROP PROCEDURE IF EXISTS `debug_on` $$
CREATE PROCEDURE `debug_on`(in p_proc_id varchar(100))
begin
call debug_insert(p_proc_id,concat('Debug Started :',now()));
end $$

DROP PROCEDURE IF EXISTS `debug_off` $$
CREATE PROCEDURE `debug_off`(in p_proc_id varchar(100))
begin
call debug_insert(p_proc_id,concat('Debug Ended :',now()));
select debug_output from debug where proc_id = p_proc_id order by line_id;
delete from debug where proc_id = p_proc_id;
end $$

第 3 步:在触发器中调用调试 SP

像这样,

CREATE PROCEDURE test_debug()
begin
declare l_proc_id varchar(100) default 'test_debug';
call debug_on(l_proc_id);
call debug_insert(l_proc_id,'Testing Debug');
call debug_off(l_proc_id);
end $$

因此,调试表将填充如下,

+------------------------------------+
| debug_output |
+------------------------------------+
| Debug Started :2006-03-24 16:10:33 |
| Testing Debug |
| Debug Ended :2006-03-24 16:10:33 |
+------------------------------------+

关于mysql - 调试 MySQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com