6

Je viens de migrer de SQL2000 vers SQL2008 et j'ai commencé à obtenir un problème d'autorisation d'exécution sur un proc stocké qui utilise sp_OACreate.Autorisation d'exécution du serveur SQL; échec d'application des autorisations

Le reste du système fonctionne correctement avec le login db qui a été configuré et ajouté à la base de données.

J'ai essayé:

USE master 
GO 
GRANT EXEC ON sp_OACreate TO [dbuser] 
GO 

Mais cela échoue avec l'erreur suivante:

Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbuser', because it does not exist or you do not have permission.

Je suis ouvert une session sur le serveur comme sa avec les autorisations. Je peux exécuter une instruction sql similaire et appliquer les autorisations à un rôle de serveur, mais pas à un identifiant/utilisateur. Comment appliquer les modifications à l'utilisateur/login spécifique?

Je peux appliquer les permissions au rôle public et cela résout mon problème; Cependant, cela semble être un problème de sécurité pour moi que je ne veux pas vraiment appliquer au serveur live.

Répondre

5

En tête de la réponse de John J'ai vérifié les listes d'utilisateurs sur la base de données principale et mon utilisateur n'était pas là. Si elle avait été supprimée ou perdue, comment je ne sais pas.Quelque chose est peut-être devenu fou avec la migration du dbs vers la nouvelle instance de serveur.

Quoi qu'il en soit; recréer l'utilisateur et l'associer à la connexion spécifique m'a permis d'exécuter les instructions suivantes sur la base de données master pour permettre l'exécution des procs stockés.

USE MASTER 
GO 

GRANT EXECUTE ON [sys].[sp_OADestroy] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OACreate] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OAMethod] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [dbuser] 
GO 

Merci pour toute l'aide et les pointeurs. J'espère que cela aidera d'autres personnes dans le futur.

+0

Comment avez-vous migré vos bases de données? Si vous n'avez pas restauré la base de données master, l'utilisateur "dbuser" n'aurait pas été présent et donc pas mappé. –

+0

@John - Vous avez raison. La restauration de la base de données Master n'a pas été effectuée en raison de certains bits et bobs historiques que nous voulions éviter dans la migration. Malheureusement, nous avons également perdu les utilisateurs qui sont maintenant recréés et mappés aux connexions :-) – WestDiscGolf

1

Vérifiez si votre utilisateur dispose d'autorisations pour la base de données que vous utilisez. Vous pouvez le faire par Security -> Logins -> Select User et ouvrez la fenêtre des propriétés. Ensuite, sélectionnez "User Mapping" dans le menu de droite. Maintenant, vérifiez les bases de données auxquelles vous voulez que l'utilisateur donné ait accès. Après cela, sélectionnez dans la partie inférieure de la fenêtre "appartenance au rôle de base de données" et vérifiez "db_owner". Maintenant, l'utilisateur sera le propriétaire de la base de données et sera en mesure d'exécuter des requêtes, des procédures de stockage et ainsi de suite.

MISE À JOUR:
Ajouter un utilisateur pour la base de données en sélectionnant la base de données -> sécurité -> utilisateurs -> clic droit "New User"
Ou vous pouvez utiliser cette requête

CREATE LOGIN AbolrousHazem 
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy'; 
USE AdventureWorks2008R2; 
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem; 
GO 

Voici plus de détails http://msdn.microsoft.com/en-us/library/ms173463.aspx

+0

Merci pour votre réponse. Le rôle db_owner de l'utilisateur est défini sur la base de données. J'ai essayé d'ajouter les autorisations d'exécution spécifiques au rôle db_owner et le message d'erreur suivant s'affiche: "Impossible d'accorder, de refuser ou de révoquer des autorisations vers ou depuis des rôles spéciaux." – WestDiscGolf

+0

Vérifiez si un utilisateur est connecté à votre base de données. Il semble que vous ayez seulement le login mais pas l'utilisateur. – Thea

+0

cela semblait être le cas; J'ai ajouté une réponse à ce que j'ai fait pour résoudre le problème. Merci pour l'aide :-) – WestDiscGolf

2

Votre problème peut être lié aux utilisateurs orphelins.

Essayez

USE MASTER 
GO 
EXEC sp_change_users_login 'Report' 

Ceci renverra une ligne par nom d'utilisateur devenus orphelins. Ensuite,

EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser' 
+0

Merci pour votre réponse. J'ai exécuté la première commande sur le serveur et aucun enregistrement n'est retourné par la requête. – WestDiscGolf

+0

Merci pour le point dans l'aide dans la bonne direction. +1 :-) – WestDiscGolf

4

L'erreur indique que l'utilisateur "dbuser" n'existe pas dans la base de données master.

Je suppose que l'utilisateur existe dans la base de données principale?

Vous pouvez vérifier en utilisant les éléments suivants T-SQL

USE MASTER; 
GO 

SELECT * 
FROM sys.sysusers 
WHERE name = 'dbuser' 

Si l'utilisateur s'avère ne pas exister, il suffit d'utiliser la déclaration CREATE USER et de créer un utilisateur appelé « dbuser ». L'utilisateur sera automatiquement mappé à un Login du même nom, à condition qu'il en existe un.

+0

Merci pour votre réponse. Non, il n'existe pas dans la table sysusers. Comment peut-il être rajouté? – WestDiscGolf

+0

Ok, rajouté l'utilisateur et l'a associé au login dbuser. J'ai ensuite appliqué les autorisations de concession à l'utilisateur. :-) – WestDiscGolf

+0

@WestDiscGolf: Excellente nouvelle, heureux d'aider. –

2

Voici un code que je utilise verify que (utilisateur actuel) a la permission d'exécution sp_OACreate etc:

use master; 
select state_desc,name from 
sys.database_permissions a 
left join 
sys.all_objects b 
on a.major_id = b.object_id 
where name like 'sp_OA%'; 

Comme indiqué par @John Sansom et @WestDiscGolf l'utilisateur doit exister dans la La base de données principale et les droits d'exécution doivent être accordés dans la base de données principale. Par conséquent, use Master est requis. La requête ci-dessus retournera des enregistrements si l'utilisateur a des permissions d'exécution et un jeu vide s'ils ne le font pas. (L'exécution dans la base de données utilisateur renverra également l'ensemble vide.)

Je ne pouvais pas trouver un moyen de vérifier ces autorisations en utilisant fn_my_permissions, qui est censé être le bon outil pour les emplois comme celui-ci.