【问题标题】:MySQL Trigger won't fireMySQL 触发器不会触发
【发布时间】:2019-08-07 04:39:02
【问题描述】:

事情就是这样。我的触发器有效——我用更简单的代码对其进行了测试。但由于某种原因,我的 select 语句似乎返回 false,即使我已经测试过它并且它确实是真的。我不能在触发器或其他东西中包含这种逻辑吗?我在这方面工作的时间比我自豪地承认的要长,而且这一切都不再有意义了。任何见解将不胜感激。谢谢!

编辑:我可能应该包括这样一个事实,即 juiceApp 数据库与持有此触发器的数据库不同。但我无法从中获取 ID,因为它是在 87586745wp db 中生成的。

CREATE DEFINER=`mysqluser`@`localhost` TRIGGER `87586745wp`.`wp_posts_AFTER_INSERT` AFTER INSERT ON `wp_posts` FOR EACH ROW
BEGIN
DECLARE no_data INT DEFAULT 0;
DECLARE email VARCHAR(255);
DECLARE user_id INT;
DECLARE email_cursor CURSOR FOR
    SELECT DISTINCT au.UserID, au.UserEmailAddress
    FROM `JuiceApp`.`AppPreferences` ap
    JOIN `JuiceApp`.`AppUsers` au ON au.UserID = ap.UserID 
    WHERE ap.PreferenceControlID = 1 
    AND ap.PreferenceValue = 1;

DECLARE CONTINUE HANDLER FOR
    NOT FOUND SET no_data = 1;

SET @sub = 'Broken Glass';

-- if article part of campaign 
IF NEW.ID IN (
    SELECT post.ID
    FROM wp_posts post
    INNER JOIN wp_term_relationships rel ON rel.object_id = post.ID
    INNER JOIN wp_terms t ON t.term_id = rel.term_taxonomy_id
    WHERE post.post_status = 'publish' 
    AND post.post_type = 'post' 
    AND t.term_id = 25) 
THEN
    OPEN email_cursor;
        send_email_loop: LOOP
            FETCH email_cursor INTO user_id, email;
            IF no_data = 1 THEN 
                LEAVE send_email_loop;
            END IF;
            -- record email to be sent
            INSERT INTO `JuiceApp`.`EmailQueue` (ArticleID, RecipientID, RecipientEmail, Subject)
            VALUES (NEW.ID, user_id, email, @sub);
        END LOOP send_email_loop;
    CLOSE email_cursor;
END IF;

结束

【问题讨论】:

  • 请添加所有触发代码,包括设置分隔符,你指的是什么select?
  • 你确定触发器运行时select会返回一行吗?它只在插入时运行,也许 wordpress 首先将帖子作为草稿插入,然后将其更改为已发布(这可能是一个更新,不确定 wordpress 是否存储旧版本,所以一切都是插入)。也许在某处记录您选择的结果。另外,您是否知道您不需要光标来进行插入?你可以简单地做insert into ... select DISTINCT new.id, au.UserID, ... FROM JuiceApp.AppPreferences ap ...
  • @Solarflare 我喜欢移除光标的想法。我有一个定期运行的 cron 脚本来发送我最终只是使用它的电子邮件。我已将问题缩小到 IF 声明。出于某种原因,当我独立运行它时它会返回 new.id,但在触发器中使用时它不会返回它。当我简单地返回插入的 New.ID 时 - 我得到两个:一个与我的 IF 语句逻辑匹配,另一个不匹配(更多的是占位符插入)。仍在测试中会保持更新。

标签: php mysql phpmyadmin mysql-workbench


【解决方案1】:

这个答案的所有功劳归于@Solarflare: 我在插入后实现了一个触发器——但我的逻辑只适用于更新——因为@Solarflare 正确地建议我查询的状态可能只在插入后更新。它现在工作正常。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多