触发器错误总结一

首先,创建一个mylog表,记录对student表的操作信息:
SQL> CREATE TABLE mylog(
2 curr_user varchar2(20),curr_date date,action char(1))
3 TABLESPACE cjexample
4 PCTFREE 10
5 PCTUSED 40
6 STORAGE(
7 INITIAL 50K
8 NEXT 50K
9 );

然后,创建语句级触发器,让mylog表记录对student表的所有操作信息。

SQL> CREATE OR REPLACE TRIGGER stu_log
2 AFTER INSERT OR DELETE OR UPDATE ON student
3 BEGIN
4 IF INSERTING THEN
5 INSERT INTO mylog VALUES(user,sysdate,'I');
6 ELSIF DELETING THEN
7 INSERT INTO mylog VALUES(user,sysdate,'D');
8 ELSE
9 INSERT INTO mylog VALUES(user,sysdate,'U');
10 END IF;
11 END;

最后,测试对student表所做的更改,mylog能否记录操作信息:

SQL> update student set stuname='liushun' where stuno=112;

1 row updated.

更新操作正常。

SQL> delete from student where stuno=1;
delete from student where stuno=1
*
ERROR at line 1:
ORA-04091: table CHENJIE.STUDENT is mutating, trigger/function may not see it
ORA-06512: at "CHENJIE.DELE_TGR", line 2
ORA-04088: error during execution of trigger 'CHENJIE.DELE_TGR'

删除时报错。

SQL> insert into student values(111,'sys','m',sysdate);
insert into student values(111,'sys','m',sysdate)
*
ERROR at line 1:
ORA-04091: table CHENJIE.STUDENT is mutating, trigger/function may not see it
ORA-06512: at "CHENJIE.INS_TGR", line 2
ORA-04088: error during execution of trigger 'CHENJIE.INS_TGR'

插入时也报错。

再查看mylog时只有一条记录:

SQL> select * from mylog;

CURR_USER CURR_DATE A
-------------------- -------------- -
CHENJIE 10-8月 -09 U

初步判断student表还有另外两个触发器dele_tgr和ins_tgr;

解决方法:


SQL> desc user_triggers;
Name Null? Type
----------------------------------------- -------- ----------------------------

TRIGGER_NAME VARCHAR2(30)
TRIGGER_TYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(227)
TABLE_OWNER VARCHAR2(30)
BASE_OBJECT_TYPE VARCHAR2(16)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
REFERENCING_NAMES VARCHAR2(128)
WHEN_CLAUSE VARCHAR2(4000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(4000)
ACTION_TYPE VARCHAR2(11)
TRIGGER_BODY LONG

SQL> select triggername from user_triggers where table_owner='STUDENT';
select triggername from user_triggers where table_owner='STUDENT'
*
ERROR at line 1:
ORA-00904: "TRIGGERNAME": invalid identifier


SQL> select trigger_name from user_triggers where table_owner='STUDENT';

no rows selected

SQL> select trigger_name from user_triggers where table_name='STUDENT';

TRIGGER_NAME
------------------------------
DELE_TGR
INS_TGR
STU_LOG


SQL> drop trigger dele_tgr;

Trigger dropped.

SQL> drop trigger ins_tgr;

Trigger dropped.

可见student确实还有另外两个触发器。

<think>嗯,用户这次想要查找关于触发器及其应用实验的总结资料,特别提到了SQL数据库的实践报告示例。从用户强调的内容看,ta需要的不是基础理论,而是偏向实操的案例总结,可能是在准备实验报告或课程作业。回顾历史对话,系统级指令要求严谨的数学格式,但这次用户的需求完全聚焦在数据库实践上。有趣的是用户特意提到参考站内引用[1],不过那个引用主要讲SQL综合应用,虽然包含触发器模块但不深入。用户显然注意到了这个信息缺口,所以追加了更精确的请求。触发器这个主题有几个关键点必须覆盖:定义部分需要区分与存储过程的差异,应用场景要突出实战性(比如审计、数据致性),实验示例必须包含可运行的DDL和DML。用户提到"总结报告",暗示需要结构化内容,所以考虑分为定义、场景、语法、案例、总结五部分更符合预期。注意到用户查询包含"应用实验"和"示例"两个关键词,准备在思考过程中准备两个典型场景:库存更新这种业务逻辑型应用,和操作审计这种安全型应用。实验报告常见的错误点比如递归触发、事务管理也值得提醒——上次教快速排序时就发现用户很重视实践陷阱。最后考虑加个实验报告模板,因为引用[1]提到"实验报告"框架但没给具体结构。用户可能是高年级本科生,正在写数据库课程实验,这个群体通常需要兼顾技术深度和报告规范。</think> 以下为触发器应用实验总结及相关资料,结合实验报告框架和SQL示例,供您参考: --- ### 触发器核心概念总结 1. **定义** 触发器(Trigger)是数据库中的特殊存储过程,**自动响应** `INSERT/UPDATE/DELETE` 等事件,常用于强制业务规则和数据致性[^1]。 2. **典型应用场景** ✅ 审计跟踪(记录关键操作) ✅ 级联数据更新(如库存联动) ✅ 数据验证(阻止非法操作) ✅ 业务规则自动执行(如状态变更) --- ### 二、实验示例:审计日志触发器 ```sql -- 创建审计表 CREATE TABLE OrderAudit ( LogID INT IDENTITY PRIMARY KEY, OrderID INT, ActionType VARCHAR(10), ActionUser VARCHAR(50), ActionTime DATETIME DEFAULT GETDATE() ); -- 创建DELETE操作触发器 CREATE TRIGGER trg_OrderAudit ON Orders AFTER DELETE AS BEGIN INSERT INTO OrderAudit (OrderID, ActionType, ActionUser) SELECT deleted.OrderID, 'DELETE', CURRENT_USER FROM deleted; END; ``` **实验要点**: 1. 当删除订单记录时自动记录操作者信息 2. 使用伪表 `deleted` 捕获被删除数据 3. `CURRENT_USER` 获取执行账户(权限实验关键点) --- ### 三、进阶实验:库存同步验证 ```sql CREATE TRIGGER trg_UpdateInventory ON OrderDetails AFTER INSERT AS BEGIN -- 检测库存是否充足 IF EXISTS ( SELECT 1 FROM inserted i JOIN Products p ON i.ProductID = p.ProductID WHERE p.UnitsInStock < i.Quantity ) BEGIN ROLLBACK TRANSACTION; -- 终止操作 RAISERROR('库存不足,订单取消', 16, 1); END ELSE BEGIN -- 扣减库存 UPDATE p SET UnitsInStock -= i.Quantity FROM Products p JOIN inserted i ON p.ProductID = i.ProductID; END END; ``` **核心机制**: - 使用 `ROLLBACK` + `RAISERROR` 强制原子性操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值