SQL - обновить, удалить, вставить - Whatif scenerio - PullRequest
1 голос
/ 15 ноября 2010

На днях я читал статью, в которой показано, как запускать SQL Update, Insert или Deletes в качестве сценария типа whatif. Я не помню параметр, о котором они говорили, и теперь я не могу найти статью. Не уверен, что я сплю.

В любом случае, кто-нибудь знает, есть ли в SQL2008 параметр, который позволяет вам пытаться вставить, обновить или удалить без фактической фиксации? Это на самом деле войдет или покажет вам, что он будет обновлен. Вы удаляете параметр и запускаете его, если он ведет себя так, как вы ожидаете.

Ответы [ 6 ]

3 голосов
/ 15 ноября 2010

Я не знаю конкретной функции SQL2008 с какой-либо службой SQL, которая поддерживает транзакции, вы можете сделать это:

  1. Начать транзакцию («НАЧАЛО ТРАНЗАКЦИИ» в TSQL)
  2. Остальная часть вашего кода INSERT / UPDATE / DELETE / what-ever
  3. (необязательно) Некоторые дополнительные операторы SELECT и такие, если необходимо, для вывода результата вышеуказанных действий, если по умолчанию выводится из шага 2 (вещикак «затронуты X строк») недостаточно
  4. Откат транзакции («ROLLBACK TRANSACTION» в TSQL)
  5. (необязательно) Повторите тестовый код, чтобы показать, как обстоят дела без кода в действии2, запустив

Например:

BEGIN TRANSACTION
-- make changes
DELETE people WHERE name LIKE 'X%'
DELETE people WHERE name LIKE 'D%'
EXEC some_proc_that_does_more_work
-- check the DB state after the changes
SELECT COUNT(*) FROM people
-- undo
ROLLBACK TRANSACTION
-- confirm the DB state without the changes
SELECT COUNT(*) FROM people

(вы можете предпочесть сделать необязательный шаг подтверждения перед началом транзакции, а не после ее отката, но ямы всегда делали это так, потому что он объединяет два, вероятно, идентичных раздела кода для более удобного редактирования)

Если вы используете что-то подобное, а не что-то специфичное для SQL2008метод должен быть перенесен и на другие RDBS (просто обновите синтаксис, если необходимо).

2 голосов
/ 15 ноября 2010

ОК, наконец-то разобрался.Я перепутал это с другим проектом, над которым я работал с PowerShell.В PowerShell есть параметр «whatif», с помощью которого можно показать, какие файлы будут удалены перед их удалением.

Приношу свои извинения тем, кто потратил время на поиск ответа на этот порт, и благодарюте из вас, кто ответил.

1 голос
/ 15 ноября 2010

Я полагаю, вы говорите о НАЧАЛО СДЕЛКИ

BEGIN TRANSACTION запускает локальную транзакцию для соединения, выдающего инструкцию. В зависимости от текущих настроек уровня изоляции транзакции многие ресурсы, полученные для поддержки операторов Transact-SQL, выданных соединением, блокируются транзакцией до тех пор, пока она не будет завершена оператором COMMIT TRANSACTION или ROLLBACK TRANSACTION. Транзакции, оставленные невыполненными в течение длительных периодов времени, могут помешать другим пользователям получить доступ к этим заблокированным ресурсам, а также могут предотвратить усечение журнала.

0 голосов
/ 21 мая 2018

Я опоздал на эту вечеринку более чем на семь лет, но я подозреваю, что рассматриваемая функция также могла быть предложением OUTPUT. Конечно, его можно использовать для реализации функциональности whatif, аналогичной Powershell, в хранимой процедуре t-sql.

https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql

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

Затем просто откатите изменения, если для параметра @whatif установлено значение 1, или подтвердите их, если для @whatif установлено значение 0.

0 голосов
/ 15 ноября 2010

Жаба для SQL Server имеет функцию " Validate SQL ", которая проверяет запросы на неправильные имена таблиц / столбцов и т. Д.Может быть, вы говорите о какой-то новой функции в SSMS 2008, похожей на эту ...

0 голосов
/ 15 ноября 2010

Возможно, вы имеете в виду SET NOEXEC ON?

Когда SET NOEXEC включен, SQL Server компилирует каждую партию Transact-SQL заявления, но не выполняет их. Когда SET NOEXEC выключен, все партии выполняются после компиляции.

Обратите внимание, что это не будет предупреждать / указывать на такие вещи, как нарушения ключа.

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