【问题标题】:how to execute a trigger everyday at once in sql如何在sql中每天一次执行触发器
【发布时间】:2018-11-28 02:52:53
【问题描述】:

我们正在做一个关于小额银行的项目,我们需要在数据库级别计算利率。所以我们为此使用了程序和触发器。但是触发器需要每天立即执行才能执行以下给定程序。您能否提供创建该触发器的解决方案。提前致谢

DELIMITER //

create procedure addFDInterestToAccount(in account_number bigint(20))
BEGIN
declare interest float default 0;
declare account_type varchar(10);
declare rate float;
declare savings_account bigint(20);

start transaction;
select balance from fd_account where account_no = account_number into interest;
SELECT plan_id from fd_account where account_no = account_number into account_type;
SELECT saving_account_no from fd_account where account_no = account_number into savings_account;
select interest_rate from fd_plan where plan_id = account_type into rate;
set interest = interest*rate/1200;

insert into transaction (transaction_id, account_no, credit_debit, date_time, amount, type_, agent_id, is_fee)  values (null, savings_account, 'debit', now(), interest, 'not_special', null, false);
update account set balance = balance + interest where account_no = savings_account;
commit;
END //
DELIMITER ;

call addFDInterestToAccount(90842311);

【问题讨论】:

  • 是否必须只使用触发器...你为什么不考虑任务调度程序或 Windows 服务?
  • 我正在使用 mariadb,我需要使用触发器。感谢@PrashantPimpale 的回复
  • @AhkamNaseek - 您可能需要在每个 SELECT 末尾添加 FOR UPDATE

标签: mysql sql mariadb


【解决方案1】:

据我了解您的要求,我认为您可以为此使用 SQL 事件。一般语法是这样的,

 CREATE [OR REPLACE]
    [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
    EVENT 
    [IF NOT EXISTS]
    event_name    
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO sql_statement;

schedule:
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval 
    [STARTS timestamp [+ INTERVAL interval] ...] 
    [ENDS timestamp [+ INTERVAL interval] ...]

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

您可以修改/使用以下代码来实现这一点,

 CREATE EVENT example
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
DO call addFDInterestToAccount(90842311);

欲了解更多信息,您可以访问链接here

还要确保在运行事件之前运行此查询

SET GLOBAL event_scheduler = ON;

【讨论】:

  • 感谢@jinesh Shah 的回复。但问题是我需要为“帐户”表中的所有帐户执行此过程。所以使用事件,在“DO”之后我们可以调用触发器或其他东西
  • 在这种情况下,您必须修改程序或事件。我建议您在调用参数时删除参数,并在过程中通过 select 语句获取所有帐号,然后采用 Cursor 它将迭代这些帐号并将其传递给您的查询中的所需参数程序。
  • 知道了 :) 感谢@jinesh Shah 的帮助
【解决方案2】:

触发器定义为响应插入、更新或删除语句而运行的过程。每次您执行这些 DML 操作之一时,它都会运行。您不能安排触发器每天运行一次。

来自MySql documentation(但适用于所有实现触发器的数据库):

触发器被定义为在语句插入、更新或 删除关联表中的行。这些行操作是触发器 事件。

相反,您需要寻找任务调度程序。每个操作系统都有自己的,或者您可以找到第三方调度软件。

【讨论】:

  • 这是正确的。需要一个 DML 来“触发”某些东西。我相信任务调度程序被称为 Jobs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2016-03-05
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多