Выполните вставку, а затем войдите в одну команду SQL - PullRequest
0 голосов
/ 16 сентября 2008

Меня попросили реализовать некоторый код, который будет обновлять строку в базе данных MS SQL Server, а затем использовать сохраненный процесс для вставки обновления в таблицу истории. Мы не можем добавить сохраненный процесс для этого, так как мы не контролируем базу данных. Я знаю, что в хранимых процессах вы можете выполнить обновление, а затем вызвать execute для другого сохраненного процесса. Могу ли я настроить это, чтобы сделать это в коде с помощью одной команды SQL?

Ответы [ 6 ]

1 голос
/ 16 сентября 2008

Вам не нужен сохраненный процесс для этого. Вопрос действительно сводится к тому, есть ли у вас контроль над всеми вставками. Если на самом деле у вас есть доступ ко всем вставкам, вы можете просто обернуть вставку в таблицу данных и вставку в таблицу истории за один раз. Это гарантирует, что оба будут завершены для «успеха». Однако при последовательном доступе к таблицам внутри транзакции необходимо убедиться, что вы не блокируете историю, а затем информацию, иначе вы можете столкнуться с тупиковой ситуацией.

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

1 голос
/ 16 сентября 2008

Либо запустите оба в одном и том же операторе (разделите отдельные команды точкой с запятой), либо используйте транзакцию, чтобы можно было откатить первый оператор, если 2-й окажется неудачным.

0 голосов
/ 16 сентября 2008

Спасибо всем за ваш ответ, ниже приведен краткий обзор того, что я в итоге сделал. Теперь, чтобы проверить, действительно ли транс откатывается в случае сбоя.

sSQL = "BEGIN TRANSACTION;" & _
           " Update table set col1 = @col1, col2 = @col2" & _
           " where col3 = @col3 and " & _
           " EXECUTE addcontacthistoryentry @parm1, @parm2, @parm3, @parm4, @parm5, @parm6; " & _
           "COMMIT TRANSACTION;"
0 голосов
/ 16 сентября 2008

Недостаточно информации - какой SQL-сервер? Зачем нужна таблица истории?

Триггеры будут делать такие вещи. Binlog MySQL может быть более полезным для вас.

Вы говорите, что не контролируете базу данных. Вы управляете кодом, который обращается к нему? Добавьте туда логи и держите их вне сервера SQL полностью.

0 голосов
/ 16 сентября 2008

В зависимости от вашей библиотеки вы можете просто поместить оба запроса в одну командную строку, разделенную точкой с запятой.

0 голосов
/ 16 сентября 2008

Вы также можете создавать триггеры sql.

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