【问题标题】:Teradata Trigger or check constraint to check the date range from a different tableTeradata 触发器或检查约束以检查不同表中的日期范围
【发布时间】:2019-09-25 01:55:38
【问题描述】:

我正在寻找在 teradata 中实现以下逻辑的解决方案。我非常感谢您的建议。

在 table_1 中插入一行之前,我想检查一下日期值,它应该在 table_2 中的 date range-effective_dt 和 expiration_dt 之间。

Table_1(事实表):

Account_num  Tran_dt     Tran_amt

12345        2019-05-12  120,000

Table_2(暗表):

Account_num  effective_dt  expiration_dt

12345        2018-01-01     2019-04-28

在这种情况下,table_1 插入语句应该会失败,因为交易日期超出了帐户的激活日期范围。

谢谢!

【问题讨论】:

  • 我查看了不同的选项 - 创建触发器和使用检查约束。但是,我找不到可以对不同表使用检查的解决方案。这是我的一种想法->创建或替换触发器xyz>在table_1上插入>对于每一行>开始>IF:new.TRAN_DT>(从table_2中选择max(dw_expr_dt)WHERE t.acct_id =>:new .acct_id) >THEN abort '无效的账户交易日期';万一;结束;
  • 一种选择是将处理INSERT 逻辑的存储过程(SP) 写入table 1,并且仅在添加新行时调用SP
  • 这不是触发器的有效 Teradata 语法。这将是有效的,但可能无法满足您的需求:REPLACE TRIGGER database_name.trigger_name BEFORE INSERT ON database_name.fact_tbl REFERENCING NEW ROW n FOR EACH ROW (ABORT 'Invalid transaction date for Account' FROM database_name.dimension_tbl d WHERE n.Account_num = d.Account_num AND n.Tran_dt NOT between d.effective_dt and d.expiration_dt;);

标签: triggers teradata check-constraints teradata-sql-assistant


【解决方案1】:

看看这是否符合您的要求:

REPLACE TRIGGER database_name.trigger_name
 AFTER INSERT ON database_name.fct
 REFERENCING NEW TABLE AS n
 FOR EACH STATEMENT
 (ABORT 'Invalid transaction date for Account'
 FROM  n
 WHERE NOT EXISTS (SELECT 1 FROM database_name.dim d
   WHERE n.Account_num = d.Account_num
   AND n.Tran_dt between d.effective_dt and d.expiration_dt);
   );

虽然就触发时间而言这是一个“AFTER INSERT”触发器,但它仍将在可以提交 INSERT 之前强制执行。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2022-06-17
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多