2013-09-07 38 views
5

Có cách nào để thả tất cả các đối tượng trong một db, với các đối tượng thuộc về hai lược đồ khác nhau không?Thả tất cả các đối tượng trong cơ sở dữ liệu SQL Server thuộc về các lược đồ khác nhau?

tôi trước đây đã làm việc với một lược đồ, vì vậy tôi truy vấn tất cả đối tượng sử dụng:

Select * From sysobjects Where type=... 

sau đó giảm tất cả mọi thứ tôi sử dụng

Drop Table ... 

Bây giờ tôi đã giới thiệu sơ đồ khác, mỗi khi tôi cố gắng để thả nó nói điều gì đó về tôi không có sự cho phép hoặc đối tượng không tồn tại. NHƯNG, nếu tôi tiền tố đối tượng với [schema.object] nó hoạt động. Tôi không biết làm thế nào để tự động hóa điều này, bởi vì tôi không biết những gì các đối tượng, hoặc trong đó hai lược đồ đối tượng sẽ thuộc về. Bất cứ ai cũng biết làm thế nào để thả tất cả các đối tượng bên trong một db, bất kể nó thuộc về nó?

(Người dùng sử dụng là chủ sở hữu của cả hai lược đồ, các đối tượng trong DB được tạo ra bởi người dùng cho biết, cũng như những người dùng là loại bỏ các đối tượng -. Mà hoạt động nếu tiền tố tôi đã sử dụng IE Drop Table Schema1.blah)

+1

gợi ý: sysschemas. Trong thực tế: sys.schemas –

Trả lời

3

sử dụng sys.objects kết hợp với OBJECT_SCHEMA_NAME để xây dựng DROP TABLE báo cáo của bạn, xem xét, sau đó sao chép/dán để thực hiện:

SELECT 'DROP TABLE ' + 
     QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
     QUOTENAME(name) + ';' 
    FROM sys.objects 
WHERE type_desc = 'USER_TABLE'; 

Hoặc sử dụng sys.tables để tránh nhu cầu của bộ lọc type_desc:

012.
SELECT 'DROP TABLE ' + 
     QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
     QUOTENAME(name) + ';' 
    FROM sys.tables; 

SQL Fiddle

+2

Plus, như của SQL Server ** 2005 ** và mới hơn, tôi khuyên bạn nên sử dụng khung nhìn 'sys.tables' tập trung hơn thay vì chọn từ' sys.objects' và phải cung cấp 'type_desc '.... –

+1

@marc_s Điểm tốt, được chỉnh sửa để bao gồm' sys.tables' – Bryan

+0

Đây chính xác là những gì tôi đang tìm kiếm, điều này giống như sys.schemas ban đầu được đề xuất? Chỉ vấn đề tôi gặp phải, là tôi muốn bỏ tất cả các đối tượng và tôi có thể tìm thấy tất cả các sys.table, sys.vew, v.v. ngoại trừ các chức năng. Nhưng đề nghị đầu tiên của bạn làm việc tốt cho việc này. –

0

Tôi không biết phiên bản Mà của Sql Server bạn đang sử dụng, nhưng giả định rằng là 2008 hay muộn, có lẽ lệnh sau đây sẽ rất hữu ích (kiểm tra xem bạn có thể thả tất cả các bảng trong một đơn giản dòng):

sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?" 

kịch bản này sẽ thực hiện DROP TABLE .... cho tất cả các bảng từ cơ sở dữ liệu database_name. Rất đơn giản và hoạt động hoàn hảo. Lệnh này có thể được sử dụng để thực thi câu lệnh sql khác, ví dụ:

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?" 
+1

'use' thay đổi cơ sở dữ liệu ** hiện tại **, không phải lược đồ hiện tại (tôi thậm chí không chắc khái niệm của lược đồ * hiện tại trong SQL Server) –

+0

@a_horse_with_no_name xin lỗi lỗi của tôi, bài viết của tôi đã được sửa chữa. Cảm ơn. –

3

Cả trong những câu hỏi khác dường như đã cố gắng để giải quyết các tất cả các đối tượng phần của câu hỏi.

Tôi ngạc nhiên khi bạn phải cuộn của riêng bạn với điều này - tôi mong đợi có một giản đồ thả blah thác. Chắc chắn tất cả những người thiết lập một máy chủ dev sẽ phải làm điều này và phải làm một số meta-lập trình trước khi có thể làm lập trình bình thường là nghiêm trọng khủng khiếp. Dù sao ... rant hơn!

Tôi bắt đầu xem xét một số bài viết này như một cách để làm điều đó bằng cách xóa một lược đồ: Có một số old article về việc này, tuy nhiên các bảng được đề cập trên đó bây giờ là marked as deprecated. Tôi cũng đã xem xét số documentation for the new tables để giúp hiểu những gì đang diễn ra ở đây.

another answergreat dynamic sql resource liên kết đến.

Sau khi xem xét tất cả nội dung này trong một thời gian, tất cả dường như hơi quá lộn xộn.

Tôi nghĩ rằng lựa chọn tốt hơn là để đi cho

ALTER DATABASE 'blah' SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
drop database 'blah' 

create database 'blah' 

để thay thế. Câu thần chú bổ sung ở phía trên về cơ bản là buộc thả cơ sở dữ liệu là mentioned here

Có một chút sai lầm nhưng số lượng phức tạp liên quan đến việc viết tập lệnh thả là lý do chính đáng để tránh nó.

Nếu có vẻ như có vấn đề với việc thả cơ sở dữ liệu, tôi có thể truy cập lại một số liên kết và đăng câu trả lời khác

+0

Chắc chắn đồng ý với bạn về việc thiếu một giản đồ thả xuống. Câu trả lời này đã thuyết phục tôi ngừng tìm kiếm và chỉ xóa toàn bộ cơ sở dữ liệu. – flodin

+0

@flodin vâng lúc đầu cảm thấy hơi sai nhưng tôi đã không nhìn lại từ đó. Nó không phải là một hoạt động tốn kém để xé xuống + tạo cơ sở dữ liệu mới trong máy chủ sql. Rất vui khi được giúp đỡ! –

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