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