positionnement sur une base dans une requête Dynamic SQL
2 réponses
Otra
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un certains
nombres de modifications à l'étude donc actuellement impossible) j'ai un
script pour donner les droits d'éxécution à un compte user sur toutes les
procédures stockées des bases que je précise (voir le script plus bas).
en soit rien de très complexe, seulement je me positionne sur la base à
traiter par un exec('use '+@basecourante) où @basecourante est une variable
contenant le nom de la base et renseigné par un curseur.
le script récupère ensuite les noms des procédures de la base dans un autre
curseur et zou on met les droits d'éxécution pour chaque procédure au user
seulement là problème : le curseur contenant les noms des procédures est
bien rempli, la variable aussi mais le grant échoue car la base active au
moment de l'éxécution du grant est la base par défaut de la connexion (ou
une autre base si j'en ai sélectionné une autre via la liste déroulante dans
l'analyseur).
en l'occurence ma base par défaut est master et il essaie donc de donner des
droitst d'éxécution sur des objets n'existant pas à un user qui n'existe pas
non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les
bases, je mets alors un use ma_base en dur et je renseigne la variable
@basecourante avec mon nom de base pour le reste du script et c'est bingo
mais bon j'ai pas envie de passer tous les noms de bases à la main c'est
c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré le
fait que je le vois bien lorsque je fais un trace puisqu'il me marque
--Dynamic SQL
use ma_base
et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname
declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases
declare bases cursor scroll for
select name from master.dbo.sysdatabases
where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases
INTO @basecourante
WHILE @@FETCH_STATUS = 0
BEGIN
--positionnement sur la base à traiter
exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées
utilisateur
exec('declare procedures cursor scroll for
select name from '+@basecourante+'.dbo.sysobjects
where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures
into @procedures
WHILE @@FETCH_STATUS = 0
BEGIN
--attribution des droits d'éxécution à nom_user(fixe dans le script)
exec ('grant execute on '+@procedures+' to nom_user')
fetch next from procedures
into @procedures
END
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Nicolas LETULLIER
Bonjour,
Le USE n'est en effet valable que dans le contexte du EXEC. As-tu par contre essayé de faire un USE à chaque fois que tu fais le GRANT ?
Ex : WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
Nicolas.
"Otra" <informatique@@uesl.fr> a écrit dans le message de news:
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un certains nombres de modifications à l'étude donc actuellement impossible) j'ai un script pour donner les droits d'éxécution à un compte user sur toutes les procédures stockées des bases que je précise (voir le script plus bas). en soit rien de très complexe, seulement je me positionne sur la base à traiter par un exec('use '+@basecourante) où @basecourante est une variable contenant le nom de la base et renseigné par un curseur. le script récupère ensuite les noms des procédures de la base dans un autre curseur et zou on met les droits d'éxécution pour chaque procédure au user seulement là problème : le curseur contenant les noms des procédures est bien rempli, la variable aussi mais le grant échoue car la base active au moment de l'éxécution du grant est la base par défaut de la connexion (ou une autre base si j'en ai sélectionné une autre via la liste déroulante dans l'analyseur). en l'occurence ma base par défaut est master et il essaie donc de donner des droitst d'éxécution sur des objets n'existant pas à un user qui n'existe pas non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les bases, je mets alors un use ma_base en dur et je renseigne la variable @basecourante avec mon nom de base pour le reste du script et c'est bingo mais bon j'ai pas envie de passer tous les noms de bases à la main c'est c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré le fait que je le vois bien lorsque je fais un trace puisqu'il me marque --Dynamic SQL use ma_base et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases declare bases cursor scroll for select name from master.dbo.sysdatabases where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases INTO @basecourante
WHILE @@FETCH_STATUS = 0 BEGIN --positionnement sur la base à traiter exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées utilisateur exec('declare procedures cursor scroll for select name from '+@basecourante+'.dbo.sysobjects where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures into @procedures
WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
CLOSE procedures DEALLOCATE procedures
fetch next from bases into @basecourante
END
CLOSE bases DEALLOCATE bases
Bonjour,
Le USE n'est en effet valable que dans le contexte du EXEC.
As-tu par contre essayé de faire un USE à chaque fois que tu fais le GRANT ?
Ex :
WHILE @@FETCH_STATUS = 0
BEGIN
--attribution des droits d'éxécution à nom_user(fixe dans le script)
exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on
'+@procedures+' to nom_user')
fetch next from procedures
into @procedures
END
Nicolas.
"Otra" <informatique@@uesl.fr> a écrit dans le message de news:
OUWa0SkwEHA.2572@tk2msftngp13.phx.gbl...
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un
certains nombres de modifications à l'étude donc actuellement impossible)
j'ai un script pour donner les droits d'éxécution à un compte user sur
toutes les procédures stockées des bases que je précise (voir le script
plus bas).
en soit rien de très complexe, seulement je me positionne sur la base à
traiter par un exec('use '+@basecourante) où @basecourante est une
variable contenant le nom de la base et renseigné par un curseur.
le script récupère ensuite les noms des procédures de la base dans un
autre curseur et zou on met les droits d'éxécution pour chaque procédure
au user seulement là problème : le curseur contenant les noms des
procédures est bien rempli, la variable aussi mais le grant échoue car la
base active au moment de l'éxécution du grant est la base par défaut de la
connexion (ou une autre base si j'en ai sélectionné une autre via la liste
déroulante dans l'analyseur).
en l'occurence ma base par défaut est master et il essaie donc de donner
des droitst d'éxécution sur des objets n'existant pas à un user qui
n'existe pas non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les
bases, je mets alors un use ma_base en dur et je renseigne la variable
@basecourante avec mon nom de base pour le reste du script et c'est bingo
mais bon j'ai pas envie de passer tous les noms de bases à la main c'est
c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré
le fait que je le vois bien lorsque je fais un trace puisqu'il me marque
--Dynamic SQL
use ma_base
et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname
declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases
declare bases cursor scroll for
select name from master.dbo.sysdatabases
where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases
INTO @basecourante
WHILE @@FETCH_STATUS = 0
BEGIN
--positionnement sur la base à traiter
exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées
utilisateur
exec('declare procedures cursor scroll for
select name from '+@basecourante+'.dbo.sysobjects
where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures
into @procedures
WHILE @@FETCH_STATUS = 0
BEGIN
--attribution des droits d'éxécution à nom_user(fixe dans le script)
exec ('grant execute on '+@procedures+' to nom_user')
fetch next from procedures
into @procedures
END
Le USE n'est en effet valable que dans le contexte du EXEC. As-tu par contre essayé de faire un USE à chaque fois que tu fais le GRANT ?
Ex : WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
Nicolas.
"Otra" <informatique@@uesl.fr> a écrit dans le message de news:
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un certains nombres de modifications à l'étude donc actuellement impossible) j'ai un script pour donner les droits d'éxécution à un compte user sur toutes les procédures stockées des bases que je précise (voir le script plus bas). en soit rien de très complexe, seulement je me positionne sur la base à traiter par un exec('use '+@basecourante) où @basecourante est une variable contenant le nom de la base et renseigné par un curseur. le script récupère ensuite les noms des procédures de la base dans un autre curseur et zou on met les droits d'éxécution pour chaque procédure au user seulement là problème : le curseur contenant les noms des procédures est bien rempli, la variable aussi mais le grant échoue car la base active au moment de l'éxécution du grant est la base par défaut de la connexion (ou une autre base si j'en ai sélectionné une autre via la liste déroulante dans l'analyseur). en l'occurence ma base par défaut est master et il essaie donc de donner des droitst d'éxécution sur des objets n'existant pas à un user qui n'existe pas non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les bases, je mets alors un use ma_base en dur et je renseigne la variable @basecourante avec mon nom de base pour le reste du script et c'est bingo mais bon j'ai pas envie de passer tous les noms de bases à la main c'est c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré le fait que je le vois bien lorsque je fais un trace puisqu'il me marque --Dynamic SQL use ma_base et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases declare bases cursor scroll for select name from master.dbo.sysdatabases where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases INTO @basecourante
WHILE @@FETCH_STATUS = 0 BEGIN --positionnement sur la base à traiter exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées utilisateur exec('declare procedures cursor scroll for select name from '+@basecourante+'.dbo.sysobjects where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures into @procedures
WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
CLOSE procedures DEALLOCATE procedures
fetch next from bases into @basecourante
END
CLOSE bases DEALLOCATE bases
Otra
merci ça marche avec une réserve pourtant, la syntaxe exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to nom_user') me renvoit une erreur sur l'utilisation de la fonction char, mais il suffit de taper exec ('use ' + @basecourante + ' grant execute on '+@procedures+' to nom_user') pour que ce soit accepté dans le même lot, d'ailleurs il n'est peut-être pas nécessaire d'avoir un saut de ligne entre les deux instructions (je n'ai pas essayé). j'avais essayé de taper le nom complet qualifié (@basecourante+'..'+@procédures) mais on ne peut utiliser grant que sur la base courante. enfin ça marche très bien maintenant encore merci
"Nicolas LETULLIER" a écrit dans le message de news: %
Bonjour,
Le USE n'est en effet valable que dans le contexte du EXEC. As-tu par contre essayé de faire un USE à chaque fois que tu fais le GRANT ?
Ex : WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
Nicolas.
"Otra" <informatique@@uesl.fr> a écrit dans le message de news:
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un certains nombres de modifications à l'étude donc actuellement impossible) j'ai un script pour donner les droits d'éxécution à un compte user sur toutes les procédures stockées des bases que je précise (voir le script plus bas). en soit rien de très complexe, seulement je me positionne sur la base à traiter par un exec('use '+@basecourante) où @basecourante est une variable contenant le nom de la base et renseigné par un curseur. le script récupère ensuite les noms des procédures de la base dans un autre curseur et zou on met les droits d'éxécution pour chaque procédure au user seulement là problème : le curseur contenant les noms des procédures est bien rempli, la variable aussi mais le grant échoue car la base active au moment de l'éxécution du grant est la base par défaut de la connexion (ou une autre base si j'en ai sélectionné une autre via la liste déroulante dans l'analyseur). en l'occurence ma base par défaut est master et il essaie donc de donner des droitst d'éxécution sur des objets n'existant pas à un user qui n'existe pas non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les bases, je mets alors un use ma_base en dur et je renseigne la variable @basecourante avec mon nom de base pour le reste du script et c'est bingo mais bon j'ai pas envie de passer tous les noms de bases à la main c'est c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré le fait que je le vois bien lorsque je fais un trace puisqu'il me marque --Dynamic SQL use ma_base et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases declare bases cursor scroll for select name from master.dbo.sysdatabases where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases INTO @basecourante
WHILE @@FETCH_STATUS = 0 BEGIN --positionnement sur la base à traiter exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées utilisateur exec('declare procedures cursor scroll for select name from '+@basecourante+'.dbo.sysobjects where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures into @procedures
WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
CLOSE procedures DEALLOCATE procedures
fetch next from bases into @basecourante
END
CLOSE bases DEALLOCATE bases
merci ça marche avec une réserve pourtant, la syntaxe exec ('use ' +
@basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to
nom_user')
me renvoit une erreur sur l'utilisation de la fonction char, mais il suffit
de taper
exec ('use ' + @basecourante +
' grant execute on '+@procedures+' to nom_user')
pour que ce soit accepté dans le même lot, d'ailleurs il n'est peut-être pas
nécessaire d'avoir un saut de ligne entre les deux instructions (je n'ai pas
essayé).
j'avais essayé de taper le nom complet qualifié
(@basecourante+'..'+@procédures) mais on ne peut utiliser grant que sur la
base courante.
enfin ça marche très bien maintenant encore merci
"Nicolas LETULLIER" <nletullier@provibe.ASUPPRIMER.com> a écrit dans le
message de news: %23PJSbukwEHA.1300@TK2MSFTNGP14.phx.gbl...
Bonjour,
Le USE n'est en effet valable que dans le contexte du EXEC.
As-tu par contre essayé de faire un USE à chaque fois que tu fais le GRANT
?
Ex :
WHILE @@FETCH_STATUS = 0
BEGIN
--attribution des droits d'éxécution à nom_user(fixe dans le script)
exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on
'+@procedures+' to nom_user')
fetch next from procedures
into @procedures
END
Nicolas.
"Otra" <informatique@@uesl.fr> a écrit dans le message de news:
OUWa0SkwEHA.2572@tk2msftngp13.phx.gbl...
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un
certains nombres de modifications à l'étude donc actuellement impossible)
j'ai un script pour donner les droits d'éxécution à un compte user sur
toutes les procédures stockées des bases que je précise (voir le script
plus bas).
en soit rien de très complexe, seulement je me positionne sur la base à
traiter par un exec('use '+@basecourante) où @basecourante est une
variable contenant le nom de la base et renseigné par un curseur.
le script récupère ensuite les noms des procédures de la base dans un
autre curseur et zou on met les droits d'éxécution pour chaque procédure
au user seulement là problème : le curseur contenant les noms des
procédures est bien rempli, la variable aussi mais le grant échoue car la
base active au moment de l'éxécution du grant est la base par défaut de
la connexion (ou une autre base si j'en ai sélectionné une autre via la
liste déroulante dans l'analyseur).
en l'occurence ma base par défaut est master et il essaie donc de donner
des droitst d'éxécution sur des objets n'existant pas à un user qui
n'existe pas non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les
bases, je mets alors un use ma_base en dur et je renseigne la variable
@basecourante avec mon nom de base pour le reste du script et c'est bingo
mais bon j'ai pas envie de passer tous les noms de bases à la main c'est
c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré
le fait que je le vois bien lorsque je fais un trace puisqu'il me marque
--Dynamic SQL
use ma_base
et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname
declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases
declare bases cursor scroll for
select name from master.dbo.sysdatabases
where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases
INTO @basecourante
WHILE @@FETCH_STATUS = 0
BEGIN
--positionnement sur la base à traiter
exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées
utilisateur
exec('declare procedures cursor scroll for
select name from '+@basecourante+'.dbo.sysobjects
where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures
into @procedures
WHILE @@FETCH_STATUS = 0
BEGIN
--attribution des droits d'éxécution à nom_user(fixe dans le script)
exec ('grant execute on '+@procedures+' to nom_user')
fetch next from procedures
into @procedures
END
merci ça marche avec une réserve pourtant, la syntaxe exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to nom_user') me renvoit une erreur sur l'utilisation de la fonction char, mais il suffit de taper exec ('use ' + @basecourante + ' grant execute on '+@procedures+' to nom_user') pour que ce soit accepté dans le même lot, d'ailleurs il n'est peut-être pas nécessaire d'avoir un saut de ligne entre les deux instructions (je n'ai pas essayé). j'avais essayé de taper le nom complet qualifié (@basecourante+'..'+@procédures) mais on ne peut utiliser grant que sur la base courante. enfin ça marche très bien maintenant encore merci
"Nicolas LETULLIER" a écrit dans le message de news: %
Bonjour,
Le USE n'est en effet valable que dans le contexte du EXEC. As-tu par contre essayé de faire un USE à chaque fois que tu fais le GRANT ?
Ex : WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('use ' + @basecourante + char(13) + char(10) + 'grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END
Nicolas.
"Otra" <informatique@@uesl.fr> a écrit dans le message de news:
Bonjour,
sur un serveur SQL 2000 sans SP (l'installation de SP nécessite un certains nombres de modifications à l'étude donc actuellement impossible) j'ai un script pour donner les droits d'éxécution à un compte user sur toutes les procédures stockées des bases que je précise (voir le script plus bas). en soit rien de très complexe, seulement je me positionne sur la base à traiter par un exec('use '+@basecourante) où @basecourante est une variable contenant le nom de la base et renseigné par un curseur. le script récupère ensuite les noms des procédures de la base dans un autre curseur et zou on met les droits d'éxécution pour chaque procédure au user seulement là problème : le curseur contenant les noms des procédures est bien rempli, la variable aussi mais le grant échoue car la base active au moment de l'éxécution du grant est la base par défaut de la connexion (ou une autre base si j'en ai sélectionné une autre via la liste déroulante dans l'analyseur). en l'occurence ma base par défaut est master et il essaie donc de donner des droitst d'éxécution sur des objets n'existant pas à un user qui n'existe pas non plus.
pour que ça marche, il me suffit de ne pas utiliser de curseur pour les bases, je mets alors un use ma_base en dur et je renseigne la variable @basecourante avec mon nom de base pour le reste du script et c'est bingo mais bon j'ai pas envie de passer tous les noms de bases à la main c'est c.....
en résumé il en a rien à cirer de mon exec ('use '+@basecourante) malgré le fait que je le vois bien lorsque je fais un trace puisqu'il me marque --Dynamic SQL use ma_base et après les erreurs décrites plus haut.
merci de votre aide
ci-dessous le script
declare @basecourante as sysname declare @procedures as sysname
--curseur associé à @basecourante pour le parcours des bases declare bases cursor scroll for select name from master.dbo.sysdatabases where conditions_de_mes_bases
OPEN bases
FETCH NEXT FROM bases INTO @basecourante
WHILE @@FETCH_STATUS = 0 BEGIN --positionnement sur la base à traiter exec ('use '+@basecourante)
--déclaration du curseur contenant les noms de procédures stockées utilisateur exec('declare procedures cursor scroll for select name from '+@basecourante+'.dbo.sysobjects where xtype='+''''+'P'+''''+' and category<>2')
OPEN procedures
fetch next from procedures into @procedures
WHILE @@FETCH_STATUS = 0 BEGIN --attribution des droits d'éxécution à nom_user(fixe dans le script) exec ('grant execute on '+@procedures+' to nom_user') fetch next from procedures into @procedures END