2012-09-06 69 views
21

Tôi đang cố gắng để thay đổi chủ sở hữu của một bảng:Thay đổi chủ sở hữu bảng

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo' 

Nhưng khi thực hiện tôi nhận được thông báo lỗi:

Msg 15001, Level 16, State 1, Thủ tục sp_changeobjectowner, Dòng 62
Đối tượng 'OWNER.TABLENAME' không tồn tại hoặc không phải là đối tượng hợp lệ cho hoạt động này.

Trả lời

5

tuyên bố của bạn là chính xác:

EXEC sp_changeobjectowner '<owner>.<tableName>', '<newOwner>' 

Nếu happend lỗi, hãy thử để kiểm tra là người chủ sở hữu hiện tại của bảng:

EXEC sp_table_privileges '<tableName>' 
+0

Không, đây không phải là "tuyên bố chính xác" và thế nào là dòng đầu tiên của bạn bất kỳ khác với những gì OP cố gắng? EXEC là không cần thiết nếu đó là câu lệnh duy nhất trong lô và thông báo lỗi chắc chắn không cho thấy rằng EXEC bị thiếu là vấn đề. Vui lòng đọc phần này để xem tại sao bạn không nên giới thiệu sp_changeobjectowner: http://msdn.microsoft.com/en-us/library/ms177519 (v = sql.105) .aspx –

+0

Tôi không biết bạn đọc tất cả những gì trong MSDN, tôi đã làm, và đây là: "đối tượng có thể được đủ điều kiện với chủ sở hữu của đối tượng hiện có, ở dạng existing_owner.object nếu shema và chủ sở hữu của nó có cùng tên. " Và nó đang hoạt động - được kiểm tra, NẾU bạn đã đặt tên cho phù hợp đúng. –

+0

Bạn đã đọc phần ghi chú lớn màu vàng ở đầu màn hình chưa? Hoàn toàn không có lý do gì để sử dụng thủ tục được lưu trữ không được chấp nhận này trong SQL Server 2008. ZERO. –

43

Các cách chính xác để làm điều này trong SQL Server 2005 trở lên là ngừng suy nghĩ về tiền tố là "chủ sở hữu". Các sp_changeobjectowner procedure đã bị phản đối từ SQL Server 2005, và bạn thay vì nên sử dụng schema DDL, ví dụ:

ALTER SCHEMA dbo TRANSFER [current_owner].tablename; 

Để kiểm tra "chủ sở hữu" hiện hành (điều này có thể trở nhiều hàng nếu bạn có nhiều hơn một tablename trong nhiều schemas):

SELECT s.name 
    FROM sys.schemas AS s 
    INNER JOIN sys.tables AS t 
    ON s.[schema_id] = t.[schema_id] 
    WHERE t.name = N'tablename'; 

Đồng thời đảm bảo rằng bạn đánh vần đúng đối tượng. Trong trường hợp đối chiếu phân biệt chữ hoa chữ thường, ví dụ: TABLENAMEtablename không phải là cùng một đối tượng và đánh vần nó bằng InCorrEcT CaSe cũng có thể dẫn đến lỗi này.

+0

Tại thời điểm viết bài này, nó không được đánh dấu là câu trả lời. Tôi đã có cùng một vấn đề như OP (đã được sử dụng sp_changobjecteowner) ALTER SCHEMA thực hiện các hoạt động chính xác. Sử dụng SQL Server 2008. – Morvael

+0

@Morvael cảm ơn, OP đã không đến trang web từ cuối năm 2012, vì vậy nghi ngờ nó sẽ bao giờ được chấp nhận. –

+0

Tôi đã thử lệnh ALTER SCHEMA trong SQL Server 2005 và gặp lỗi "Cú pháp không đúng gần từ 'lược đồ'". Các lệnh từ OP làm việc cho tôi trong SQL Server 2005. Vì vậy, thực sự trông giống như năm 2005 là phiên bản cuối cùng cho phép sp_changeobjectowner –

1
SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''', ''dbo'' ' FROM sys.objects WHERE type IN ('U','P','V','FN') 

Apply Sau bước

(1) Run Sau Query trên Sql Prompt (2) Sao chép Các kết quả và Dán Một lần nữa đến New Sql Query and Again Execute

Đây là thay đổi chủ sở hữu của bạn Bảng, Lượt xem, Thủ tục được lưu trữ và Chức năng

0

Nếu thả bảng là một tùy chọn, bạn có thể thả và tạo lại theo người dùng mong muốn. Chỉ cần chỉ định dbo trong kịch bản tạo. Ví dụ:

USE [X] 
GO 

/****** Object: Table [dbo].[TableName] Script Date: 4/21/2014 1:26:37 PM ******/ 

CREATE TABLE [dbo].[TableName](
    [Field1] [bigint] NOT NULL, 
    [Field2] [nvarchar](50) NOT NULL, 
    [Field3] [datetime] NOT NULL 
) ON [PRIMARY] 

GO 
0

Để bao gồm trường hợp bảng tồn tại trong tên giản đồ được xây dựng như 'Common' (không liên quan đến tên người dùng), thì đó là chủ sở hữu lược đồ cần phải thay đổi.

alter authorization on schema::Common TO dbo; 

Điều đó sẽ thay đổi các đối tượng trong giản đồ thành chủ sở hữu được chỉ định 'dbo' và giữ bảng trong 'Chung'.

Để liệt kê chủ schema:

select db_name() as Db, 
     sch.name as SchemaName, 
     u.Name as Owner 
    from sys.schemas sch 
    join sys.sysusers u 
    on u.uid = sch.principal_id; 
Các vấn đề liên quan