2010-09-17 68 views
7

Tôi có khá nhiều không có kinh nghiệm với Enterprise Manager SQL Server vì vậy tôi không chắc chắn nếu điều này thậm chí có thểSQL Server Enterprise Manager - Thánh lễ Xóa các bảng và thay đổi sở hữu của Bàn

Trong (hoặc hy vọng nực cười đơn giản!) một lần nhập vào cơ sở dữ liệu một cái gì đó đã xảy ra trong đó mỗi bảng đã sao chép chính nó với hai sự khác biệt quan trọng.

Đầu tiên là Chủ sở hữu trên cả hai bảng là khác nhau, thứ hai là chỉ cấu trúc đã sao chép trên một trong các bản sao.

Luật của Sod cho biết tất nhiên dữ liệu được lưu trữ trên bảng do nhầm lẫn, vì vậy tôi có thể nhanh chóng xóa tất cả các bảng do một người dùng sở hữu và tôi có thể nhanh chóng thay đổi quyền sở hữu tất cả các bảng khác chúng trong hàng.

Có đủ bảng tự động hóa sẽ là tùy chọn ưa thích của tôi theo cách DÀI HẠN!

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều, tôi đang chạy SQL Server 2000

+2

Phiên bản của SQL Server? (Tôi đoán năm 2000 vì Enterprise Manager nhưng chỉ để chắc chắn) –

+0

@Martin, yeah 2000, xin lỗi, tôi sẽ sửa bài của tôi ngay bây giờ. – Toby

+0

Đừng quên khắc phục tại sao điều này xảy ra để sự cố không tự tái tạo. Tôi viết tất cả các kịch bản sáng tạo chỉ định cụ thể dbo làm chủ sở hữu (hoặc trong các phiên bản mới hơn, các schemawe muốn sử dụng cho bảng). Tất cả các nhà phát triển của chúng tôi dự kiến ​​sẽ làm điều này và nó là một phần của quy trình xem xét mã của chúng tôi để kiểm tra. – HLGEM

Trả lời

5
declare @emptyOwner varchar(20) 
declare @wrongOwner varchar(20) 
declare @emptyOwnerID bigint 
declare @wrongOwnerID bigint 
declare @tableName nvarchar(255) 

set @emptyOwner = 'dbo' 
set @wrongOwner = 'guest' 

select @emptyOwnerID = (select uid from sysusers where name = @emptyOwner) 
select @wrongOwnerID = (select uid from sysusers where name = @wrongOwner) 

select name as tableName 
into #tempTable 
from systables 
where type='U' 
and exists (select 1 from systables where type = 'U' and uid = @emptyOwnerID) 
and exists (select 1 from systables where type = 'U' and uid = @wrongOwnerID) 

declare @dynSQL nvarchar(MAX) 

declare ownme cursor for 
 select tableName from #tempTable 

open ownme 
fetch next from ownme into @tableName 

while @@FETCH_STATUS = 0 
begin 
   @dynSQL = 'DROP TABLE [' + @emptyOwner + '].[' + @tableName + ']' 
   exec(@dynSQL) 

   @dynSQL = 'sp_changeobjectowner ''[' + @wrongOwner + '].[' + @tableName + ']'',''' + @emptyOwner + '''' 
   exec(@dynSQL) 

   fetch next from ownme into @tableName 
end 

close ownme 
deallocate ownme 
+1

+1 cho giải pháp toàn diện. –

+0

Điều này sẽ tự động hóa toàn bộ quá trình chọn các bảng trùng lặp, thả bảng trống và thay đổi quyền sở hữu. Tất cả những gì bạn cần thay đổi là hai biến chủ sở hữu ở trên cùng. – Fosco

+0

Tuyệt vời, cảm ơn bạn rất nhiều. Bạn đã viết điều đó khi đang bay hay bạn phải làm một điều tương tự trước đây? – Toby

3

Đối với việc thay đổi quyền sở hữu, xem: SQL Table Ownership Changes, Quick and Easy

Mã đưa ra trong các liên kết ở trên là:

DECLARE @old sysname, @new sysname, @sql varchar(1000) 

SELECT 
    @old = 'oldOwner_CHANGE_THIS' 
    , @new = 'dbo' 
    , @sql = ' 
    IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES 
    WHERE 
     QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?'' 
     AND TABLE_SCHEMA = ''' + @old + ''' 
) 
    EXECUTE sp_changeobjectowner ''?'', ''' + @new + '''' 

EXECUTE sp_MSforeachtable @sql 
+0

Điều này sẽ giúp với một phần của câu đố, nhưng nó không giúp loại bỏ các bảng phụ. Ngoài ra, điều này sẽ thay đổi quyền sở hữu của tất cả các bảng, không chỉ là các bảng trùng lặp (mặc dù điều đó có thể được.) – Fosco

+0

Như tôi đã đề cập (trong 3 từ đầu tiên của bài đăng của tôi), điều này nhằm giải quyết sự thay đổi phần sở hữu của câu hỏi. Bạn có chính xác rằng các bảng xấu có lẽ nên được giảm đầu tiên. –

+0

Cảm ơn rất nhiều, đã cứu tôi rất nhiều thời gian! – Toby

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