2009-01-21 2 views
34

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

Так что мой вопрос имеет два аспекта:

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

  2. Есть ли какие-либо методы или рекомендации для предварительного просмотра «вручную»; например, каким-то образом используя транзакции?

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

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

+0

http://stackoverflow.com/questions/281339/confirm-before-delete-update-in-sql-management -studio – Rockcoder

ответ

51

Я хотел бы использовать предложение OUTPUT, присутствующую в SQL SERVER 2008 года ...

OUTPUT Clause (Transact-SQL)

Что-то вроде ...

BEGIN TRANSACTION 

DELETE [table] OUTPUT deleted.* WHERE [woof] 

ROLLBACK TRANSACTION 

вставки и обновления может использовать 'вставить' таблицу тоже. Статья MSDN охватывает все это.

EDIT:

Это так же, как и другие предложения отборных затем DELETE внутри транзакции, за исключением того, что он на самом деле делает то и другое вместе. Таким образом, вы открываете транзакцию, удаляете/вставляете/обновляете с помощью предложения OUTPUT, и изменения производятся, когда ALSO выводит то, что было сделано. Затем вы можете выбрать откат или фиксацию.

+0

Превосходно, это именно то, что я был после. Спасибо. :) –

+0

Добро пожаловать :) – MatBailie

+0

Я предпочитаю решение Кевина, потому что вы можете видеть результаты без изменения данных. Выбор 100000 записей - это целая группа, которая лучше подходит для производительности базы данных, чем удаление 100000 записей, вывод результатов удаленных и откат. – HLGEM

2

Когда вы находитесь в контексте транзакции, вы можете отменить изменения в любое время до совершения транзакции. (Либо путем вызова совершать 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 
22

Я живу в страхе кто-то делает это в моих баз данных, поэтому я всегда прошу мою команду, чтобы сделать что-то вроде следующего:

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. Это спасло меня пару раз, но оно ВСЕГДА обеспечивает спокойствие.

+0

Я бы поставил DELETE и SELECT наоборот, чтобы повысить безопасность. –

+2

Причина, по которой я делаю это в указанном порядке, заключается в том, что я могу выделить инструкции BEGIN TRAN и DELETE вместе. Если DELETE были прокомментированы, мне пришлось бы делать их отдельно, но это только предпочтение разработчика. Спасибо за комментарий. –

+3

Все работает нормально, пока кто-то не заберет COMMIT - и вы в конечном итоге заблокируете других пользователей. Я видел, что это случается слишком много раз, поэтому будьте осторожны при использовании этой стратегии. –

1

Когда я хочу посмотреть, что будет удален, я просто изменил инструкцию «delete» на «select *». Мне нравится это лучше, чем использование транзакции, потому что мне не нужно беспокоиться о блокировке.

+1

Я всегда стараюсь что-то вкладывать в транзакции. На всякий случай. Как выделение всего, кроме предложения where, удара f5, а затем безучастно глядя на пустую кофейную кружку ... – MatBailie

4

При удалении:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

При обновлении/вставки:

BEGIN TRANSACTION 

    UPDATE table1 
    SET table1.property1 = 99 
    OUTPUT inserted.* 

ROLLBACK TRANSACTION 
Смежные вопросы