gpt4 book ai didi

oracle - 在 oracle plsql 中使用触发器填充代理键的优势

转载 作者:行者123 更新时间:2023-12-04 04:48:03 26 4
gpt4 key购买 nike

我正在开发一个代码库,它具有以下类型的模式,用于为表生成代理键。

create or replace
TRIGGER TEST_TRIG
BEFORE INSERT OR UPDATE
ON my_table
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
IF NVL(:NEW.column1, 0) = 0 THEN
SELECT my_table_seq.NEXTVAL
INTO :NEW.column1
FROM dual;

END IF;
END IF;
END;

以及调用此代码的 PL/SQL 逻辑,
begin
insert into my_table(0);
end;

我的问题是触发器需要什么?
为什么不做一个,
insert into my_table(my_table_seq.next_val)

收工了吗?
任何见解将不胜感激。谢谢。

最佳答案

这种特定模式实际上非常危险,因为它允许某人手动输入可能与现有代理键或您的序列将来可能生成的代理键冲突的新 ID。

您的触发器应该看起来像这样,以确保每条新记录都有一个唯一的键。如果您使用 11.2 或更高版本,则不需要 select ... into ...

CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
:new.column1 := my_table_seq.NEXTVAL;
END;

这种方法的好处是它总是完成。任何人为此列输入的任何值都会被覆盖为可以工作且使用正确序列的内容;如果有人忘记在语句中添加它仍然有效。

它使您无法破解您的代理键。

根据你的建议,想象一下有人把 1 代替;你得到一个主键违规。如果有人忘记了,就会有更多的错误。您永远无法保证对表的每次更新都将通过单个入口点进行,因此触发器可确保正确填充 PK。

值得注意的是,从 12c 开始,您可以使用 identity column , 明确表和自增之间的联系;不需要触发器或序列。表创建 DDL 的语法是:
create table <table_name> ( <column_name> generated as identity );

关于oracle - 在 oracle plsql 中使用触发器填充代理键的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17880185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com