Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Outils
Outils Forum d'entraide sur les outils gravitant autour de MS-SQL Server, tels que bcp, TDS, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/04/2008, 12h23   #1
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Par défaut Automatisation détachement bases en osql

Bonjour,
Je souhaiterais détacher des bases de données en commande osql sous commande DOS, et de l'automatiser.
Mais il ne faut pas que je détache certaines bases tel que :
- master
- tempdb
- model
- msdb
- pubs

Alors voici sur quoi je me base :
J'ai une première requete avec laquelle je récupère les bases que je souhaite :
Code :
SELECT name FROM sysdatabases WHERE name NOT IN ('master','tempdb','model','msdb','pubs')
Et voici l'outils qui sert à détacher des bases :
Code :
1
2
 
osql -U sa -P -Q "sp_detach_db @dbname="DATABASE"
Ma question est la suivante :

Comment je pourrais faire pour que les données extraites dans ma requete puissent être traitées dans le sp_detachdb ?
Du style :
Code :
1
2
 
osql -U sa -P -Q "sp_detach_db @dbname=`select name from sysdatabases where name not in ('master','tempdb','model','msdb','pubs')`"
Mais le hic c'est que celle-ci ne fonctionne pas, et j'aimerais vraiment faire un batch pour que ce soit traité tous les dimanches.

Pourquoi, parce que je bosse dans une entreprise qui édite des logiciels et que tous le monde monte des bases, mais ne les démontent pas. Après ils se plaigne que c'est trop long, donc ma solution c'est de détacher les bases des utilisateurs non soigneux.

Peace ...
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 12h42   #2
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Tu peux créer une procédure, puis l'appeler dans ta commande ?
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 13h56   #3
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Citation:
Envoyé par pacmann Voir le message
Tu peux créer une procédure, puis l'appeler dans ta commande ?
Salut pacman,

Ok mais en clair ça donne quoi ?!
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h00   #4
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Hmmm, en fait, je n'en ai jamais fait

Mais j'ai regardé un peu ce qui se fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE PROCEDURE DetacheLes
AS
--Mettre les noms des bases dans un machin que tu peux parcourir
SET @Curseur_Bases= CURSOR
FORWARD_ONLY STATIC FOR
SELECT name
FROM sysdatabases
WHERE (...)
 
OPEN @Curseur_Bases
 
-- tu parcours tes résultats pour exécuter ton détache...
FETCH NEXT FROM @Curseur_Bases INTO @BaseName
WHILE (@@FETCH_STATUS = 0)
BEGIN
   sp_detach_db @dbname=@BaseName
   FETCH NEXT FROM @Curseur_Bases INTO @BaseName
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
 
GO
Et après, ton batch appelle juste DetacheLes.
Bon, après ça, j'y connais rien, et j'ai entendu dire qu'il faut pas faire de curseur...
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 15h46   #5
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Ok, merci pour cette information,
alors voici ce que j'ai fait :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE PROCEDURE DetacheLesDB
@Curseur_Bases CURSOR VARYING OUTPUT, @BaseName NVarChar(15)=NULL
AS
-- Mettre les noms des bases dans un machin que tu peux parcourir
SET @Curseur_Bases=CURSOR
FORWARD_ONLY STATIC FOR
SELECT name
FROM dbo.sysdatabases
WHERE name NOT IN ('master','tempdb','model','msdb','pubs','QP_TEST','Northwind')
 
OPEN @Curseur_Bases
 
-- Tu parcours tes résultats pour exécuter ton détache...
FETCH NEXT FROM @Curseur_Bases INTO @BaseName
WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_detach_db @dbname=@BaseName
   FETCH NEXT FROM @Curseur_Bases INTO @BaseName
END
CLOSE @Curseur_Bases
DEALLOCATE @Curseur_Bases
GO
Mais voilà c'est le drame, voici ce que me retourne comme erreur cette procédure lorsque je l'appelle :
Code :
1
2
3
4
 
osql -Usa -P -Q DetacheLesDB
Msg 201, Niveau 16, État 4, Serveur 2835B, Procédure DetacheLesDB, Ligne 0
La procédure 'DetacheLesDB' attend le paramètre '@Curseur_Bases', qui n'a pas été fourni.
Mais qu'est-ce que cela peut-il bien vouloir dire !!!!?

Need help please !

Peace ...
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 16h17   #6
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Code :
1
2
3
4
 
CREATE PROCEDURE DetacheLesDB
@Curseur_Bases CURSOR VARYING OUTPUT, @BaseName NVarChar(15)=NULL
AS
Tu mets des arguments dans ta déclaration, alors que tu n'en mets pas dans l'appel.
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 17h03   #7
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Je comprends pas !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
CREATE PROCEDURE DetacheLesDB
@BaseName NVarChar(15)=NULL,
@Curseur_Bases CURSOR VARYING OUTPUT
AS SET @Curseur_Bases=CURSOR
FOR SELECT name
FROM dbo.sysdatabases
WHERE name NOT IN (SELECT dbname FROM base_test)
 
OPEN @Curseur_Bases
FETCH NEXT FROM @Curseur_Bases INTO @BaseName
WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_detach_db @dbname=@BaseName
   FETCH NEXT FROM @Curseur_Bases INTO @BaseName
END
CLOSE @Curseur_Bases
DEALLOCATE @Curseur_Bases
GO
C'est où que ça colle pas, c'est quoi que je dois faire. Je ne sais pas ce qui ne va pas !
J'essai de déclarer dans l'appel, mais après ça sort en erreur, et vlam, error near line blablabla.

Je commence à déprimer
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 17h09   #8
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Code :
1
2
3
CREATE PROCEDURE DetacheLesDB
AS SET @Curseur_Bases=CURSOR
...
Et comme ça, ça ne passe pas ?
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 09h00   #9
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Citation:
Envoyé par pacmann Voir le message
Code :
1
2
3
CREATE PROCEDURE DetacheLesDB
AS SET @Curseur_Bases=CURSOR
...
Et comme ça, ça ne passe pas ?
J'ai essayé et ça donne ce message :

Code :
1
2
3
4
5
6
7
8
 
Erreur 156 : Syntaxe incorrectevers le mot clé 'AS'.
La variable '@Curseur_Bases' doit être déclarée.
La variable '@Curseur_Bases' doit être déclarée.
La variable '@Curseur_Bases' doit être déclarée.
La variable '@Curseur_Bases' doit être déclarée.
La variable '@Curseur_Bases' doit être déclarée.
La variable '@Curseur_Bases' doit être déclarée.
Mais que faire !!??
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 10h21   #10
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ah, désolé, je découvre en même temps que toi

En fait, il faut déclarer les variables avant de les utiliser (étonant, non ? )

Code :
1
2
3
 
DECLARE @Curseur_Bases CURSOR
SET @Curseur_Bases = CURSOR FOR ...
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 10h46   #11
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Citation:
Envoyé par pacmann Voir le message
Ah, désolé, je découvre en même temps que toi

En fait, il faut déclarer les variables avant de les utiliser (étonant, non ? )

Code :
1
2
3
 
DECLARE @Curseur_Bases CURSOR
SET @Curseur_Bases = CURSOR FOR ...
Code :
1
2
3
4
5
6
7
 
CREATE PROCEDURE DetacheLesDB
DECLARE @BaseName NVarChar(15)
DECLARE @Curseur_Bases CURSOR
SET @Curseur_Bases = CURSOR
FOR SELECT name
FROM dbo.sysdatabases
Voici l'erreur que me donne cette syntaxe :
Code :
1
2
 
Erreur 156 : Syntaxe incorrecte  vers le mot clé 'DECLARE'.
Any suggestions !
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 11h11   #12
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Il faut laisser le AS.
Dans "DECLARE MaProc AS ...", AS indique que ce qui suit est le corps de ta procédure
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 09h16   #13
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Citation:
Envoyé par pacmann Voir le message
Il faut laisser le AS.
Dans "DECLARE MaProc AS ...", AS indique que ce qui suit est le corps de ta procédure
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
CREATE PROCEDURE DetacheLesDB
DECLARE @BaseName NVarChar(15)
DECLARE @Curseur_Bases CURSOR
AS SET @Curseur_Bases = CURSOR 
FOR SELECT name
FROM dbo.sysdatabases
WHERE name NOT IN (SELECT dbname FROM base_test)
OPEN @Curseur_Bases
FETCH NEXT FROM @Curseur_Bases INTO @BaseName
WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_detach_db @dbname=@BaseName
   FETCH NEXT FROM @Curseur_Bases INTO @BaseName
END
CLOSE @Curseur_Bases
DEALLOCATE @Curseur_Bases
GO
Code :
1
2
3
 
Erreur 156 : Syntaxe erreur vers le momt clé 'DECLARE'
Syntaxe erreur vers le mot clé 'AS'
Toujours rien !
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 11h01   #14
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
CREATE PROCEDURE DetacheLesDB
AS 
DECLARE @BaseName NVarChar(15)
DECLARE @Curseur_Bases CURSOR
SET @Curseur_Bases = CURSOR 
FOR SELECT name
FROM dbo.sysdatabases
WHERE name NOT IN (SELECT dbname FROM base_test)
OPEN @Curseur_Bases
FETCH NEXT FROM @Curseur_Bases INTO @BaseName
WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_detach_db @dbname=@BaseName
   FETCH NEXT FROM @Curseur_Bases INTO @BaseName
END
CLOSE @Curseur_Bases
DEALLOCATE @Curseur_Bases
GO
Et comme ça ? (AS marque le début du corps de la procédure. Tu ne peux pas déclarer des trucs avant)
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 17h37   #15
Nouveau Membre du Club
 
Avatar de smooncef
 
Inscription : octobre 2007
Messages : 118
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Luxembourg

Informations forums :
Inscription : octobre 2007
Messages : 118
Points : 36
Points : 36
Super !!!
Tu es génial.





Ca marche.

Peace ...
smooncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 18h20   #16
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
C'est moi qui te remercie : tu m'as permis d'écrire ma première stored proc !
(même si je ne l'exécuterais jamais )
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h17.


 
 
 
 
Partenaires

Hébergement Web