📅  最后修改于: 2023-12-03 15:37:39.572000             🧑  作者: Mango
在 SQL Server 数据库中,想要捕获已删除的行通常需要使用触发器。但是,在某些情况下,不能使用触发器,那么我们该如何捕获已删除的行呢?
以下提供了两种方法,供大家参考:
CREATE TABLE DeletedRows
(
TableName NVARCHAR(128),
PrimaryKeyColumns NVARCHAR(4000),
RowData VARBINARY(MAX)
)
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
SELECT *
FROM DeletedRows
WHERE TableName = 'MyTable'
需要注意的是,这种方法可能会导致性能问题,因为需要在每个表上创建触发器,并且需要额外的表来保存已删除的行信息。
Change Data Capture(CDC)是一种 SQL Server 功能,用于捕获表中的所有更改,包括已删除的行。以下是一些基本步骤来启用 CDC:
EXEC sp_configure 'cdc', 1;
RECONFIGURE;
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@supports_net_changes = 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 中已删除的行的方法,需要根据实际情况选择合适的方法。