web-dev-qa-db-fra.com

Sur SQL Server, est-il possible d'empêcher certains utilisateurs d'utiliser certaines fonctions, opérateurs ou instructions?

nous soutenons un grand nombre de développeurs et d'analystes qui ne savent pas grand-chose ou ne se soucient pas du tout des performances des requêtes. Nous avons chaque jour des centaines de requêtes mal conçues (également dues à une architecture db mal conçue) qui, chacune, aspirent des dizaines de gigaoctets de RAM de nos serveurs et ont des plans d'exécution de l'ordre de mégaoctets) stocké dans le cache SQL.

Nous aimerions empêcher certains utilisateurs d'utiliser les TRIS et les HASH MATCH, en particulier ORDER BY, SELECT DISTINCT et JOINs de toute nature. Notre intention est de permettre aux utilisateurs de récupérer leurs données, mais d'y travailler uniquement de leur côté.

Cela pourrait-il être réalisé dans SQL Server? Existe-t-il un moteur DB qui prend en charge cela? Que pensez-vous de cela?

Je sais que cela irait à l'encontre du principe d'une base de données relationnelle, mais nous cherchons un moyen de faire en sorte que le moteur soit correctement utilisé et non abusé par des utilisateurs non éduqués.

Nous envisageons déjà l'implémentation de Resource Governor pour allouer une certaine quantité de ressources machine à ces mauvaises requêtes.

7
R. Ferraz

Le réponse de kevinsky est un chemin vers une solution pour vous.

Un chemin différent pour votre problème spécifique consiste à créer un deuxième serveur de rapports (et peut-être un troisième développeur). Avec des copies des données de production. Vos rapporteurs et vos développeurs peuvent faire toutes sortes de bêtises, sans impact sur la production.

Il existe plusieurs façons d'y parvenir, selon la fraîcheur de vos données de rapport/développement.

Une solution courante est une sauvegarde et une restauration nocturnes sur le serveur secondaire. Si vous avez besoin de données vraiment actuelles (comme pas de décalage ou une seconde) regardez dans SQL Server Always On

6
James Jenkins

Vous pouvez créer des vues des données dont ils ont besoin et créer un rôle qui autorise uniquement la sélection.

Ou vous pouvez créer des procédures stockées qui renvoient un jeu de résultats qui peut être n'importe quelle combinaison de tables accessibles avec une requête qui fonctionne bien.

Je ne connais aucun moyen de restreindre l'utilisation des commandes de base en SQL à court d'un déclencheur de niveau de base de données hacky et de suggérer que si vous avez autant d'utilisateurs qui ne savent pas comment écrire une bonne requête, alors une éducation est plus efficace façon de le faire. Séances à l'heure du déjeuner?

2
kevinsky