Sax*_*man 2 sql-server stored-procedures temporal-tables
有没有人知道或知道将执行通用临时表操作以便历史记录和主表都被截断的存储过程?
您必须更改它以设置 system_versioning = off,然后删除历史表,然后截断主表,然后在主表上重新启用版本控制。我打算构建一个通用存储过程来为传递给它的任何数据库/模式/表名称执行此操作,但如果有人已经拥有它,肯定会很好。如果可以避免的话,我从不喜欢重新发明轮子。
MSSQL 文档有一个很好的示例存储过程(尽管远非完美,正如 Martin 在关于它如何不使用QUOTENAME
, for one的评论中指出的)来清理时态表:
DROP PROCEDURE IF EXISTS sp_CleanupHistoryData;
GO
CREATE PROCEDURE sp_CleanupHistoryData
@temporalTableSchema sysname
, @temporalTableName sysname
, @cleanupOlderThanDate datetime2
AS
DECLARE @disableVersioningScript nvarchar(max) = '';
DECLARE @deleteHistoryDataScript nvarchar(max) = '';
DECLARE @enableVersioningScript nvarchar(max) = '';
DECLARE @historyTableName sysname
DECLARE @historyTableSchema sysname
DECLARE @periodColumnName sysname
/*Generate script to discover history table name and end of period column for given temporal table name*/
EXECUTE sp_executesql
N'SELECT @hst_tbl_nm = t2.name, @hst_sch_nm = s.name, @period_col_nm = c.name
FROM sys.tables t1
JOIN sys.tables t2 on t1.history_table_id = t2.object_id
JOIN sys.schemas s on t2.schema_id = s.schema_id
JOIN sys.periods p on p.object_id = t1.object_id
JOIN sys.columns c on p.end_column_id = c.column_id and c.object_id = t1.object_id
WHERE
t1.name = @tblName and s.name = @schName'
, N'@tblName sysname
, @schName sysname
, @hst_tbl_nm sysname OUTPUT
, @hst_sch_nm sysname OUTPUT
, @period_col_nm sysname OUTPUT'
, @tblName = @temporalTableName
, @schName = @temporalTableSchema
, @hst_tbl_nm = @historyTableName OUTPUT
, @hst_sch_nm = @historyTableSchema OUTPUT
, @period_col_nm = @periodColumnName OUTPUT
IF @historyTableName IS NULL OR @historyTableSchema IS NULL OR @periodColumnName IS NULL
THROW 50010, 'History table cannot be found. Either specified table is not system-versioned temporal or you have provided incorrect argument values.', 1
/*Generate 3 statements that will run inside a transaction: SET SYSTEM_VERSIONING = OFF, DELETE FROM history_table, SET SYSTEM_VERSIONING = ON */
SET @disableVersioningScript = @disableVersioningScript + 'ALTER TABLE [' + @temporalTableSchema + '].[' + @temporalTableName + '] SET (SYSTEM_VERSIONING = OFF)'
SET @deleteHistoryDataScript = @deleteHistoryDataScript + ' DELETE FROM [' + @historyTableSchema + '].[' + @historyTableName + ']
WHERE ['+ @periodColumnName + '] < ' + '''' + convert(varchar(128), @cleanupOlderThanDate, 126) + ''''
SET @enableVersioningScript = @enableVersioningScript + ' ALTER TABLE [' + @temporalTableSchema + '].[' + @temporalTableName + ']
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [' + @historyTableSchema + '].[' + @historyTableName + '], DATA_CONSISTENCY_CHECK = OFF )); '
BEGIN TRAN
EXEC (@disableVersioningScript);
EXEC (@deleteHistoryDataScript);
EXEC (@enableVersioningScript);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
只需添加几行额外的行来处理从父表中删除数据,您就可以开展业务了。
奖励:它使用 sysname 作为我非常支持但通常被忽视的数据类型的变量!
归档时间: |
|
查看次数: |
1599 次 |
最近记录: |