Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 12/04/2011, 13h23   #1
Membre habitué
 
Avatar de seb.49
 
Développeur informatique
Inscription : octobre 2002
Messages : 273
Détails du profil
Informations personnelles :
Âge : 32

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2002
Messages : 273
Points : 136
Points : 136
Par défaut Interdire le SELECT * ne fonctionne pas dans une procédure stockée

Bonjour,

Je voudrais empecher le SELECT * sur les tables de ma base.

J'ai donc ajouté une colonne DUMMY_COLUMN dans mes tables
puis exécuter la commande suivante

Code :
DENY SELECT ON OBJECT::MA_TABLE(DUMMY_COLUMN) TO User1;
ca marche parfaitement quand je fait SELECT * FROM MA_TABLE mais quand ce meme SELECT * est dans une procédure stockée, je peux exécuter cette dernière sans problème.

Comment c'est possible et comment empecher le SELECT * dans la procédure stockée ?
seb.49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h10   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

interdisez l’exécution de la procédure stockée en question.

Code SQL :
1
2
 
DENY EXECUTE ON Ma_sp TO user1
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h14   #3
Membre habitué
 
Avatar de seb.49
 
Développeur informatique
Inscription : octobre 2002
Messages : 273
Détails du profil
Informations personnelles :
Âge : 32

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2002
Messages : 273
Points : 136
Points : 136
Merci mais c'est pas ce que je recherche.

Dans mon programme j'ai plein de procédure, je veux les corriger pour retirer les select * je dois donc pouvoir les exécuter


Ce que je veux en réalite, c'est lancer le programme et au fur et à mesure des plantages à cause des select * interdit corriger les procédures pour remplacer le "*" par la bonne liste de champs
seb.49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h41   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonjour,

Pourquoi ne pas chercher les procédures qui contiennent l'instruction "SELECT *" et les corriger par la suite ?

Code :
1
2
3
4
5
6
7
SELECT 
 p.name,
 m.definition
FROM sys.sql_modules AS m
INNER JOIN sys.procedures AS p
 ON m.[object_id] = p.[object_id]
WHERE m.definition LIKE '%SELECT *%'
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h43   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
c'est lancer le programme et au fur et à mesure des plantages à cause des select * interdit corriger les procédures
vous gagnerez votre temps en générant les scripts de toutes vos procédures (avec SSMS, ça se fait en quelques clics), et de passer en revue les scripts générés...
vous risquerez moins d'en oublier en plus

voici une requete (que vous pourrez adapter) qui vous donne la liste des privileges pour un utilisateur donné :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
SELECT 
	OBJECT_NAME(c.object_id) AS NomTable, 
	c.name AS NomColonne, 
	permission_name, 
	state_desc
FROM sys.database_permissions p
LEFT OUTER JOIN sys.COLUMNS c
	ON  c.object_id = p.major_id
	AND c.column_id = p.minor_id
WHERE grantee_principal_id = user_id('toto')
ORDER BY OBJECT_NAME(c.object_id) , column_id
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h49   #6
Membre habitué
 
Avatar de seb.49
 
Développeur informatique
Inscription : octobre 2002
Messages : 273
Détails du profil
Informations personnelles :
Âge : 32

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2002
Messages : 273
Points : 136
Points : 136
Une meme procédure aujourd'hui avec le select * pourra disparaitre au profit de plusieurs procédure avec des listes de champs bien définie donc je dois intercepter les erreurs dans mon programme avant de corriger les procédures
seb.49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h23   #7
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Encore une fois pourquoi attendre l'erreur pour intercepter et pourquoi ne pas directement corriger à la source ? Qu'est ce qui vous empêche de faire cela ?

Qui corrige les procédures ? Vous ? Une autre équipe ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h31   #8
Membre habitué
 
Avatar de seb.49
 
Développeur informatique
Inscription : octobre 2002
Messages : 273
Détails du profil
Informations personnelles :
Âge : 32

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2002
Messages : 273
Points : 136
Points : 136
Peut importe le pourquoi du comment, est ce qu'on peut revenir à ma question initiale ?
seb.49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h47   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
1) oui
2) c'est pas possible.

La seule possibilité est donc de corriger le code des SP.

Pour trouver vos SELECT * :

Code :
1
2
3
4
SELECT *
FROM   INFORMATION_SCHEMA.ROUTINES
WHERE  ROUTINE_TYPE = 'PROCEDURE'
 AND   ROUTINE_DEFINITION LIKE '%SELECT %*%'
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h51   #10
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
D'ailleurs ceci est également valable pour les vues. Le SELECT * sur la table à l'intérieur d'une vue va également fonctionner sans aucun problème.

De plus il y a quand même des effets de bords à faire cela :

Les requêtes avec COUNT(*) ou COUNT(1) vont également planter ...
C'est également le cas des parties de codes comme IF EXISTS (SELECT * / 1 FROM ..) ....

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h47   #11
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par seb.49 Voir le message
Peut importe le pourquoi du comment, est ce qu'on peut revenir à ma question initiale ?
Si vous insistez dans une solution tordue... (si on vous posait ces questions, c'était pour trouver une solution plus adéquate mais bon, ... )

Si vous voulez que les priviléges sur les objets soient vérifiés à l’intérieur de vos procédures stockées qui utilisent ces objets, il faut que le propriétaire des objets soit différent du propriétaire des procédures...

Vous pouvez donc par exemple rendre votre User1 (ou un autre utilisateur du moment qu'il n'est pas propriétaire des tables) propriétaire de vos SP :

Code SQL :
1
2
 
ALTER AUTHORIZATION ON LaProcedure TO User1

à faire pour chaque procédure...

ceci vous y aidera :
Code SQL :
1
2
3
4
 
SELECT 'ALTER AUTHORIZATION ON ' + name + ' TO User1;
'
FROM sys.procedures
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h53.


 
 
 
 
Partenaires

Hébergement Web