将文档中的“健身房系统”代码中的触发器代码按照文档中所给的”触发器知识点“代码形式给触发器执行过程代码补充完整
时间: 2024-12-22 20:18:29 浏览: 9
好的,以下是根据文档中的“健身房系统”代码和“触发器知识点”代码形式补充完整的触发器执行过程:
### 事前触发器
#### 1. `before_enroll` 触发器
```sql
-- 事前触发器
CREATE OR REPLACE TRIGGER before_enroll
BEFORE INSERT ON Enrollment
FOR EACH ROW
DECLARE
v_capacity NUMBER;
BEGIN
SELECT capacity INTO v_capacity
FROM Course
WHERE cid = :NEW.cid;
IF (SELECT COUNT(*) FROM Enrollment WHERE cid = :NEW.cid) >= v_capacity THEN
RAISE_APPLICATION_ERROR(-20001, '课程已满员,无法报名');
END IF;
END;
-- 执行的操作
INSERT INTO Enrollment (eid, mid, cid, edate)
VALUES ('E00008', 'M00001', 'C00001', SYSDATE);
```
### 事后触发器
#### 2. `after_delete_class` 触发器
```sql
-- 事后触发器
CREATE OR REPLACE TRIGGER after_delete_class
AFTER DELETE ON Class
FOR EACH ROW
BEGIN
DELETE FROM Enrollment
WHERE class_id = :OLD.class_id;
END;
-- 执行的操作
DELETE FROM Class
WHERE class_id = 'CL0001';
```
### 替换触发器
#### 3. `instead_of_enrollment` 触发器
```sql
-- 替换触发器
CREATE OR REPLACE TRIGGER instead_of_enrollment
INSTEAD OF INSERT ON v_Enrollment
FOR EACH ROW
BEGIN
INSERT INTO Enrollment (eid, mid, cid, edate)
VALUES (:NEW.eid, :NEW.mid, :NEW.cid, :NEW.edate);
END;
-- 执行的操作
INSERT INTO v_Enrollment (eid, mid, cid, edate)
VALUES ('E00008', 'M00001', 'C00001', SYSDATE);
```
### 级联触发器
#### 4. `cascade_delete_trainer` 触发器
```sql
-- 级联触发器
CREATE OR REPLACE TRIGGER cascade_delete_trainer
AFTER DELETE ON Trainer
FOR EACH ROW
BEGIN
DELETE FROM Class
WHERE tid = :OLD.tid;
END;
-- 执行的操作
DELETE FROM Trainer
WHERE tid = 'T00001';
```
### 系统触发器
#### 5. `trig_drop_objects` 触发器
```sql
-- 系统触发器
CREATE TABLE DropObjects (
object_name VARCHAR2(30),
object_type VARCHAR2(20),
drop_date DATE
);
CREATE OR REPLACE TRIGGER trig_drop_objects
BEFORE DROP ON SCHEMA
BEGIN
INSERT INTO DropObjects (object_name, object_type, drop_date)
VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE);
END;
-- 执行的操作
DROP TABLE Teacher;
```
### 示例执行结果
假设以上触发器均已成功创建,以下是一些示例执行结果:
1. **`before_enroll` 触发器**
- 插入一条新的报名记录,如果课程已满员,会抛出错误。
```sql
INSERT INTO Enrollment (eid, mid, cid, edate)
VALUES ('E00008', 'M00001', 'C00001', SYSDATE);
```
如果课程 `C00001` 已经满员,会看到如下错误:
```
ORA-20001: 课程已满员,无法报名
```
2. **`after_delete_class` 触发器**
- 删除一条上课记录,相关的报名记录会被自动删除。
```sql
DELETE FROM Class
WHERE class_id = 'CL0001';
```
相关的报名记录也会被删除。
3. **`instead_of_enrollment` 触发器**
- 在视图上插入一条新的报名记录,实际会在基表 `Enrollment` 中插入。
```sql
INSERT INTO v_Enrollment (eid, mid, cid, edate)
VALUES ('E00008', 'M00001', 'C00001', SYSDATE);
```
基表 `Enrollment` 中会新增一条记录。
4. **`cascade_delete_trainer` 触发器**
- 删除一名教练,相关课程的上课记录会被自动删除。
```sql
DELETE FROM Trainer
WHERE tid = 'T00001';
```
相关的上课记录也会被删除。
5. **`trig_drop_objects` 触发器**
- 删除一张表,相关信息会被记录到 `DropObjects` 表中。
```sql
DROP TABLE Teacher;
```
`DropObjects` 表中会增加一条记录,记录删除的表名、类型和时间。
希望这些补充完整的触发器代码对你有帮助!如果有任何其他问题,请随时告诉我。
阅读全文