📜  在不使用触发器的情况下捕获 SQL Server 中已删除的行(1)

📅  最后修改于: 2023-12-03 15:37:39.572000             🧑  作者: Mango

在不使用触发器的情况下捕获 SQL Server 中已删除的行

在 SQL Server 数据库中,想要捕获已删除的行通常需要使用触发器。但是,在某些情况下,不能使用触发器,那么我们该如何捕获已删除的行呢?

以下提供了两种方法,供大家参考:

方法一:使用额外的记录表
  1. 在数据库中创建一张额外的记录表,用于记录已被删除的行。
CREATE TABLE DeletedRows
(
  TableName NVARCHAR(128),
  PrimaryKeyColumns NVARCHAR(4000),
  RowData VARBINARY(MAX)
)
  1. 在每个需要捕获已删除行的表上创建一个 AFTER DELETE 触发器。
CREATE TRIGGER [dbo].[MyTable_Delete]
ON [dbo].[MyTable] AFTER DELETE
AS
BEGIN
    DECLARE @deletedRows VARBINARY(MAX);
    SET @deletedRows = (SELECT *, 'MyTable' FROM deleted FOR XML RAW);
    INSERT INTO DeletedRows(TableName, PrimaryKeyColumns, RowData) VALUES('MyTable', '', @deletedRows);
END
  1. 在需要访问已删除行的时候,使用以下查询语句:
SELECT *
FROM DeletedRows
WHERE TableName = 'MyTable'

需要注意的是,这种方法可能会导致性能问题,因为需要在每个表上创建触发器,并且需要额外的表来保存已删除的行信息。

方法二:使用 Change Data Capture(CDC)

Change Data Capture(CDC)是一种 SQL Server 功能,用于捕获表中的所有更改,包括已删除的行。以下是一些基本步骤来启用 CDC:

  1. 在 SQL Server 实例上启用 CDC 功能。
EXEC sp_configure 'cdc', 1;
RECONFIGURE;
  1. 在需要捕获已删除行的表上启用 CDC。
EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name = N'MyTable',
    @supports_net_changes = 1;
  1. 按照需要进行相关配置和查询。
USE [MyDatabase_CDC]
GO

SELECT * FROM cdc.fn_cdc_get_all_changes_MyTable (0, NULL, NULL, NULL, NULL, 'all')
WHERE __$operation = 3

需要注意的是,CDC 功能需要额外的磁盘空间来保存日志信息,同时还需要更高的权限来配置和使用 CDC。另外,CDC 还需要 SQL Server 企业版或开发版等高级版才能使用。

总的来说,以上是两种在不使用触发器的情况下捕获 SQL Server 中已删除的行的方法,需要根据实际情况选择合适的方法。