web-dev-qa-db-fra.com

Change un propriétaire de table

J'essaie de changer le propriétaire d'une table:

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'

Mais lors de l'exécution, le message d'erreur suivant s'affiche:

Msg 15001, niveau 16, état 1, procédure sp_changeobjectowner, ligne 62
L'objet 'OWNER.TABLENAME' n'existe pas ou n'est pas un objet valide pour cette opération.

21
Léon Vacher

Pour effectuer cela dans SQL Server 2005 et versions ultérieures, vous devez cesser de penser au préfixe en tant que "propriétaire". La procédure sp_changeobjectowner est obsolète depuis SQL Server 2005 et vous devriez plutôt utiliser schema DDL , par exemple:

ALTER SCHEMA dbo TRANSFER [current_owner].tablename;

Pour vérifier le "propriétaire" actuel (cela peut renvoyer plusieurs lignes si vous avez plus d'une tablename dans plusieurs schémas):

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

Veillez également à épeler correctement l'objet. Dans un classement sensible à la casse, par exemple, TABLENAME et tablename ne sont pas le même objet et son orthographe avec InCorrEcT CaSe pourrait également entraîner cette erreur.

46
Aaron Bertrand

Votre déclaration est correcte:

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

Si l'erreur survient, essayez de vérifier qui est le propriétaire actuel de la table:

EXEC sp_table_privileges '<tableName>'  
5
András Ottó
SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''',  ''dbo''  '  FROM sys.objects WHERE type IN ('U','P','V','FN')

Appliquer les étapes suivantes

(1) Exécuter la requête suivante à l'invite SQL (2) Copier le résultat et coller à nouveau dans une nouvelle requête SQL, puis à nouveau exécuté

Ceci est le propriétaire de changement de vos tables, vues, procédures stockées et fonctions

1
user2000413

Pour couvrir le cas où une table existe dans un nom de schéma construit tel que 'Common' (qui n'est pas lié à un nom d'utilisateur), c'est le propriétaire du schéma qui doit être modifié. 

alter authorization on schema::Common TO dbo;

Cela changera les objets du schéma en propriétaire spécifié "dbo" et maintiendra la table dans "Common".

Pour répertorier les propriétaires de schéma:

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;
0
crokusek

Si la suppression de la table est une option, vous pouvez supprimer et recréer sous l'utilisateur souhaité. Spécifiez simplement dbo dans le script de création. Par exemple:

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
Dustin Kendall