【发布时间】: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