web-dev-qa-db-fra.com

Attribuer une connexion à un utilisateur créé sans connexion (SQL Server)

J'ai un utilisateur dans ma base de données qui n'a pas de login associé. Il semble avoir été créé sans connexion.

Chaque fois que j'essaie de me connecter à la base de données avec cet utilisateur, l'erreur suivante apparaît:

Msg 916, Level 14, State 1, Line 1
The server principal "UserName" is not able to access the database 
"DatabaseName" under the current security context.

J'aimerais spécifier un identifiant de connexion pour cet utilisateur afin que je puisse l'utiliser pour accéder à la base de données. J'ai essayé le script suivant pour associer une connexion à l'utilisateur.

USE [DatabaseName]
ALTER USER [UserName]
WITH LOGIN = [UserName]

Mais cela me donne l'erreur suivante:

Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users 
that were mapped to Windows or SQL logins.

Est-il possible d'attribuer un identifiant de connexion à cet utilisateur? J'aimerais ne pas avoir à partir de zéro car cet utilisateur a beaucoup d'autorisations qui auraient besoin d'être redéfinies.

Edit: En réponse à la question de Philip Kelley, voici ce que je reçois quand je lance select * from sys.database_principals where name = 'username'.

SQL User

Toutes mes excuses pour la taille de l'image, vous devrez l'ouvrir dans un nouvel onglet pour la visualiser correctement.

Edit2:

Ok, j'ai abandonné la connexion existante, comme suggéré par gbn, et j'utilise le script suivant pour créer une nouvelle connexion avec le même SID que l'utilisateur.

CREATE LOGIN [UserName] 
WITH PASSWORD=N'Password1', 
DEFAULT_DATABASE=[DatabaseName], 
CHECK_EXPIRATION=OFF, 
CHECK_POLICY=OFF, 
SID=0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390

Cela me donne maintenant le message d'erreur suivant, il apparaît que le SID est trop long pour le champ SID du LOGIN.

Msg 15419, Level 16, State 1, Line 1
Supplied parameter sid should be binary(16).

Suis-je sur la crique sans pagaie?

38
Doctor Jones

Vous avez un utilisateur orphelin et cela ne peut pas être remappé avec ALTER USER (pour le moment) car il n'y a pas de connexion à mapper. Vous devez donc exécuter CREATE LOGIN first.

Si l'utilisateur au niveau de la base de données est

  • une connexion Windows, le mappage sera automatiquement corrigé via AD SID
  • une connexion SQL, utilisez "sid" de sys.database_principals pour l’option SID pour la connexion

Puis lancez ALTER USER

Modifier, après les commentaires et les mises à jour

Le sid de sys.database_principals correspond à une connexion Windows.

Donc, essayer de créer et de re-mapper une connexion SQL échouera

Exécutez ceci pour obtenir le login Windows

SELECT SUSER_SNAME(0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390)
9
gbn

sp_change_users_login est obsolète.

Beaucoup plus facile est: 

ALTER USER usr1 WITH LOGIN = login1;
43
Brett Rigby

J’ai trouvé que cette question était toujours pertinente mais n’avait pas reçu de réponse claire dans mon cas. 

L'utilisation de SQL Server 2012 avec un SQL_USER orphelin était la solution;

USE databasename                      -- The database I had recently attached
EXEC sp_change_users_login 'Report'   -- Display orphaned users
EXEC sp_change_users_login 'Auto_Fix', 'UserName', NULL, 'Password'
32
riskyc123

Par essais et erreurs, il semble que si l'utilisateur a été créé à l'origine "sans login", alors cette requête 

select * from sys.database_principals

montrera authentication_type = 0 (NONE).

Apparemment, ces utilisateurs ne peuvent être liés à aucun login (préexistant ou nouveau, SQL ou Windows) puisque cette commande:

alter user [TempUser] with login [TempLogin]

répond avec l'erreur de remappage "Msg 33016" indiquée dans la question.

De plus, ces utilisateurs n'apparaissent pas dans le rapport classique (obsolète) SP:

exec sp_change_users_login 'Report'

Si quelqu'un connaît un moyen de contourner ce problème ou comment changer authentication_type, veuillez commenter.

1
crokusek

De quel type d'utilisateur s'agit-il? Exécutez select * from sys.database_principals dans la base de données et vérifiez les colonnes type et type_desc pour cette name. S'il s'agit d'un utilisateur Windows ou SQL, utilisez la réponse de @ gbn, mais s'il s'agit de quelque chose d'autre (ce qui est mon hypothèse non testée en fonction de votre message d'erreur), vous avez un problème différent.


Modifier

Il s’agit donc d’une connexion authentifiée par SQL. À l'époque où nous utilisions sp_change_users_login pour résoudre ces connexions. SQL 2008 l'a comme "n'utilisez pas, sera obsolète", ce qui signifie que la commande ALTER USER devrait suffire ... mais cela pourrait valoir la peine d'essayer dans ce cas. Utilisé correctement (cela fait longtemps), je crois que cela met à jour le SID de l'utilisateur pour qu'il corresponde à celui de la connexion.

0
Philip Kelley

Créer un identifiant pour l'utilisateur

Supprimez et recréez l'utilisateur, AVEC l'identifiant que vous avez créé.

D'autres sujets expliquent comment répliquer les autorisations de votre utilisateur . Je vous recommande de saisir cette opportunité pour définir ces autorisations dans un rôle et appelez sp_addrolemember pour ajouter l'utilisateur à ce rôle.

0
WaitForPete