CREATE TABLE g_log ( Sno CHAR(8), Cno CHAR(4), Grade INT ); CREATE TRIGGER update_grade AFTER UPDATE ON SC FOR EACH ROW BEGIN INSERT INTO g_log(Sno, Cno, Grade) VALUES (NEW.Sno, NEW.Cno, NEW.Grade); END; CREATE TRIGGER instead_of_delete INSTEAD OF DELETE ON C FOR EACH ROW BEGIN DECLARE selected INT; SELECT COUNT(*) INTO selected FROM SC WHERE Cno = OLD.Cno; IF selected > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '此课程已有学生已选修,无法删除'; ELSE DELETE FROM C WHERE Cno = OLD.Cno; END IF; END;
时间: 2024-02-29 22:56:52 浏览: 24
这段代码是一个 MySQL 数据库的触发器,其中包含了两个触发器:
1. "update_grade" 触发器:当 SC 表中的某一行被更新时,会将更新后的 Sno、Cno 和 Grade 值插入到 g_log 表中。
2. "instead_of_delete" 触发器:当 C 表中的某一行被删除时,会首先检查 SC 表中是否有学生选修了该课程,如果有,则会抛出一个异常,否则会删除该行。
值得注意的是,这两个触发器都是针对相应表中的每一行进行操作的,也就是说,每当表中有一行被更新或删除时,这些触发器都会被触发。
相关问题
use [StuCou210934] go create table SC210934 ( SC_Sno char(7) not null primary key(SC_Sno,SC_Cno) , SC_Cno char(3) not null , SC_Cname nvarchar(20) not null, SC_PreCno char(3), SC_Credit tinyint )给Sno和Cno添加外键
在 SQL Server 中,可以使用 `ALTER TABLE` 语句添加外键约束。以下是添加 `SC210934` 表中 `SC_Sno` 和 `SC_Cno` 列的外键约束的 SQL 语句:
```
ALTER TABLE SC210934
ADD CONSTRAINT FK_SC210934_Sno
FOREIGN KEY (SC_Sno)
REFERENCES 学生表(Sno);
ALTER TABLE SC210934
ADD CONSTRAINT FK_SC210934_Cno
FOREIGN KEY (SC_Cno)
REFERENCES 课程表(Cno);
```
上面的 SQL 语句中,`FK_SC210934_Sno` 和 `FK_SC210934_Cno` 是外键约束的名称,`SC_Sno` 和 `SC_Cno` 是要添加外键约束的列名。`学生表(Sno)` 和 `课程表(Cno)` 是参考表的名称和列名。在实际使用时,需要将 `学生表` 和 `课程表` 替换为实际的表名和列名。
create trigger on_studen on student after update as begin if object_id(N'student_',N'U') is null create table student_(sno varchar(15),name varchar(15)); declare @pre_sno varchar(15) declare @pre_name varchar(15) select @pre_sno = sno from deleted select @pre_name =name from deleted insert into student_(sno,name) values(@pre_sno,@pre_name) end帮我分析这个触发器
这个触发器是在SQL Server数据库中创建的,它是一个在student表上的after update触发器。当在student表中进行更新操作时,该触发器会被激活,执行以下操作:
首先,它会检查名为student_的表是否存在,如果不存在,则创建一个新的student_表,其中包含sno和name两列。
然后,它会从被更新的行中获取sno和name的值,并将它们存储在@pre_sno和@pre_name变量中。
最后,它会将@pre_sno和@pre_name的值插入到student_表中。
该触发器的目的是在每次更新student表时,将更新前的sno和name的值保存到student_表中,以便进行历史记录或审计。需要注意的是,这个触发器只适用于单个更新操作,如果同时更新多行,它只会记录其中一行的更新前值。