【问题标题】:How to fire a Trigger when a variable surpasses/exceed a specific Date当变量超过/超过特定日期时如何触发触发器
【发布时间】:2015-07-21 22:32:03
【问题描述】:

我有一个带有“DATE”类型属性的表,我想在属性达到特定日期时触发触发器。

例如:

Table A:
        a int primary key;
        d Date;

A(1, '15-05-2015');

当这个日期到来时,我想触发一个特定的触发器。

谢谢。

【问题讨论】:

  • 也许您希望每天运行计划的作业,对匹配的行执行任何需要完成的工作。
  • 我明白你在说什么,但我正在做一个“轻型”数据库项目,我认为它太先进了。无论如何谢谢:)

标签: sql database oracle triggers oracle-sqldeveloper


【解决方案1】:

根据甲骨文的trigger documentation

您可以编写触发器,在以下情况之一时触发 操作发生:

  1. DML 语句(INSERT、UPDATE、DELETE) 由任何用户发布的特定表或视图
  2. DDL 声明(主要是 CREATE 或 ALTER)由特定的 架构/用户或数据库中的任何架构/用户
  3. 数据库 事件,例如登录/注销、错误或启动/关闭,也会发出 由特定模式/用户或任何模式/用户在 数据库

不幸的是,约会的到来不是其中之一。

但是,您可以创建一个在特定日期运行的 Oracle 作业并执行一个 Oracle 过程

Oracle 的job creation documentation 说明了如何做到这一点:

BEGIN DBMS_SCHEDULER.CREATE_JOB (    job_name           => 
'update_sales',    job_type           =>  'STORED_PROCEDURE',   
job_action         =>  'OPS.SALES_PKG.UPDATE_SALES_SUMMARY',   
start_date         =>  '28-APR-08 07.00.00 PM Australia/Sydney',   
repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */ 
end_date           =>  '20-NOV-08 07.00.00 PM Australia/Sydney',   
job_class          =>  'batch_update_jobs',    
comments           =>  'My new job'); 
END; 
/

job_action”字段接收要执行的过程的名称,而“repeat_interval”将留空以进行一次执行。

【讨论】:

  • 我们来看看。谢谢!
【解决方案2】:

您可以为每个行触发器创建一个插入/更新前触发器,每次在此表上插入/更新时都会触发该触发器。在触发器体中你可以测试

if :new.d = to_date('2015-05-15','yyyy-mm-dd') then
  --put you code here
end if;

【讨论】:

    【解决方案3】:

    你可以试试这个

    CREATE OR replace TRIGGER trg_ex
       AFTER UPDATE OR DELETE ON ex1
          FOR EACH ROW
          WHEN ( NEW.DATE='--'  )
       BEGIN
           dbms_output.Put_line('Trigger is fired');
       END;
    /
    

    【讨论】:

    • 我们希望在特定日期到达时触发触发器,而不是通过更新、删除或插入行。基本上,存在一些在其他表中执行更新、插入或删除的触发器,但是当达到特定日期时会触发该触发器。
    • @Silva_PT_SCP 从逻辑上讲,当日期从值更改为值时,不考虑更新吗?当那个日期改变它的值时,就意味着它的更新。
    【解决方案4】:
    CREATE OR REPLACE TRIGGER yourtable_before_insupd
    BEFORE INSERT OR UPDATE
       ON yourtable
       FOR EACH ROW
       WHEN (NEW.date = '15-05-2015')
    
    DECLARE
       -- your declarations here - v_date is just an example
       v_date DATE;
    
    BEGIN
       -- your computations here
       -- Find date of the item - just as example
       SELECT date INTO v_date
       FROM dual;
    
    
       -- update the date of the item - just as example
       :new.date := sysdate;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2012-01-05
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      相关资源
      最近更新 更多