web-dev-qa-db-fra.com

CRÉER LA BASE DE DONNÉES et les autorisations CRÉER TOUTE BASE DE DONNÉES

Dans Microsoft SQL Server, quelle est la différence entre le CREATE DATABASE et CREATE ANY DATABASE autorisations?

Je n'arrive pas à trouver une réponse faisant autorité. Le mieux que je puisse en déduire est que (a) CREATE ANY implique que je peux créer la base de données pour appartenir à un autre utilisateur, alors qu'avec CREATE je ne peux pas, ou (b) l'autorisation d'origine dans Sybase/les premiers jours de SQL Server était CREATE ANY et CREATE sont aliasés pour la conformité ANSI.

22
Tohuw

Je crois avoir trouvé la réponse faisant autorité, grandement aidée par le tableau fourni dans cet article: http://msdn.Microsoft.com/en-us/library/ms178569.aspx . Il semblerait que CREATE DATABASE soit en effet l'autorisation conforme à ANSI SQL, tandis que CREATE ANY DATABASE est une autorisation de serveur propriétaire MSSQL. Cependant, les deux ne sont pas identiques. En fait, il y a une distinction assez importante entre les deux, et je l'ai découvert en l'essayant.

Ce sont deux autorisations, mais CREATE DATABASE ne consulte que le contexte de sécurité de la base de données actuellement utilisée, tandis que CREATE ANY DATABASE peut rechercher la liste des connexions sur SQL Server. Cela semble être implémenté car l'attente générale pour un serveur ANSI SQL est que les autorisations soient conférées dans une base de données système principale, les utilisateurs de cette base de données se voyant accorder des autorisations. Ensuite, le comportement par défaut des nouvelles bases de données est de consulter le maître pour voir quelles autorisations il doit hériter. (SQL 101, je sais, mais c'est vraiment illustré ici.)

Ainsi, lorsque vous accordez CREATE DATABASE, vous devez en fait avoir un utilisateur maître pour accorder cette autorisation. Si vous essayez cela, cela fonctionne (créez un utilisateur en maître, accordez-lui de créer une base de données, vous pouvez alors créer des bases de données). Cependant, en accordant créer une base de données (ou en accordant le rôle dbcreator), vous n'avez pas besoin d'être un utilisateur littéral dans master.

Pour illustrer davantage la différence entre les deux autorisations, observez les différents messages renvoyés en accordant à un utilisateur CREATE DATABASE sur le maître par rapport à une autre base de données, puis rincez et répétez pour l'autorisation CREATE ANY DATABASE.

use master; GRANT CREATE DATABASE to TestUser

Msg 15151, niveau 16, état 1, ligne 1 Impossible de trouver l'utilisateur "TestUser", car il n'existe pas ou vous n'avez pas l'autorisation.

Cette erreur se produit car l'utilisateur TestUser n'est pas encore dans la base de données master. Il s'agit d'une autorisation au niveau de la base de données - elle n'a pas de contexte pour sortir de la base de données sélectionnée et rechercher des connexions ou des utilisateurs. Notez que si vous créez d'abord l'utilisateur dans master, cette commande réussit et vous pouvez créer des bases de données comme si CREATE ANY DATABASE vous était accordé.

use master; GRANT CREATE ANY DATABASE to TestUser

Commande (s) terminée avec succès.

Cela réussit car, en tant qu'autorisation propriétaire de Microsoft SQL Server, CREATE ANY DATABASE peut consulter la liste des connexions pour l'instance SQL, pas seulement les utilisateurs de la base de données actuellement utilisée.

use test; GRANT CREATE DATABASE to TestUser

Msg 15151, niveau 16, état 1, ligne 1 Impossible de trouver l'utilisateur "TestUser", car il n'existe pas ou vous n'avez pas l'autorisation.

Cela démontre la cohérence de mon explication pour le premier exemple. Notez la requête ci-dessous et son message d'erreur résultant. Vous ne recevrez pas ce message d'erreur si vous créez d'abord l'utilisateur dans cette base de données (voir la dernière requête).

use test; GRANT CREATE ANY DATABASE to TestUser

Msg 4621, niveau 16, état 10, ligne 1 Les autorisations au niveau du serveur ne peuvent être accordées que lorsque la base de données actuelle est maître

Comme indiqué dans la deuxième requête, CREATE ANY DATABASE consulte la liste des connexions, où j'avais déjà créé ce nom de connexion. Ainsi, bien que SQL Server ait reconnu l'existence de l'utilisateur, il continue de générer des erreurs car j'essaie d'accorder une autorisation au niveau du serveur ailleurs que maître, ce qui n'est pas autorisé dans MSSQL.

use test; create user TestUser; grant create database to TestUser

L'autorisation CREATE DATABASE ne peut être accordée que dans la base de données master. Msg 0, niveau 11, état 0, ligne 0 Une erreur grave s'est produite sur la commande actuelle. Le cas échéant, les résultats doivent être ignorés.

Maintenant qu'il y a un utilisateur auquel CREATE DATABASE doit s'appliquer, je reçois le message d'erreur générique que vous ne pouvez pas donner d'autorisations au niveau du serveur ailleurs que maître, car c'est là que SQL Server stocke ces autorisations .

Eh bien, c'était amusant.

22
Tohuw