📜  SQL Server 中的魔术表

📅  最后修改于: 2022-05-13 01:55:17.266000             🧑  作者: Mango

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