2012-09-06 11 views
21

Estoy intentando cambiar el propietario de una tabla:Cambio de propietario de una mesa de

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo' 

Pero al ejecutar me sale el mensaje de error:

Msg 15001, nivel 16, estado 1, Procedimiento sp_changeobjectowner, línea 62
El objeto 'OWNER.TABLENAME' no existe o no es un objeto válido para esta operación.

Respuesta

5

Su afirmación es correcta:

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

Si el acaecer de error, trata de comprobar quién es el actual propietario de la tabla:

EXEC sp_table_privileges '<tableName>' 
+0

No, esto no es "la afirmación correcta" y cómo es su primera línea diferente de lo que el PO trató? EXEC no es necesario si es la única declaración en el lote, y el mensaje de error ciertamente no sugiere que el problema EXEC sea el que falta. Por favor, lea esto para ver por qué no debería recomendar sp_changeobjectowner: http://msdn.microsoft.com/en-us/library/ms177519 (v = sql.105) .aspx –

+0

No sé si ha leído todo lo que hay en MSDN, lo hice, y aquí está: "el objeto puede calificarse con el propietario del objeto existente, en la forma existing_owner.object si el shema y su propietario tienen el mismo nombre ". Y está funcionando - probado, SI usted nombró el shema correcto. –

+0

¿Leyó la pieza en la nota amarilla grande en la parte superior de la pantalla? No hay absolutamente ninguna razón para utilizar este procedimiento almacenado obsoleto en SQL Server 2008. ZERO. –

43

La forma correcta de hacer esto en SQL Servidor 2005 y posteriores es dejar de pensar en el prefijo como "propietario". El sp_changeobjectowner procedure es obsoleta desde SQL Server 2005, y en su lugar se debe usar schema DDL, por ejemplo:

ALTER SCHEMA dbo TRANSFER [current_owner].tablename; 

Para comprobar el "dueño" actual (esto puede devolver varias filas si usted tiene más de un tablename en varios esquemas):

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

También asegúrese de deletrear el objeto correctamente. En una intercalación de mayúsculas y minúsculas, por ejemplo, TABLENAME y tablename no son el mismo objeto, y deletrearlo con InCorrEcT CaSE también podría generar este error.

+0

En el momento de escribir esto, esto no se había marcado como la respuesta. Tuve el mismo problema que OP (estaba usando sp_changobjecteowner) ALTER SCHEMA realizó la operación correctamente. Usando SQL Server 2008. – Morvael

+0

@Morvael gracias, el OP no ha estado en el sitio desde finales de 2012, por lo que duda de que alguna vez sea aceptado. –

+0

Intenté el comando ALTER SCHEMA en SQL Server 2005 y obtuve el error "Sintaxis incorrecta cerca de la palabra 'esquema'". El comando de OP me funcionó en SQL Server 2005. Así que en realidad parece que 2005 es la última versión que permite sp_changeobjectowner –

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

Aplicar siguientes pasos

(1) Ejecutar siguiente consulta en SQL Prompt (2) copiar el resultado y pegar otra vez a Nueva consultas SQL y otra vez Ejecutar

Este es el Cambio dueño de su Tablas, vistas, procedimientos almacenados y funciones

0

Si eliminar una tabla es una opción, puede soltarla y volver a crearla con el usuario deseado. Simplemente especifique dbo en el script de creación. Por ejemplo:

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

para cubrir el caso en el que existe una tabla dentro de un nombre de esquema construido como 'común' (que no está relacionado con un nombre de usuario), entonces es el propietario del esquema que necesita ser cambiado.

alter authorization on schema::Common TO dbo; 

Eso cambiará los objetos dentro del esquema al propietario especificado 'dbo' y mantendrá la tabla dentro de 'Común'.

dueños de la lista de esquema:

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; 
Cuestiones relacionadas