我正在使用以下查询在各自的历史表中插入给定表发生的更改。我正在为python中的多个表同时执行同一查询(更改表名和数据库)。历史表都没有外键。但是,某些处决最终陷入僵局。每个表都有一个唯一的历史表。我不确定如何解决该问题。是因为我在所有过程中都使用了具有相同名称的变量表吗?
declare @name_tab table (name_column varchar(200),
dtype varchar(200))
declare @columns varchar(max)
declare @query varchar(max)
declare @database varchar(200)
declare @table_name varchar(200)
set @database = '%s'
set @table_name = '%s'
insert into @name_tab
select c.name as name_column,
t.name as dtype
from sys.all_columns c
INNER JOIN sys.types t
ON t.system_type_id = c.system_type_id
where OBJECT_NAME(c.object_id) = @table_name
set @columns= stuff((select ','+name_column from @name_tab FOR XML PATH('')),1, 1, '')
set @query= 'insert into ' +@database+'..'+'HISTORY_'+@table_name+' select super_q.* from' +
'(select cast (GETDATE() as smalldatetime) as TIME_MODIFIED, new_info.* from '+
'(SELECT ' + @columns + ' From '+@database+'..'+@table_name +
' except ' +
'SELECT ' + @columns + ' From '+@database+'..'+'HISTORY_'+@table_name + ') new_info) as super_q'
execute(@query)
答案 0 :(得分:0)
似乎某些并发进程正在同时更改或创建表。死锁XML应该包含有关正在发生的事情的其他详细信息。
但是无论实际原因是什么,解决方案都很简单。使用上面的脚本在静态SQL中生成触发器主体,因此您不必为每个插入查询目录。
在数据库中创建一个名为admin.GenerateHistoryTables
和一个名为admin.GenerateHistoryTriggers
的过程,并提前运行这些 来安装历史记录表并连接触发器。
或者停止重新发明轮子,并使用Change Data Capture或Temporal Tables。