sql - 触发器不禁用
问题描述
create or replace NONEDITIONABLE TRIGGER azuriranje
AFTER UPDATE OF napomena
ON otpremnica
FOR EACH ROW
DECLARE
BEGIN
EXECUTE IMMEDIATE 'ALTER TRIGGER zabranjeno DISABLE';
UPDATE stavkaotpremnice
SET napomena =:NEW.napomena
WHERE brojotpremnice =:NEW.brojotpremnice;
EXECUTE IMMEDIATE 'ALTER TRIGGER zabranjeno ENABLE';
END;
有谁知道为什么触发器“zabranjeno”在更新之前没有被禁用?
解决方案
这至少是您发布的第三个问题,与同一问题有关。我回答了其中一个(这个),所以 - 再次问同样的问题有什么意义?
无论如何:阅读您发布的内容(作为问题或评论),我会说您完全错了。原因如下:
- 你有两张桌子:
otpremnica
和stavkaotpremnice
- 您不想允许用户更新
napomena
列stavkaotpremnice
,因此zabranjeno
在该表上创建了触发器 - 同时,
azuriranje
在表 otpremnica 上的触发器应该- 禁用触发器
zabranjeno
stavkaotpremnice.napomena = otpremnica.napomena
为此设置,brojotpremnice
对于所有行stavkaotpremnice
- 启用触发器
zabranjeno
- 禁用触发器
最后一个项目符号(“同时......”)说明了为什么这是错误的。您的数据模型违反了第三范式;napomena
在 master ( otpremnica
) 和 detail ( stavkaotpremnice
) 表中保持相同的值是没有意义的。
如果您想显示(显示)napomena
中的所有行stavkaotpremnice
,则加入这些表,例如
select o.brojotpremnice,
s.brojstavke,
s.nazivstavke,
o.napomena --> here's your NAPOMENA
from otpremnica o join stavkaotpremnice s on s.brojotpremnice = o.brojotpremnice
where ...
最后,如果您不允许用户输入他们认为合适的任何注释,那么加入该napomena
列有什么意义?stavkaotpremnice
因此,长话短说,解决你的噩梦,修改数据模型:
- 从
napomena
_stavkaotpremnice
- 删除
zabranjeno
和azuriranje
触发器 - 在需要时
napomena
从表中获取otpremnica
- 或者,使用我在上面发布的查询创建一个视图
推荐阅读
- swift - 在继续单元测试之前等待主队列被调度
- ruby-on-rails - AES 加密丢失 XSL 文件的结尾
- python-3.x - 熊猫重采样重叠
- graphql - 如何将图片从 TinyMCE 上传到 Apollo GraphQL 服务器?
- gnuplot - gnuplot:在一个键中显示中心线和误差带
- machine-learning - 有没有办法像在 google colab 中一样在 kaggle 笔记本中打开和运行完整的 ML 项目?
- r - R中的多列排名
- r - 在 R 管道工中指定参数
- c++ - codelite 调试器说“找不到 gdb!在'gdb''
- python - Scikit-Learn GridSearchCV 在 gensim LDA 模型上失败