【问题标题】:Can I launch a trigger on select statement in mysql?我可以在 mysql 中的 select 语句上启动触发器吗?
【发布时间】:2011-05-26 11:45:26
【问题描述】:

每次我SELECT 表 Y 中的任何记录时,我都尝试在表 X 上运行 INSERT 语句,无论如何我只能使用 MySQL 来完成吗?

类似触发器的东西?

【问题讨论】:

  • 简短回答是。触发器由INSERTUPDATEDELETE 触发。
  • 更新选择的每一行会导致批量操作的性能问题。最好为有意义的操作专门更新 last_accessed 时间戳。

标签: mysql database triggers


【解决方案1】:

简短的回答是否。触发器由INSERTUPDATEDELETE 触发。

可能的解决方案。相当罕见的场景:

  • 首先,写一些存储过程 做你想要的SELECTs 表十。
  • 然后,限制所有用户只能使用 这些存储过程并没有 允许他们直接在桌子上使用SELECT 十。
  • 然后将存储过程更改为 还调用一个存储过程 执行您想要的操作 (INSERT 或其他)。

【讨论】:

  • 我想对“weird”这个特征提出质疑。具体来说,如果一个人正在访问受控信息(例如制造标签),我们想要控制存储在数据库中的文档被访问或打印的次数,这正是我想要的功能。如果信息控制是错误的(奇怪),我不想是对的。
  • @DannyHolstein 好的,“奇怪”不是最佳选择。 “稀有”听起来更好吗?
  • 我应该为该功能提出功能请求。
  • 我尝试使用 VIEW 和存储函数来实现解决方案,当尝试在跟踪访问的表中执行 INSERT 时,它不能,因为该表已经打开并被锁定。
  • @DannyHolstein 您可以发布一个关于您的实施和发生的问题的新问题(并添加指向此问题的链接)。
【解决方案2】:

不——你不能在 SELECT 上触发——你必须创建一个在任何查询语句上隐式调用的存储过程(或任何其他类型的日志记录工具——如日志文件或其他任何东西)——如果您创建一个调用您的查询、调用日志记录并返回查询结果的包装器。

【讨论】:

    【解决方案3】:

    如果您尝试使用表 X 记录表 Y 上 SELECT 查询的顺序(一种相当常见的查询记录设置),您可以简单地颠倒操作顺序并运行 INSERT 查询 首先,然后运行您的SELECT 查询。

    这样,您不必担心将两个语句与TRIGGER 链接起来:如果您的服务器在两个语句之间崩溃,那么您已经记录了您在第一个语句中关心的内容,以及@987654325 是否@query 运行或失败对底层数据库没有影响。

    如果您没有记录查询,也许您正在尝试将表 Y 用作任务队列——我正在努力解决的情况导致我进入这个线程——并且您希望首先锁定 Y 的任何会话查询返回的行中的所有其他会话,因此您可以对结果执行一些操作并将输出插入表 X。在这种情况下,只需向表 Y 添加一些日志记录功能。

    例如,您可以将“所有者”列添加到 Y,然后将 SELECT 查询的 WHERE 部分附加到 UPDATE 语句上,运行它,然后将 SELECT 查询修改为仅显示您的UPDATE 声明的结果:

    UPDATE Y SET owner = 'me' WHERE task = 'new' AND owner IS NULL;
    SELECT foo FROM Y WHERE task = 'new' AND owner = 'me';
    

    ...对 foo 做一些工作,然后...

    INSERT INTO X (output) VALUES ('awesomeness');
    

    同样,关键是先记录,再查询。

    【讨论】:

    • 有点,但我在使用多行时受到限制。这是一个只会查看视图的愚蠢打印机驱动程序。我确实想出了一种解决方法,可以按计划的时间间隔淘汰条目,但我在 Bradly 打印机软件中发现了更多错误,使其完全无法使用,并且没有人愿意修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2019-04-25
    • 2012-07-04
    • 2010-11-05
    • 2012-06-24
    相关资源
    最近更新 更多