Тупик MS-SQL при вставке в таблицу - PullRequest
0 голосов
/ 19 апреля 2019

Я использую следующий запрос для вставки в соответствующую хронологическую таблицу изменений, произошедших в данной таблице. Я выполняю один и тот же запрос одновременно для нескольких таблиц в 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) 

Я получил этот образец из system_health enter image description here

1 Ответ

0 голосов
/ 20 апреля 2019

Похоже, что какой-то параллельный процесс изменяет или создает таблицу одновременно. XML взаимоблокировки должен содержать дополнительные сведения о том, что происходит.

Но какова бы ни была истинная причина, решение простое. Используйте приведенные выше сценарии для генерации тел триггеров в статическом SQL, чтобы вам не приходилось запрашивать каталог для каждой вставки.

Создайте в вашей базе данных, скажем, admin.GenerateHistoryTables и одну admin.GenerateHistoryTriggers и запустите эти раньше времени , чтобы установить таблицы истории и подключить триггеры.

Или прекратите заново изобретать колесо и используйте Изменить захват данных или Временные таблицы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...