Существует ли автоматический способ создания сценария отката при вставке данных с помощью LINQ2SQL? - PullRequest
1 голос
/ 23 апреля 2010

Давайте предположим, что у нас есть набор операторов LINQ2SQL InsertOnSubmit для данного DataContext.Если вызов SubmitChanges успешен, есть ли способ автоматически сгенерировать список команд SQL (или даже операторов LINQ2SQL), которые могут отменить всего, что было отправлено позднее?Это все равно, что выполнить откат, даже если все работает должным образом.

Примечание: целевая база данных будет либо Oracle, либо SQL Server, поэтому, если для обеих баз данных предусмотрены определенные функции, которые будут выполнены, я радиспользуйте это также.

Уточнение: Я не хочу, чтобы "откат" происходил автоматически, как только вставки успешно завершены.Я хочу иметь возможность «отменять» операторы INSERT через DELETE (или каким-либо другим способом) в течение 24 часов (например) после того, как исходная программа закончила вставку данных.Мы можем игнорировать любые возможные проблемы ссылочной целостности, которые могут возникнуть.

Предположим, что таблица A состоит из двух столбцов: Id (автоматически сгенерированный уникальный идентификатор) и Value (строка)

ЕслиКод LINQ2SQL выполняет две вставки

 INSERT INTO Table A VALUES('a') // Creates new row with Id = 1
 INSERT INTO Table A VALUES('z') // Creates new row with Id = 2

<< time passes>>

В какой-то момент позже я хотел бы иметь возможность отменить это, выполнив

 DELETE FROM A Where Id = 1
 DELETE FROM A Where Id = 2

или что-то подобное.Я хочу иметь возможность генерировать операторы DELETE, соответствующие операторам INSERT.Или используйте некоторые функции, которые позволили бы мне захватить транзакцию и выполнить откат позже.

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

Ответы [ 3 ]

2 голосов
/ 23 апреля 2010

На самом деле это довольно легко сделать, потому что вы можете передать SqlConnection в LINQ to SQL DataContext при создании.Просто запустите это соединение в транзакции и откатите эту транзакцию, как только закончите.

Вот пример:

string output;

using (var connection = new SqlConnection("your conn.string"))
{
    connection.Open();
    using (var transaction = connection.StartTransaction())
    {
        using (var context = new YourDataContext(connection))
        {
            // This next line is needed in .NET 3.5.
            context.Transaction = transaction;

            var writer = new StringWriter();
            context.Log = writer;

            // *** Do your stuff here ***

            context.SubmitChanges();

            output = writer.ToString();
        }

        transaction.Rollback();
    }
}
1 голос
/ 11 ноября 2010

От меня всегда требуется предоставить сценарий RollBack нашей команде QA для тестирования, прежде чем любой сценарий изменений может быть выполнен в PROD.

Пример. Файлы отправляются извне вместе с кучей сопоставлений между нами, получателем и другими третьими сторонами. Одна из этих третьих сторон хочет в согласованную дату изменить сопоставления между нами тремя.

Возможно, Exec-скрипт обновит некоторые существующие, удалит некоторые, теперь уже избыточные, и вставит некоторые новые записи - scope_identity, используемый в последующей реляционной настройке и т. Д. И т. Д.

Если по какой-то причине после того, как мы все выполнили наши изменения, и передача файлов была запущена, как и в UAT, мы увидим некоторые ошибки, которых не было в UAT, мы могли бы на многосторонней основе принять решение откатить изменения. Отсюда и сценарий отката.

У SQL есть эта информация, когда вы НАЧИНАЕТЕ TRAN, пока не совершите COMMIT TRAN или ROLLBACK TRAN. Полагаю, ваш вопрос такой же, как и мой, вы можете вывести эту информацию в виде скрипта.

0 голосов
/ 23 апреля 2010

Зачем вам это нужно?

Может быть, вам стоит изучить возможности флешбэка Oracle.Это позволяет путешествовать во времени.

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

См .: http://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm

...