2009-04-28 9 views
7

J'ai la configuration suivante:problème avec SQL Server « EXECUTE AS »

Il y a un DB SQL Server avec plusieurs tables qui ont des déclencheurs fixés sur eux (qui recueillent des données historiques). Ces déclencheurs sont des procédures stockées CLR avec EXECUTE AS 'HistoryUser'. L'utilisateur HistoryUser est un utilisateur simple dans la base de données sans connexion. Il a suffisamment d'autorisations pour lire dans toutes les tables et écrire dans la table d'historique.

Lorsque je sauvegarde la base de données et la restaure sur une autre machine (machine virtuelle dans ce cas, mais cela n'a pas d'importance), les déclencheurs ne fonctionnent plus. En fait, aucune usurpation d'identité pour l'utilisateur ne fonctionne plus. Même une simple déclaration comme ce

exec ('select 3') as user='HistoryUser' 

produit une erreur:

Cannot execute as the database principal because the principal "HistoryUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.

Je read in MSDN que cela peut se produire si le propriétaire DB est un utilisateur de domaine, mais ce n'est pas. Et même si je le change à n'importe quoi d'autre (leur solution recommandée) ce problème demeure.

Si je crée un autre utilisateur sans connexion, je peux très bien l'utiliser pour l'usurpation d'identité. C'est, cela fonctionne très bien:

create user TestUser without login 
go 
exec ('select 3') as user='TestUser' 

Je ne veux pas recréer tous ces déclencheurs, donc est-il possible que je peux faire le travail HistoryUser existant?

Bump: Désolé, mais c'est un peu urgent ...

Répondre

4

Quel compte utilisateur ne le déclencheur exécuter comme.

Vous devez accorder cet privilège à l'utilisateur IMPERSONATE pour l'utilisateur de l'historique du compte utilisateur.

GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser 

Plus de détails ici

http://msdn.microsoft.com/en-us/library/ms181362.aspx

+0

Nop, ne permet pas. –

4

problèmes comme celui-ci qui se posent après le déplacement d'une base de données d'une machine à une autre SID impliquent généralement désorienté de, bien que je ne sais pas si ou comment il applique ton cas. Essayez de supprimer et de recréer l'utilisateur de la base de données, en veillant à rétablir ses autorisations sur ces tables.

+0

C'est juste le point - cet utilisateur n'a jamais eu de connexion. Quels SIDs? Et, comme je l'ai dit dans la question ci-dessus, je préfère ne pas recréer l'utilisateur, parce que je dois aussi recréer tout un tas de déclencheurs. –

+0

Cela a fonctionné pour moi. Nous avons dû migrer la base de données à partir d'un autre serveur et rencontré ce problème. – ahwm

3

C'est un "utilisateur orphelin". Ça ne marchera pas. La documentation l'indique clairement. :-( Correction de l'état "utilisateur orphelin" et cela fonctionnera à nouveau

+2

Quelle documentation - pourriez-vous fournir un lien? Merci – doza

5

Détecter les utilisateurs orphelins, puis résoudre en liant à un login.

Detect:

UTILISATION <bdd>;
GO;
sp_change_users_login @ Action = ' Rapport ';
GO;

RESOLVE:
La commande suivante réenchaîne le compte de connexion de serveur spécifié par <login_name> avec l'utilisateur de base de données spécifiée par <database_user>:

UTILISATION <bdd>;
GO
sp_change_users_login @ Action = ' update_one ',
@ UserNamePattern = ' <database_user> ',
@ LoginName = ' <login_name> ';
GO

https://msdn.microsoft.com/en-us/library/ms175475.aspx

Questions connexes