oracle - Oracle 触发器可能与 :new 有关
问题描述
create trigger Trigger_1
Before INSERT
on Adresse
for each row
declare
pruefen int;
begin
select COUNT(*)
into pruefen
from CITY
where city.NAME = :new.stadt
and CITY.PROVINCE = :new.provinz;
if(pruefen = 0) then
RAISE_APPLICATION_ERROR(-20000, 'Fehler');
end if;
end;
错误:
[2020-01-18 10:14:12] [72000][20000] ORA-20000:
费勒 [2020-01-18 10:14:12] ORA-06512:在“ZOGL1011.TRIGGER_1”中,第 6 行
[2020 -01-18 10:14:12] ORA-04088:执行触发器“ZOGL1011.TRIGGER_1”时出错
[2020-01-18 10:14:12] 位置:12
我不明白这个问题......:new.stadt
并且:new.provinz
是红色的,但我可以创建触发器。
感谢您的帮助!
解决方案
[2020-01-18 10:14:12] [72000] [20000] ORA-20000:费勒
这是当 CITY 中没有与您尝试插入 ADRESSE 的记录匹配的数据时触发器引发的错误。换句话说,它是您的触发器按设计工作。因此,如果此结果让您感到惊讶,您需要检查您用于 CITY 和 ADRESSE 的数据。
为了证明这一点,这里有一个关于 db<>fiddle 的演示。
顺便说一句,这似乎是通过外键正确执行的那种事情。使用触发器来强制关系是错误的,因为:
- 它的性能更差并且无法扩展。
- 在多用户环境中它可能会失败。
- 在引用的表(在您的情况下为 CITY)上执行 DML 时,它不会继续强制执行该关系。
- In 混淆数据模型。
- 使用非标准方法会使其他必须使用或维护您的代码的开发人员感到困惑。
也许您的数据模型很差,不允许您在这里使用外键?也许 CITY 缺少 的唯一键(state, province)
。
虽然这可能只是任务。在家庭作业练习中使用触发器的命运是永远不应该在现实生活中使用的。
推荐阅读
- php - 先显示当前视频ID图像
- excel - 将不同工作表中的列粘贴到一个中
- java - 当输入查询只是该数据的一部分时,如何使用 Room 从我的数据库中获取数据?
- sql-server - 在 SQL Server 中格式化 GETDATE()
- mongodb - MongoDB 是否有任何电子池/可扩展性技术?
- algorithm - 同一矩阵上的最大平方 dp
- linux - 使用 scale_npp 过滤器 ffmpeg 调整大小时损坏的输出
- azure-data-factory - 与 ADF 数据流相关的成本
- ios - 当 SwiftUI Picker 选择更改 EnvironmentObject 时,有没有办法调用函数?
- c - 关于 break 语句