OVH Cloud OVH Cloud

positionnement sur une base dans une requête Dynamic SQL

2 réponses
Avatar
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

CLOSE procedures
DEALLOCATE procedures

fetch next from bases
into @basecourante

END

CLOSE bases
DEALLOCATE bases

2 réponses

Avatar
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



Avatar
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