【问题标题】:Dynamic SQL is not allowed in stored function or trigger issue while create trigger on mysql在 mysql 上创建触发器时,存储函数或触发器问题中​​不允许使用动态 SQL
【发布时间】:2017-09-24 19:35:28
【问题描述】:

我在 mysql 上创建触发器时遇到异常,在下面粘贴我的触发器。我希望此触发器中的 prepare 语句抛出此异常,请纠正我的语法错误。

 DELIMITER $$

 CREATE DEFINER=`root`@`localhost` TRIGGER mysql_common.mysql_alert_trigger after insert on mysql_common.alert FOR EACH ROW

 BEGIN

 set @col_string = "col1,col2,col3";
 set @val_string = "('val1','val2','val3')";

 SET @s := CONCAT('INSERT into   msql_common.seperated_processlist(',@col_string,') values ', @val_string);
 PREPARE dynamic_statement FROM @s;
 EXECUTE dynamic_statement;
 DEALLOCATE PREPARE dynamic_statement;

 END $$
 DELIMITER ;

【问题讨论】:

  • 你想在这个触发器中完成什么?为什么要构建动态 SQL 语句? (这是相当不寻常和冒险的!)
  • 我需要这个触发器来获取应用数据。
  • 这真的不能解释你想要做什么。能举个更有代表性的例子吗? (当然,您的触发器不会在每次激活时都插入相同的数据……)
  • 即样本触发,没有原始数据
  • SQL prepared statements (PREPARE, EXECUTE, DEALLOCATE PREPARE) can be used in stored procedures, but not stored functions or triggers.。见C.1 Restrictions on Stored Programs

标签: mysql dynamic-sql database-trigger


【解决方案1】:
DELIMITER $$

 CREATE DEFINER=`root`@`localhost` TRIGGER mysql_common.mysql_alert_trigger after insert on mysql_common.alert FOR EACH ROWEACH ROW

 BEGIN

 call SOME_PROC();
 END $$
 DELIMITER ;

您可以使用您的业务逻辑编写一个过程,并从触发器中调用该过程,如上面的代码所示。使用您的特定输入和输出参数。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `SOME_PROC`()
BEGIN
    set @col_string = "col1,col2,col3";
 set @val_string = "('val1','val2','val3')";

 SET @s := CONCAT('INSERT into   msql_common.seperated_processlist(',@col_string,') values ', @val_string);
 PREPARE dynamic_statement FROM @s;
 EXECUTE dynamic_statement;
 DEALLOCATE PREPARE dynamic_statement;

END$$
DELIMITER ;

希望这会有所帮助。

【讨论】:

  • 虽然可以在存储过程中创建准备好的语句,但在触发器的上下文中,不能调用执行准备好的语句的存储过程,会抛出问题中指出的错误.
  • @wchiquito 我也试过了。它对我有用。
  • 您的存储过程(使用准备好的语句)是否从触发器正确运行?
  • @wchiquito 是的。
  • 你用的是什么版本的 MySQL?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2021-10-12
  • 2019-06-24
相关资源
最近更新 更多