SQL Server 中的魔术表
魔术表是 SQL 服务器在进行插入、删除或更新 (DML) 操作时创建的临时逻辑表。最近对行执行的操作会自动存储在魔术表中。这些不是物理表,而是临时内部表。这些魔术表不能直接检索,我们需要使用触发器访问这些魔术表来获取删除和插入的行。
当以下操作完成时:
- 插入 -
最近插入的行被添加到 INSERTED 魔术表中。 - 删除 -
最近删除的行被添加到 DELETED 魔术表中。 - 更新 -
更新的行存储在 INSERTED 魔术表中,旧行或前一行存储在 DELETED 魔术表中。
让我们看看使用 MSSQL 作为服务器是如何工作的:
创建数据库:
使用以下 SQL 查询创建数据库 GeeksForGeeks,如下所示。
CREATE DATABASE GeeksForGeeks;
使用数据库:
使用数据库 student 使用以下 SQL 查询如下。
USE GeeksForGeeks;
使用 SQL 查询创建表学生如下:
CREATE TABLE students
(
stu_id varchar(10),
stu_name varchar(20),
branch varchar(20)
);
验证数据库:
要查看数据库 GeeksForGeeks 中表的描述,请使用以下 SQL 查询,如下所示。
EXEC sp_columns students;
向表中插入数据:
使用以下 SQL 查询将行插入学生表中,如下所示:
INSERT INTO students VALUES
('1901401','DEVA','C.S'),
('1901402','HARSH','C.S'),
('1901403','ABHISHEK','C.S'),
('1901404','GARVIT','C.S'),
('1901405','SAMPATH','C.S');
验证插入的数据:
使用以下 SQL 查询插入行后查看表,如下所示。
SELECT * FROM students;
在插入操作上创建触发器 T1:
CREATE TRIGGER T1 ON students
AFTER INSERT
AS
BEGIN
SELECT * FROM INSERTED
END
插入条目以检查触发器如何检索 INSERTED 魔术表:
INSERT INTO students VALUES
('1901406','PRADEEP','C.S'),
('1901407','DEVESH','C.S');
SELECT* FROM students ;
在删除操作上创建触发器 T2:
CREATE TRIGGER T2 ON students
AFTER DELETE
AS
BEGIN
SELECT * FROM DELETED
END
删除条目以检查触发器如何检索 DELETED 魔术表:
DELETE FROM students
WHERE stu_name = 'PRADEEP';
SELECT* FROM students ;
在更新操作上创建触发器 T3:
CREATE TRIGGER T3 ON students
AFTER UPDATE
AS
BEGIN
SELECT * FROM DELETED
SELECT* FROM INSERTED
END
更新条目以检查触发器如何检索 DELETED、INSERTED 魔术表,因为我们在 DELETED 和 INSERTED 魔术表中的更新条目中找到了旧条目:
UPDATE students SET stu_name= 'DEVANSH'
WHERE stu_id = '1901401'
SELECT* FROM students