IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Renommer une base de donnée dynamiquement


Sujet :

Administration SQL Server

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut Renommer une base de donnée dynamiquement
    Bonjour,

    je dois faire une copie de ma BDD toutes les semaines et j'aimerai la renommer dynamiquement.
    J'ai réussi mais le "name" de ma requete me dit que la syntaxe n'est pas correcte, pouvez-vous me dire ce qui ne va pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    declare @NumSemPrec int
    declare @annee int
    declare @newName varchar
     
    set @NumSemPrec=datepart(ww,getdate())-1
    set @annee = YEAR(getdate())
    set @newName = 'mabaseTEST_SEM'+cast(@NumSemPrec as varchar)+CAST(@annee as varchar)
     
    ALTER DATABASE mabaseACopier
     
    Modify Name = @newName
    merci beaucoup

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Maysa56 Voir le message
    J'ai réussi mais le "name" de ma requete me dit que la syntaxe n'est pas correcte, pouvez-vous me dire ce qui ne va pas ?
    Ta syntaxe est bancale !

    https://docs.microsoft.com/en-us/sql...#TsqlProcedure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    USE master;  
    GO  
    ALTER DATABASE AdventureWorks2012  
    Modify Name = Northwind ;  
    GO

  3. #3
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Bonjour et merci,

    même en utllisant la syntaxe ci-dessous j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    USE master;  
    GO  
    declare @NumSemPrec int
    declare @annee int
    declare @newName varchar
    set @NumSemPrec=datepart(ww,getdate())-1
    set @annee = YEAR(getdate())
    set @newName = 'test_'+cast(@NumSemPrec as varchar)+CAST(@annee as varchar); 
     
    ALTER DATABASE baseacopier 
    Modify Name = @newName
    GO

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Un VARCHAR sans dimension est un varchar de 1. Vous devez préciser un VARCHAR(128). D'ailleurs les identifiants SQL sont des NVARCHAR(128) autrement dit des "sysname" (domaine représentant les identifiants SQL).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Merci, j'ai modifié mais j'ai toujours une erreur . Peut-etre parce que je suis sous SQL SERVER 2008 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    USE master;  
    GO  
    declare @NumSemPrec int
    declare @annee int
    declare @newName NVARCHAR(128)
    set @NumSemPrec=datepart(ww,getdate())-1
    set @annee = YEAR(getdate())
    set @newName = 'test_'+cast(@NumSemPrec as varchar)+CAST(@annee as varchar); 
     
    ALTER DATABASE baseacopier 
    Modify Name = @newName
    GO

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Maysa56 Voir le message
    j'ai toujours une erreur .
    Peut-on la connaitre ou doit-on la deviner ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set @newName = 'test_'+cast(@NumSemPrec as varchar)+CAST(@annee as varchar);

    METTEZ UN VARCHAR(128)


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    USE master;  
    GO  
    declare @NumSemPrec int
    declare @annee int
    declare @newName NVARCHAR(128)
    set @NumSemPrec=datepart(ww,getdate())-1
    set @annee = YEAR(getdate())
    set @newName = 'test_'+cast(@NumSemPrec as VARCHAR(128))+CAST(@annee as VARCHAR(128)); 
     
    ALTER DATABASE baseacopier 
    Modify Name = @newName
    GO
    et voici l'erreur :

    Msg*102, Niveau*15, État*1, Ligne*9
    Incorrect syntax near '@newName'.

    Syntaxe incorrecte proche de @newName attendu ID ou QUOTED_ID

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Vous ne pouvez pas paramétrer le nom d'une base dans le ALTER DATABASE. C'est pourquoi il vous dit d'avoir un identifiant et non une variable....

    Il vous faut faire cela en SQL dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    USE master;  
    GO  
    declare @NumSemPrec int= datepart(iso_week, getdate())-1 , 
              @annee int YEAR(getdate()), --> attention, maerchera pas si première semaine de l'année !!!
              @newName NVARCHAR(128), 
              @SQL NVARCHAR(max);
    set @newName = 'test_'+ cast(@NumSemPrec as VARCHAR(128)) + CAST(@annee as VARCHAR(128)); 
     
    SET @SQL = 'ALTER DATABASE baseacopier Modify Name = [' + @newName + '];'
    EXEC (@SQL);
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Merci Frédéric pour ta réponse. Petites questions :
    - quelle différence entre "iso_week" et "ww" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datepart(iso_week, getdate())-1 et datepart(ww,getdate())-1
    - que faut-il faire pour que ça fonctionne la première semaine de l'année ? (je sais je suis gourmande en question )
    - comment faire pour que, si le nom de la base de destination existe le renommage ne se fait pas ? j'ai tenté un if exists mais ça ne fonctionne pas.

    Merci

  11. #11
    Invité
    Invité(e)
    Par défaut
    Pour week versus iso_week, la réponse est dans la doc :
    https://docs.microsoft.com/en-us/sql...ql-server-2017
    Attention cependant, parce que je ne connais pas beaucoup de sociétés qui respectent la norme iso à la lettre.

    Citation Envoyé par Maysa56 Voir le message
    - que faut-il faire pour que ça fonctionne la première semaine de l'année ? (je sais je suis gourmande en question )
    C'est là le problème, c'est quoi la première semaine de l'année pour toi et elle commence quand ?

    Pour savoir si une bd existe sur l'instance, autant vérifier dans la table système : sys.databases

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Attention : en Europe et dans la plupart des pays du monde, sauf pour les anglo-saxons (et à l'exception de l’Angleterre avant brexit), on utilise le n° de semaine ISO.

    Seule les états unis, le canada et l’Australie utilisent la semaine US.

    Pour que cela fonctionne la première semaine de l'année il faut modifier le code pour gérer les cas de figure :
    grosso modo diviser la requête de calcul en 2 :
    soit on est dans l'année, soit au bord....

    TRY CATCH pour gérer les erreurs

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Attention : en Europe et dans la plupart des pays du monde, sauf pour les anglo-saxons (et à l'exception de l’Angleterre avant brexit), on utilise le n° de semaine ISO. Seule les états unis, le canada et l’Australie utilisent la semaine US.
    Excuse-moi de te contredire mais dans la grande majorité des sociétés / clients avec lesquels j'ai fait affaire, aussi bien en Europe qu'en Amérique du Nord, j'en ai connu très peu qui suivaient la norme iso stricte.
    Et si en Europe le lundi est le premier jour de la semaine (sauf parfois lorsque la société mère est américaine...), au Canada, l'habitude est d'avoir le dimanche comme premier jour de la semaine mais c'est loin d'être rare que d'autres choisissent le lundi...

    D'ailleurs ma dernière intervention en date sur le sujet, le client m'avait fourni un excel qui contenait la correspondance avec le calendrier pour les 10 prochaines années, tellement il n'y avait pas de règles claires. En plus, il y avait eu une fusion avec une société tierce avec d'autres règles toutes aussi obscures.
    Un beau merdier pour leur comptabilité !

    Bref, c'est toujours un grand bonheur quand on commence à parler de la première semaine de l'année, pour moi.

  14. #14
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Je ne trouve rien sur internet pour savoir si la base de destination existe et dans ce cas, ne pas autoriser le renommage. Comment faire pour que si base de destination existe alors ne renomme pas la base ?

    Merci les pros ;-)

  15. #15
    Invité
    Invité(e)
    Par défaut
    Vérifier dans la table sys.databases

  16. #16
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Hello,

    En modifiant le script fourni par SQLPro et utilisant une méthode dérivée de 7gyY9w1ZY6ySRgPeaefZ cela pourrait donner quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    USE master;  
    GO  
    declare @NumSemPrec int= datepart(iso_week, getdate())-1;
    declare @annee int = YEAR(getdate()); --> attention, maerchera pas si première semaine de l'année !!!
    declare @newName NVARCHAR(128); 
    declare @SQL NVARCHAR(max);
     
    set @newName = 'test_'+ cast(@NumSemPrec as VARCHAR(128)) + CAST(@annee as VARCHAR(128)); 
     
    IF DB_ID(@newName) IS NOT NULL 
    	PRINT 'Base de données ' + quotename(@newName) + ' existe déjà!'
    ELSE
    BEGIN
    	SET @SQL = 'ALTER DATABASE baseacopier Modify Name = [' + @newName + '];'
    	PRINT @SQL;
    END
    ++

  17. #17
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Bonjour à tous,

    je vais tester ce bout de code, mais dans ce cas mes fichiers logiques et physiques ne sont pas renommés ? en vérrouillant faisant un ALTER MODIFY FILENAME je peux modifier mes fichiers mais quand je veux déverouiller ça me dit que les fichiers n'existent pas, je renomme pourtant des fichiers existants.
    Ce que je veux faire est pourtant tout bête une simple copie de base avec l'assistant qui s’exécute toutes les semaines, et ensuite renommer cette base dynamiquement car je n'ai pas trouvé le moyen de renommer dynamiquement lors de la copie .

Discussions similaires

  1. [10g] Renommer une base de données
    Par aouadsaad dans le forum Administration
    Réponses: 1
    Dernier message: 20/05/2015, 08h27
  2. [MySQL] [PHP] Recupèrer une base de données dynamiquement
    Par ikkiphoenix09 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/01/2015, 20h10
  3. création d'une base de donnée dynamique
    Par ferhat.adel dans le forum Langage
    Réponses: 15
    Dernier message: 09/05/2011, 19h16
  4. créer une une base de données dynamiquement
    Par GutsRed dans le forum C++Builder
    Réponses: 1
    Dernier message: 22/03/2010, 19h29
  5. [MySQL] Renommer une base de données
    Par philippef dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/04/2006, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo