sql - 更新oracle之前触发问题[PL/SQL]
问题描述
桌子:
CREATE TABLE EXAMPLE1 (column1 integer, column2 integer, column3 integer);
插入:
INSERT INTO EXAMPLE1 VALUES (1,11,111);
扳机:
create or replace TRIGGER trigger_name
BEFORE UPDATE OF COLUMN1 ON EXAMPLE1
FOR EACH ROW
BEGIN
RAISE_APPLICATION_ERROR(-20000, 'You can't directly update this column.');
END;
更新:
UPDATE EXAMPLE1 SET COLUMN1 = 2 WHERE COLUMN2 = 11;
因此,当我尝试更新 column1 (column1 = 2) 触发器时,应该执行并告诉我不能直接更改该列,但是如果我执行这样的查询:
UPDATE EXAMPLE1 SET column1 = 1, column2 = 22 where column3 = 111;
我的意思是我在哪里发送 column1 = 1(column1 等于 1)所以没有改变值,它应该更新表,因为我只改变 column2,column1 保持不变等于 1。
解决方案
无论新值是什么,您仍在更新该列,在您的触发器中,您必须检查该值是否正在更改:
CREATE OR REPLACE TRIGGER trigger_name
BEFORE UPDATE OF COLUMN1 ON EXAMPLE1
FOR EACH ROW
BEGIN
IF DECODE(:new.column1, :old.column1, 1, 0) = 0 THEN
RAISE_APPLICATION_ERROR(-20000, 'You can''t directly update this column.')
END IF
END;
推荐阅读
- ignite - 为什么从分发文件夹中删除 Ignite 2.7.0?
- vba - 在循环中保存自定义文档属性
- clojure - 你如何在 Clojure 中模拟文件读取
- python - 在我的程序上下文中向日期时间输入添加异常处理的最简单方法是什么?
- javascript - axios中的Header Content Type无法设置application/json
- php - Laravel 5.8 中的 ArgumentCountError
- pandas - Pandas - 将具有开始和结束日期的数据框转换为每日数据
- typescript - 字符串类型,将导入返回种类的模块
- javascript - 使用 React.js 在 redux 中获取响应头对象
- bash - Bash - 添加到空格的单引号