Как просмотреть деструктивный SQL-запрос?
При написании деструктивных запросов (например, DELETE или UPDATE) в SQL Server Management Studio я всегда желаю, чтобы я мог просмотреть результаты запроса без его фактического запуска. Доступ очень удобно позволяет вам это делать, но я предпочитаю код моего SQL вручную, который, к сожалению, Access очень плохой.
Итак, мой вопрос двоякий:
-
Есть ли надстройка для SSMS или отдельный инструмент, снабженный хорошими средствами кодирования SQL-кода, который также может просматривать результат деструктивного запроса, аналогичный Access?
-
Существуют ли какие-либо методы или рекомендации для предварительного просмотра "вручную"; например, каким-то образом используя транзакции?
Мне кажется, что делать такие вещи принципиально важны, но все же я не могу найти что-либо через Google (я, вероятно, просто искал неправильную вещь - я ужасно неосведомлен по этому вопросу). В настоящее время я беру довольно волосатый пояс и подтягивает подход комментирования строк ввода/вывода/удаления/обновления и обеспечения резервных копий. Должен быть лучший способ, конечно?
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Я бы использовал предложение OUTPUT, существующее в SQL SERVER 2008 и далее...
Предложение OUTPUT (Transact-SQL)
Что-то вроде...
BEGIN TRANSACTION
DELETE [table] OUTPUT deleted.* WHERE [woof]
ROLLBACK TRANSACTION
ВСТАВКИ и ОБНОВЛЕНИЯ могут также использовать "вставленную" таблицу. Статья MSDN охватывает все это.
EDIT:
Это точно так же, как и другие предложения SELECT, а затем DELETE внутри транзакции, за исключением того, что на самом деле это происходит вместе. Таким образом, вы открываете транзакцию, удаляете/вставляете/обновляете с помощью предложения OUTPUT, и изменения производятся, когда ALSO выводит то, что было сделано. Затем вы можете выбрать откат или фиксацию.
Ответ 2
Я живу в страхе перед тем, что кто-то делает это с моими базами данных, поэтому я всегда прошу мою команду сделать что-то вроде следующего:
BEGIN TRAN
DELETE FROM X
-- SELECT * FROM X
FROM Table A as X JOIN Table B ON Blah blah blah
WHERE blah blah blah
ROLLBACK TRAN
COMMIT TRAN
Таким образом, если вы случайно нажмете F5 (сделайте это!), вы не внесете никаких изменений. Вы можете выделить часть SELECT в конце инструкции SQL, чтобы увидеть, какие записи будут изменены (и сколько). Затем выделите инструкцию BEGIN TRAN и весь Delete и запустите ее. Если вы удалите столько же ожидаемых записей, выделите COMMIT TRAN и запустите его. Если что-то выглядит неуклюжим, выделите ROLLBACK TRAN и запустите его.
Я делаю это с помощью любой инструкции UPDATE или DELETE. Он спас меня пару раз, но он ВСЕГДА обеспечивает спокойствие.
Ответ 3
При удалении:
BEGIN TRANSACTION
DELETE FROM table1
OUTPUT deleted.*
WHERE property1 = 99
ROLLBACK TRANSACTION
При обновлении/вставке:
BEGIN TRANSACTION
UPDATE table1
SET table1.property1 = 99
OUTPUT inserted.*
ROLLBACK TRANSACTION
Ответ 4
Когда вы находитесь в контексте транзакции, вы можете откатывать изменения в любое время до совершения транзакции. (Либо путем явного вызова commit tran, либо если возникает условие, которое приведет к тому, что сервер неявно совершит транзакцию)
create table x (id int, val varchar(10))
insert into x values (1,'xxx')
begin tran
delete from x
select * from x
rollback tran
select * from x
Ответ 5
Когда я хочу посмотреть, что будет удалено, я просто изменил инструкцию "delete" на "select *". Мне нравится это лучше, чем использование транзакции, потому что мне не нужно беспокоиться о блокировке.