依据’触发器知识点’文档指导,修改错误触发器代码并补充完整’宠物管理系统’文档中关于触发器部分的代码,并为各个触发器增加执行过程(创建触发器的语法格式一律用小写!!!)
时间: 2024-12-24 20:25:13 浏览: 6
### 修改后的触发器代码及其执行过程
#### 1. 事前触发器
**目的**: 在非工作时间禁止对 `管理员` 表进行任何操作(插入、更新或删除)。
**修改后代码**:
```sql
create or replace trigger t_管理
before insert or update or delete on 管理员
begin
if to_char(sysdate, 'HH24:MI') not between '08:00' and '16:00' then
raise_application_error(-20004, '不能再非工作时间对管理员表进行操作');
end if;
end;
/
```
**执行过程**:
1. 创建触发器:
```sql
create or replace trigger t_管理
before insert or update or delete on 管理员
begin
if to_char(sysdate, 'HH24:MI') not between '08:00' and '16:00' then
raise_application_error(-20004, '不能再非工作时间对管理员表进行操作');
end if;
end;
/
```
2. 测试触发器(假设当前时间为20:00):
```sql
delete from 管理员 where 姓名 = '尔尔';
```
#### 2. 事后触发器
**目的**: 当删除 `用户` 表中的领养人信息时,自动删除 `宠物领养` 表中相关信息。
**修改后代码**:
```sql
create or replace trigger t_删除信息
after delete on 用户
for each row
begin
delete from 宠物领养 where 领养人编号 = :old.用户编号;
end;
/
```
**执行过程**:
1. 创建触发器:
```sql
create or replace trigger t_删除信息
after delete on 用户
for each row
begin
delete from 宠物领养 where 领养人编号 = :old.用户编号;
end;
/
```
2. 测试触发器:
```sql
delete from 用户 where 用户编号 = 'y004';
```
#### 3. 替换触发器
**目的**: 当删除 `宠物领养` 表中的信息时,自动删除 `宠物信息` 表中相关信息。
**修改后代码**:
```sql
create or replace trigger t_update_宠物领养
after delete on 宠物领养
for each row
begin
delete from 宠物信息 where 宠物编号 = :old.宠物编号;
end;
/
```
**执行过程**:
1. 创建触发器:
```sql
create or replace trigger t_update_宠物领养
after delete on 宠物领养
for each row
begin
delete from 宠物信息 where 宠物编号 = :old.宠物编号;
end;
/
```
2. 测试触发器:
```sql
delete from 宠物领养 where 宠物编号 = 'c002';
```
#### 4. 系统触发器
**目的**: 记录所有 DDL 操作到 `dropobjects` 表中。
**修改后代码**:
```sql
create table dropobjects (
objectname varchar2(30),
objecttype varchar(20),
droppenddate date
);
create or replace trigger trigdropobjects
before drop on schema
begin
insert into dropobjects (objectname, objecttype, droppenddate)
values (ora_dict_obj_name, ora_dict_obj_type, sysdate);
end;
/
```
**执行过程**:
1. 创建 `dropobjects` 表:
```sql
create table dropobjects (
objectname varchar2(30),
objecttype varchar(20),
droppenddate date
);
```
2. 创建触发器:
```sql
create or replace trigger trigdropobjects
before drop on schema
begin
insert into dropobjects (objectname, objecttype, droppenddate)
values (ora_dict_obj_name, ora_dict_obj_type, sysdate);
end;
/
```
3. 测试触发器:
```sql
drop table 宠物信息;
```
### 完整的触发器部分代码
```sql
-- 事前触发器
create or replace trigger t_管理
before insert or update or delete on 管理员
begin
if to_char(sysdate, 'HH24:MI') not between '08:00' and '16:00' then
raise_application_error(-20004, '不能再非工作时间对管理员表进行操作');
end if;
end;
/
-- 事后触发器
create or replace trigger t_删除信息
after delete on 用户
for each row
begin
delete from 宠物领养 where 领养人编号 = :old.用户编号;
end;
/
-- 替换触发器
create or replace trigger t_update_宠物领养
after delete on 宠物领养
for each row
begin
delete from 宠物信息 where 宠物编号 = :old.宠物编号;
end;
/
-- 系统触发器
create table dropobjects (
objectname varchar2(30),
objecttype varchar(20),
droppenddate date
);
create or replace trigger trigdropobjects
before drop on schema
begin
insert into dropobjects (objectname, objecttype, droppenddate)
values (ora_dict_obj_name, ora_dict_obj_type, sysdate);
end;
/
```
以上是完整的触发器部分代码及其执行过程,确保每个触发器都能正确创建并测试其功能。
阅读全文