Ai đó muốn có một đâm vào giải thích các cơ chế này ... này quirk ít của các phân tích cú pháp truy vấn gần như gây ra thiệt hại lớn cho tôi ngày hôm nay.Làm thế nào để vô tình xóa tất cả các hàng trong một bảng
Tạo bảng thử nghiệm có 100 hàng, với 1-100.
create table test(JobID int primary key);
;with numbers as (
select 1 as n
union all
select n + 1 as n
from numbers
where n < 100
)
insert into test
select n from numbers
Tạo một bảng tạm thời với số nguyên 1-50 trong đó:
select jobid as number into #deletions
from test
where jobid <= 50
Bây giờ làm một xóa bằng một IN
khoản nhưng với tên cột sai trong truy vấn bên trong:
delete from test where JobID in (select JobID from #deletions)
Tuyên bố xóa cuối cùng, từ lần xuất hiện, cho hình thức xóa 50 hàng ... Tuy nhiên, không có JobID
trong #deletions
, vì vậy tôi t loại kéo từ truy vấn bên ngoài và kết thúc bằng cách nào đó, xóa tất cả các hàng trong thử nghiệm.
Câu hỏi của tôi là, làm cách nào để giải thích truy vấn bên trong đó ... #deletions
chỉ có 50 hàng, vậy làm cách nào để kéo tất cả 100 id từ bảng ngoài? Loại lỗi đánh máy/sai lầm này gần như đã gây ra thiệt hại lớn cho tôi hôm nay.
Theo ý kiến của tôi, điều này sẽ ném một số loại lỗi phân tích cú pháp/cú pháp hoặc một số loại lỗi mơ hồ.
Dưới đây là một SQL Fiddle Demo
Ít nhất bạn sẽ không thực hiện truy vấn như thế này nữa :-) Không bao giờ gửi 'DELETE' hoặc' UPDATE' mà không kiểm tra. Thay đổi 'DELETE' thành' SELECT * 'và xem cái gì được trả về. – dnoeth
Không có sự mơ hồ ở đây vì JobID chỉ tồn tại trên bảng 'test' bên ngoài. Bạn đúng là phạm vi đó không rõ ràng, đó là lý do tại sao việc thực hiện thói quen của các tên cột đủ điều kiện với tên bảng hoặc bí danh trong các truy vấn nhiều bảng là một cách hay. –
Bất cứ khi nào bạn đang lộn xộn với UPDATE/DELETE/MERGE/INSERT, luôn luôn bọc với BEGIN TRAN và ROLLBACK TRAN. Một trong những lời khuyên quan trọng nhất cho sản xuất Ops guys. – Greg