Подтвердить что ты не робот

Как просмотреть деструктивный SQL-запрос?

При написании деструктивных запросов (например, DELETE или UPDATE) в SQL Server Management Studio я всегда желаю, чтобы я мог просмотреть результаты запроса без его фактического запуска. Доступ очень удобно позволяет вам это делать, но я предпочитаю код моего SQL вручную, который, к сожалению, Access очень плохой.

Итак, мой вопрос двоякий:

  • Есть ли надстройка для SSMS или отдельный инструмент, снабженный хорошими средствами кодирования SQL-кода, который также может просматривать результат деструктивного запроса, аналогичный Access?

  • Существуют ли какие-либо методы или рекомендации для предварительного просмотра "вручную"; например, каким-то образом используя транзакции?

Мне кажется, что делать такие вещи принципиально важны, но все же я не могу найти что-либо через Google (я, вероятно, просто искал неправильную вещь - я ужасно неосведомлен по этому вопросу). В настоящее время я беру довольно волосатый пояс и подтягивает подход комментирования строк ввода/вывода/удаления/обновления и обеспечения резервных копий. Должен быть лучший способ, конечно?

Может ли кто-нибудь помочь?

4b9b3361

Ответ 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 *". Мне нравится это лучше, чем использование транзакции, потому что мне не нужно беспокоиться о блокировке.