J’ai récemment croisé un script utilisant la procédure stockée système sp_adduser. L’aide en ligne indique que cette procédure a pour fonctionnalité d’ajouter un nouvel utilisateur à la base courante. Pourtant, elle en fait un peu plus…
Certes, cette procédure stockée est considérée comme obsolète et est appelée à être retirée dans une prochaine version de SQL Server. Toutefois, elle est encore présente dans de nombreuses « boîtes à outils » que les administrateurs de données se sont construites au fil du temps.
Prenons par exemple le script suivant, mélange de « nouvelles » syntaxes et de cette procédure stockée dépréciée.
if not exists (select * from sys.server_principals where name='toto') CREATE LOGIN [toto] WITH PASSWORD='toto',CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF use tempdb exec sp_adduser 'toto'
Jusqu’ici, en regardant l’aide en ligne, on se dit qu’un nouvel utilisateur ‘toto’ est créé dans la base tempdb, et qu’il est mappé sur la connexion éponyme.
Mais cherchons maintenant à supprimer cet utilisateur que l’on vient de créer, et on s’aperçoit que ce n’est pas si simple.
On s’aperçoit alors que la procédure sp_adduser ne s’est pas seulement contentée de créer un utilisateur, mais qu’elle lui a aussi ajouteé un schéma de même nom. En fait, elle a fait en sorte d’obtenir le même résultat que si elle avait tourné sous SQL Server 2000 et que la base avait ensuite été migré sous une version plus récente.
Au final, elle déstabilise quelque peu… Voilà donc, en plus du fait qu’elle est appelée à disparaitre, une raison de plus pour ne plus utiliser cette procédure stockée et lui préférer la syntaxe CREATE USER (voir ici).