Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调试MySQL触发器_Mysql_Triggers - Fatal编程技术网

调试MySQL触发器

调试MySQL触发器,mysql,triggers,Mysql,Triggers,我喜欢触发器有一个原因——它们只是工作而已。我讨厌触发器有一个原因——当触发器不工作时,忘记调试。哦,甜蜜的挫折 基本上,我希望看到运行的更新、删除、插入等查询。我想看看这个问题。。。在我的终端或日志中的某个地方,MySQL执行它的确切方式和时间,以及可能的任何相应的输出/错误。想法/技巧 我正在尝试调试一个包含一些连接的更新查询。我的查询要复杂得多,但为了简洁起见,这里有一个示例 DELIMITER | CREATE TRIGGER ireallyhateyourightnow AFTER U

我喜欢触发器有一个原因——它们只是工作而已。我讨厌触发器有一个原因——当触发器不工作时,忘记调试。哦,甜蜜的挫折

基本上,我希望看到运行的更新、删除、插入等查询。我想看看这个问题。。。在我的终端或日志中的某个地方,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”是否显示触发器执行和/或在中执行的语句(在以perl可以运行的速度运行show full processlist之后,我从未看到它们,但我可能只是错过了它)
  • 常规查询日志不会显示这些查询(当然不会显示错误日志)
  • 我不再使用别名了
  • 创建触发器时没有语法错误
  • IF语句有效
  • 当我将新值插入一个“test/temp”表并手动运行更新查询时,它就可以工作了(我甚至还实际插入了整个更新查询)
  • 我不能向您显示查询,但正如我刚才提到的,如果有帮助的话,当我手动运行时,它会工作
  • 我已经删除了所有错误的字符、制表符、回车符、换行符等
  • 我认为MySQL套接字只显示本地连接/数据,而不显示MySQL的内部工作
  • MyISAM所以INNODB日志不是一个选项
  • lsof似乎没有显示任何其他有用的东西
  • 我在CentOS 5.5上使用MySQL 5.0.77
    • 您可以使用。试试试用版


      文档中详细描述了触发器调试过程:调试\调试存储例程\如何:启动触发器调试。

      MYSQL PROCEDURE=>incron=>tail-f'MYSQL\u dynamic.log'

      存储过程可以在触发器内调用,但不能返回任何内容

      CREATE PROCEDURE `DYN_LOG` (IN s VARCHAR(500))
      BEGIN
      SELECT s into outfile '/var/spool/incron/mysql_dynamic_spool/foo_file';
      DO SLEEP(.1);   // create a gap beetween multiple shuts
      END
      
      现在,您可以调用触发器中的任何位置

      CREATE TRIGGER `trig_name` BEFORE UPDATE ON `tb_name` 
      FOR EACH ROW
      BEGIN
      CALL DYN_LOG(concat_ws('\t',NEW.col1,NEW.col2));
      ... 
      // rest of the code
      END
      
      对于Linux机器
      apt get install incron

      创建mysql将在其中注入foo_文件的文件夹

      mkdir -m 777 /var/spool/incron/mysql_dynamic_spool
      incrontab -e
      
      并添加以下incron作业

      /var/spool/incron/mysql_dynamic_spool IN_CREATE /path/foo_file_procesor $@/$#
      
      创建可执行脚本“/path/foo\u file\u procesor”

      现在查看收集器文件

      tail -f /var/log/mysql_dynamic.log 
      
      有一个。在这里的示例中,他们在自己的
      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   |
      +------------------------------------+
      

      是的,“踏入”显示为灰色。可能是因为这是一个试用版?必须从存储过程代码激活“单步执行”命令。您是否遵循了分步说明(如何:启动触发器调试)?谢谢Devart!非常好的一个软件。我还没有让它工作!当我在触发器(插入后触发器)中设置断点时,我调试我的insert语句,然后按ctrl+f5键跳转到断点,我发现触发器执行时有一个错误。我只是想确定,这意味着错误发生在我的断点之前?我是否正确设置/跳转到断点?您应该在过程中编写INSERT语句。然后开始调试该过程,并在INSERT语句中单击“单步执行”。请注意,在使用调试信息之前必须编译该触发器。除了debug_off()过程外,该过程在与触发器或函数一起使用时在select语句上失败,因为两者都不允许返回结果集。删除那个(以及后面的delete语句),就可以开始了。
      +------------------------------------+
      | debug_output                       |
      +------------------------------------+
      | Debug Started :2006-03-24 16:10:33 |
      | Testing Debug                      |
      | Debug Ended :2006-03-24 16:10:33   |
      +------------------------------------+