2016-08-22 6 views
2

Нужны некоторые мысли об этом .. У меня есть Temp_Table с некоторыми данными. Основываясь на данных в Temp_Table, я удалю связанные строки из таблиц (внешний ключ), а затем вставьте все данные из таблицы Temp в таблицу1. Как пример ниже.INSERT и DELETE в той же транзакции?

Также важно знать, что мы работаем только с несколькими сотнями строк, не так много строк добавляются или меняются каждый день. И что я сейчас запускаю операторы Insert/Delete в отдельной задаче в SSIS, которая работает.

Вопрос !! Каким образом я могу поместить блокировку на Server2.Table1 (исключая, я полагаю), и запускать как операторы «Удалить», так и «Вставить», прежде чем отпустить эту блокировку? Я не хочу, чтобы кто-нибудь читал или писал в Table1, пока я делаю свои Delete/Inserts. Обратите внимание, что Delete должен быть запущен до инструкции Insert.

Есть ли способ SSIS для этого? Или я могу использовать транзакцию Begin в начале и совершить транзакцию после операторов? Я боюсь, что и «Удалить», и «Вставка» будут выполняться одновременно в одной и той же транзакции, не так ли? Вероятно, есть хороший способ сделать это, который я еще не понял.

Я еще не нашел четкого ответа, используя моего лучшего друга Google. И я хочу, чтобы быть абсолютно уверенным, прежде чем я попробовать что-то из ..

DELETE Table1 
FROM Table1 t1 
    INNER JOIN ( 
     SELECT Column2 FROM Temp_Table 
     GROUP BY Column2 
    ) t2 ON t1.Column2 = t2.Column2 

INSERT INTO Table1 
SELECT (Column1, Column2...) 
FROM Temp_Table 

Thx/Andreas

+1

Ввод этих утверждений между BEGIN TRANSACTION ... COMMIT не запускает их достаточно одновременно (они будут выполняться/откатываться вместе, хотя). В зависимости от уровня изоляции любые приобретенные блоки будут сохраняться до тех пор, пока транзакция не будет завершена или не вернется. – SteveR

+0

Давайте начнем с вопроса, что именно вы пытаетесь выполнить. Вы удаляете все строки из таблицы, связанные с вашей временной таблицей, а затем вставляете результат вашей временной таблицы. Вы действительно пытаетесь сделать UPDATE, если строки существуют и вставляются, если они этого не делают?вы можете использовать вашу временную таблицу для отслеживания изменений записей, чтобы блокировка не имела значения, или вы можете использовать вывод, как предлагается ниже, или ??? – Matt

+0

Я должен добавить, что если вам действительно нужно получить блокировку по всей таблице, вы можете выбросить ее перед удалением: SELECT 1 FROM Table1 WITH (TABLOCKX) – SteveR

ответ

-4

Я не лучший в SQL, но вы можете удалить INSERT/UPDATE/УДАЛИТЬ привилегий других пользователей до тех пор, все готово.

REVOKE INSERT, UPDATE, DELETE ON Table1 FROM [username] 

Возможно, существует намного лучший способ.

Вы также можете поместить вставку на триггер при удалении, но это не гарантирует, что никакие другие транзакции не попадут туда.

0

Вы можете использовать пункт OUTPUT в удаления для вставки в временную таблицу

DELETE FROM dbo.table1 
OUTPUT DELETED.* INTO @MyTable --or temp table 
WHERE id = 10 

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

0

SteveRs комментарий был правилен, Вставка и удаление заявления в течение транзакции не выполнялось одновременно. После некоторого тестирования на базе непроизводственной, я закончил со следующим:

BEGIN TRY 
    BEGIN TRAN T1; 

DELETE Table1 
FROM Table1 t1 
    INNER JOIN ( 
     SELECT Column2 FROM Temp_Table 
     GROUP BY Column2 
    ) t2 ON t1.Column2 = t2.Column2 

INSERT INTO Table1 (Column 1, Column2...) 
SELECT (Column1, Column2...) 
FROM Temp_Table 

COMMIT TRAN T1; 

END TRY 
BEGIN CATCH 
     ROLLBACK TRAN T1; 
END CATCH 

ВЕЬЕТЕ выполняется первым, то утверждение Insert. И эксклюзивный замок не будет выпущен между утверждениями.

Смежные вопросы