2012-09-06 14 views
21

Próbuję zmienić właściciela tabeli:Zmiana właściciela tabeli

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo' 

Ale podczas wykonywania otrzymuję komunikat o błędzie:

Msg 15001, poziom 16, State 1, Procedura sp_changeobjectowner, Linia 62
Obiekt "OWNER.TABLENAME" nie istnieje lub nie jest prawidłowym obiektem dla tej operacji.

Odpowiedz

5

Twoja wypowiedź jest poprawna:

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

Jeśli się stało błąd, starają się sprawdzić, kto jest obecny właściciel tabeli:

EXEC sp_table_privileges '<tableName>' 
+0

Nie, to nie jest „poprawne stwierdzenie” i jak jest to Twoja pierwsza linia inaczej niż PO próbował? EXEC nie jest konieczny, jeśli jest to jedyne oświadczenie w serii, a komunikat o błędzie z pewnością nie sugeruje, że brakowało EXEC. Przeczytaj ten artykuł, aby zobaczyć, dlaczego nie powinieneś polecać sp_changeobjectowner: http://msdn.microsoft.com/en-us/library/ms177519 (v = sql.105) .aspx –

+0

Nie wiem, czy czytasz wszystko, co jest w MSDN, zrobiłem, i tutaj jest: "obiekt może być kwalifikowany z właścicielem istniejący obiekt, w postaci istniejący właściciel.object, jeśli shema i jego właściciel mają tę samą nazwę. " I to jest sprawdzone pod względem pracy, JEŚLI wymieniłeś poprawną shemę. –

+0

Czy przeczytałeś część w dużej żółtej notatce u góry ekranu? Nie ma absolutnie żadnego powodu, aby używać tej nieaktualnej procedury przechowywanej w SQL Server 2008. ZERO. –

43

Poprawny sposób to zrobić w SQL Serwer 2005 i nowszy to przestać myśleć o prefiksie jako "właścicielu". sp_changeobjectowner procedure została zaniechana od SQL Server 2005, i należy zamiast używać schema DDL, np:

ALTER SCHEMA dbo TRANSFER [current_owner].tablename; 

Aby sprawdzić aktualną „właściciel” (to może wrócić wiele wierszy, jeśli masz więcej niż jedną tablename w wielu schematów):

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'; 

Upewnij się również, że poprawnie przeliterowałeś obiekt. W przypadku sortowania z uwzględnieniem wielkości liter, na przykład, TABLENAME i tablename nie są tym samym obiektem, a pisanie go za pomocą INCorrEcT CaSe może również prowadzić do tego błędu.

+0

W chwili pisania tego opisu nie oznaczono jako odpowiedzi. Miałem taki sam problem jak OP (korzystałem z sp_changobjecteowner) ALTER SCHEMA wykonała operację poprawnie. Korzystanie z SQL Server 2008. – Morvael

+0

@Morvael dziękuje, OP nie był na stronie od końca 2012 roku, więc wątpię, czy kiedykolwiek zostanie zaakceptowany. –

+0

Próbowałem polecenia ALTER SCHEMAT w SQL Server 2005 i otrzymałem komunikat "Niepoprawna składnia w pobliżu słowa" schemat "". Polecenie z OP działało dla mnie w SQL Server 2005. Tak naprawdę wygląda na to, że 2005 jest ostatnią wersją, która pozwala sp_changeobjectowner –

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

Zastosuj następujące kroki

(1) Uruchom następującą kwerendę na SQL Prompt (2) Skopiuj wynik i wkleić ponownie do Nowego SQL Query i ponowne uruchomienie

To Change posiadaczem Tabele, widoki, zapisane procedury i funkcje

0

Jeśli upuszczenie tabeli jest opcją, możesz upuścić i ponownie utworzyć żądanego użytkownika. Po prostu określ dbo w skrypcie tworzenia. Na przykład:

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

Aby pokryć przypadek, w którym istnieje tabela z skonstruowanej nazwą schematu jak „wspólne” (które nie jest związane z nazwą użytkownika), to jest właścicielem schematu, który musi zostać zmienione.

alter authorization on schema::Common TO dbo; 

To spowoduje zmianę obiektów w schemacie na określony właściciel "dbo" i utrzymanie tabeli w "Wspólnej".

Do listy właścicieli schematu:

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; 
Powiązane problemy