Dans Microsoft SQL Server, quelle est la différence entre les autorisations CREATE DATABASE
et CREATE ANY DATABASE
?
Je n'arrive pas à trouver de 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 / au début de SQL Server était CREATE ANY
et CREATE
est aliasée pour Conformité ANSI.
sql-server
permissions
Tohuw
la source
la source
Réponses:
Je pense 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 j'ai découvert cela 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.
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é.
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.
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).
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. Par conséquent, même si SQL Server a reconnu l'existence de l'utilisateur, il contient toujours 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.
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.
la source