Modifier le nom de schéma de la table dans SQL


175

Je veux changer le nom de schéma de la table Employeesdans la base de données. Dans le Employeesnom du schéma de base de données de table actuel, dboje veux le changer exe. Comment puis-je le faire ?

Exemple:

DE

dbo.Employees

À

exe.Employees

J'ai essayé avec cette requête:

ALTER SCHEMA exe TRANSFER dbo.Employees

Mais cela me donne une erreur:

Impossible de modifier le schéma «exe», car il n'existe pas ou vous n'avez pas l'autorisation.

Qu'est-ce que j'ai raté?



1
Le schéma exe existe-t-il?
James Culshaw

Non, je n'ai pas créé. Que dois-je faire pour le créer?
theChampion


J'ai vu cet article mais c'est peu déroutant. Pouvez-vous me montrer comment créer le schéma dans ma situation?
theChampion

Réponses:


272

Créer un schéma:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'exe')) 
BEGIN
    EXEC ('CREATE SCHEMA [exe] AUTHORIZATION [dbo]')
END

Schéma ALTER:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
Pouvez-vous expliquer ce que sont sys.scemas et la fonction EXEC (...)?
theChampion

10
sys.schemasest une table qui contient tous les schémas de la base de données. L'exécutable ('...') exécute simplement un appel SQL dynamique, dans ce cas, il est nécessaire car une commande CREATE SCHEMA doit être la première instruction d'un lot de requêtes et s'exécuter en tant que SQL dynamique vous permet d'obtenir cela.
Eric

Pour toutes les tables , cochez ceci et cela pour le faire en une seule déclaration, espérons aider quelqu'un.
shaijut

L'utilisation du schéma alter semble extrêmement lente. (Je l'ai arrêté après 3 minutes pour transférer une petite table avec 300 lignes.) Au lieu de cela, j'ai utilisé select * dans exe. Employés de dbo.Employees
fivelements

29

Essayez ci-dessous

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

J'ai dû utiliser set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tablepour m'assurer que certains mots / caractères spéciaux ne provoquent pas d'erreur.
Stoinov

21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

Je dois toujours utiliser les crochets lorsque j'utilise la ALTER SCHEMArequête en SQL ou que j'obtiens un message d'erreur.


5

Grâce à SSMS, j'ai créé un nouveau schéma en:

  • En cliquant sur le dossier Sécurité dans l'Explorateur d'objets de mon serveur,
  • Schémas cliqués avec le bouton droit
  • Sélectionné "Nouveau schéma ..."
  • Nommé mon nouveau schéma (exe dans votre cas)
  • Appuyez sur OK

J'ai trouvé ce post pour changer le schéma, mais j'obtenais également la même erreur d'autorisations en essayant de passer au nouveau schéma. J'ai plusieurs bases de données répertoriées dans mon SSMS, alors j'ai juste essayé de spécifier la base de données et cela a fonctionné:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Votre code est:

FROM
 dbo.Employees
TO
 exe.Employees

J'ai essayé avec cette requête.

ALTER SCHEMA exe TRANSFER dbo.Employees

Il suffit de l'écrire create schema exeet de l'exécuter


3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO


0

Soyez très très prudent en renommant les objets dans SQL. Vous pouvez provoquer l'échec des dépendances si vous n'êtes pas complètement loin de ce que vous faites. Cela dit, cela fonctionne facilement (trop) pour renommer des choses à condition que vous ayez un accès approprié à l'environnement:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
Malheureusement, cela ne fonctionnera pas dans ce scénario, sp_rename ne fonctionne que pour modifier la valeur [nom] d'un objet. Vous ne pouvez pas modifier le schéma avec. Si vous essayez, exec sp_rename 'dbo.Employees', 'exe.Employees'vous obtiendrez le nom [dbo]. [Exe.Employees]
Eric J. Price

ALTER SCHEMA (Nom du schéma) TRANSFER (schemaName). (ObjectName);
djangojazz

Notez également que lorsque vous modifiez le schéma d'une table, les vues qui utilisent cette table ne seront pas mises à jour. Vous devrez mettre à jour manuellement le texte (les noms de schéma) dans ces vues. (Soupir ...)
Mike Gledhill

0

Assurez-vous que vous êtes dans le bon contexte de base de données dans SSMS. J'ai eu la même erreur que vous, mais je savais que le schéma existait déjà. Je n'avais pas réalisé que j'étais dans le contexte «MASTER». ALTER a fonctionné après avoir changé le contexte de ma base de données.


0

Au cas où quelqu'un chercherait une version inférieure -

Pour SQL Server 2000:

sp_changeobjectowner @objname = 'dbo.Employess', @newowner = 'exe'

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.