我最近发现了 SQL Server 中的时态表。我想开始使用这个功能。然而,最大的障碍是无法从中删除记录。由于 GDPR 合规性,这是绝对必须的。
从历史表中删除记录显然会导致错误:
无法从临时历史表中删除行
因此,为了能够从历史表中删除记录,我必须禁用SYSTEM_VERSIONING
,然后删除,然后重新启用SYSTEM_VERSIONING
。除非还有另一种我不知道的方法?
因为不可能在存储过程中使用 GO/SqlCommand
,如何确保删除历史记录不会干扰其他交易,例如从历史表中删除记录期间发送到临时表的更新是否仍会导致记录被添加到历史表中?
我尝试创建一个存储过程将其包装在一个事务中,但这失败了,因为ALTER TABLE
声明禁用SYSTEM_VERSIONING
尚未执行,导致相同的错误。
CREATE PROCEDURE [dbo].[OrderHistoryDelete]
(@Id UNIQUEIDENTIFIER)
AS
BEGIN
BEGIN TRANSACTION
ALTER TABLE [dbo].[Order] SET ( SYSTEM_VERSIONING = OFF )
-- No GO possible here obviously.
DELETE FROM [dbo].[OrderHistory] WITH (TABLOCKX)
WHERE [Id] = @Id
ALTER TABLE [dbo].[Order] SET ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[OrderHistory]))
COMMIT TRANSACTION
END
GO
如果您使DELETE
动态的,您的存储过程将成功ALTER
桌子,DELETE
有问题的记录,然后ALTER
回来了。
CREATE PROCEDURE [dbo].[OrderHistoryDelete]
(@Id UNIQUEIDENTIFIER)
AS
BEGIN
DECLARE @sql VARCHAR(MAX)
BEGIN TRANSACTION
ALTER TABLE [dbo].[Order] SET ( SYSTEM_VERSIONING = OFF )
SET @sql = 'DELETE FROM [dbo].[OrderHistory] WITH (TABLOCKX)
WHERE [Id] = ''' + CAST(@Id AS VARCHAR(40)) + ''''
EXEC (@sql)
ALTER TABLE [dbo].[Order] SET ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[OrderHistory]))
COMMIT TRANSACTION
END
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)