2008-08-11 40 views
5

Có cách nào đơn giản để loại bỏ một nhóm các bảng có liên quan trong SQL Server không? Lý tưởng nhất là tôi muốn tránh phải lo lắng về thứ tự mà họ đang bị bỏ rơi vì tôi biết cả nhóm sẽ biến mất vào cuối quá trình.Rơi một nhóm bảng trong SQL Server

Trả lời

2

Có nguy cơ nghe có vẻ ngu ngốc, tôi không tin rằng SQL Server hỗ trợ cú pháp xóa/xếp tầng. Tôi nghĩ rằng bạn có thể cấu hình một quy tắc xóa để làm tầng xóa (http://msdn.microsoft.com/en-us/library/ms152507.aspx), nhưng theo như tôi biết các trick với SQL Server là chỉ để chạy truy vấn thả của bạn một lần cho mỗi bảng bạn đang rơi, sau đó kiểm tra nó làm việc.

0

Tôi không có quyền truy cập vào SQL Server để kiểm tra điều này, nhưng làm thế nào về:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE; 
0

Tôi không chắc chắn, nếu cách tiếp cận của Derek hoạt động. Bạn chưa đánh dấu nó là câu trả lời hay nhất.

Nếu không: với SQL Server 2005, tôi đoán là có thể.
Ở đó, họ đã giới thiệu các ngoại lệ (mà tôi chưa sử dụng). Vì vậy, thả bảng, bắt ngoại lệ, nếu một xảy ra và thử bảng tiếp theo cho đến khi tất cả chúng đều biến mất.
Bạn có thể lưu trữ danh sách các bảng trong bảng tạm thời và sử dụng con trỏ để di chuyển nó, nếu bạn muốn.

0

Tôi đã kết thúc bằng cách sử dụng Apache ddlutils để thực hiện việc thả cho tôi, sắp xếp nó trong trường hợp của tôi, mặc dù một giải pháp làm việc chỉ trong máy chủ sql sẽ khá đơn giản hơn một chút.

@ Derek Park, tôi không biết bạn có thể tạo các bảng riêng biệt ở đó, vì vậy tiện dụng, nhưng dường như không hoạt động như mong đợi. Nether NẾU EXISTS cũng không CASCADE được máy chủ sql nhận diện, và chạy drop table X, Y, Z dường như chỉ hoạt động nếu chúng bị bỏ theo thứ tự đã nêu.

Xem thêm http://msdn.microsoft.com/en-us/library/ms173790.aspx, mô tả cú pháp bảng thả.

0

Điều bạn giữ lại từ việc thả các bảng theo thứ tự bất kỳ là phụ thuộc chính của nước ngoài giữa các bảng. Vì vậy, loại bỏ FK trước khi bạn bắt đầu.

  1. Sử dụng hệ thống quan điểm INFORMATION_SCHEMA, lấy một danh sách của tất cả các phím nước ngoài liên quan đến bất kỳ các bảng
  2. Drop mỗi một trong các phím nước ngoài
  3. Bây giờ bạn sẽ có thể thả tất cả các bảng, sử dụng bất kỳ thứ tự nào bạn muốn.
1

Một cách tiếp cận khác có thể là: trước tiên hãy loại bỏ các ràng buộc, sau đó thả các bảng trong một lần chụp.

Nói cách khác, DROP CONSTRAINT cho mọi ràng buộc, sau đó là DROP TABLE cho mỗi bảng; tại thời điểm này thứ tự thực hiện không phải là một vấn đề.

1

này đòi hỏi sự sp___drop___constraints kịch bản bạn có thể tìm thấy ở Database Journal:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?" 
GO 
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?" 
GO 

LƯU Ý này - rõ ràng - nếu bạn có nghĩa là để thả TẤT CẢ các bảng trong cơ sở dữ liệu của bạn, vì vậy hãy cẩn thận

Các vấn đề liên quan