web-dev-qa-db-fra.com

Les connexions SQL dans le rôle DB_OWERNER dans la base de données ne peuvent pas créer de procédures stockées

J'ai commencé à verrouiller les autorisations dans notre environnement de test en supprimant sysadmin la permission de comptes génériques. Le premier compte, utilisé par plusieurs développeurs, est une connexion SQL locale. J'ai donné le compte le db_owner rôle dans la base de données. Le développeur indique qu'il ne peut plus créer de procédures stockées.

J'ai validé cela est vrai dans cette instance SQL 2014 particulière, je ne peux pas la reproduire nulle part ailleurs. J'ai fait de tout ce que je peux penser à résoudre ce problème. Le meilleur indice que j'ai est que j'ai créé un nouveau login SQL et l'a donné db_owner dans la même base de données. Cela ne peut pas non plus créer de procédure. La connexion originale ne peut pas créer de procédures dans d'autres bases de données utilisateur, même si elle a db_owner.

Tenter de créer une procédure donne:

MSG 262, niveau 14, État 18, procédure TheProcédrique, ligne 30
[.____] Créer une autorisation de procédure refusée dans la base de données "DBTEST".

Le message d'erreur est correct, CREATE PROCEDURE ne montre pas l'utilisateur, même après que je l'assigne explicitement. L'utilisateur peut modifier toute procédure. La création UDF obtient une erreur similaire:

Créer une autorisation de fonction refusé dans la base de données ...

Quelqu'un a-t-il une idée de ce qui pourrait se produire?

Quand je fais un:

select * from fn_my_permissions(null, 'DATABASE')

CREATE PROCEDURE n'est pas répertorié. J'ai vérifié pour tout DENY in sys.permissions, il n'y en a pas.

La requête suivante:

SELECT * FROM fn_my_permissions('xyz', 'USER');

retour:

IMPERSONATE, VIEW DEFINITION, ALTER, CONTROL
3
IanG

Intéressant un - difficile à épingler celui-ci. Avez-vous pensé à regarder le rôle public?

sp_helprotect 'Créer la procédure', NULL, NULL, 'S'

Est-ce que cela vous ramène quelque chose?

2
unclefredo

Contrairement à Sysadmin, qui contourne les chèques, les rôles de base de données intégrés ne sont pas si spéciaux qu'ils ne peuvent pas être remplacés par un refus.

Essayez de regarder EXEC SP_HELPPROTECT NULL, "Nom d'utilisateur" et voyez ce que Deny Records apparaît.

1
Cody Konior

Réponse courte :

  • Essayez de modifier la base de données par défaut de l'utilisateur DEV sur leur base de données particulière.

  • Dans la fenêtre de la requête au sein de SS Studio, assurez-vous qu'ils utilisent le contexte de base de données approprié dans la fenêtre de requête via la liste déroulante de la base de données ou l'utilisation de T-SQL [DBName].

longue réponse :

Je ne peux pas parler pour toutes circonstances mais je connais un cas où cela nous est certainement arrivé. La base de données par défaut a été définie sur 'Master' pour notre utilisateur particulier et les avions SA Droits. Nous avons supprimé SA Droits et voici, ils ne pouvaient soudainement pas la création de procédures dont ils ont besoin pour - seulement se connecter.

Changer la base de données par défaut de l'utilisateur aidé à leur base de données, corrigez ce problème. (Il s'avère qu'on ne disposait que de connecter les droits à la base de données principale). De plus, la déclaration d'utilisation a fonctionné dans la fenêtre SS Studio de requête:

USE DBTest
go
Create Procedure spMyProc
as
select @@servername

Cela dit, je vérifierais la base de données principale (et d'autres bases de données) pour voir si les développeurs mettent à tort de manière erronée leur code dans d'autres bases de données au lieu de la base de données appropriée - quand elles ont eu SA. Pour nous supprimer SA Droits a définitivement révélé une question rougeoyante avec la manière dont les développeurs utilisaient le système.

p.s. Faites-moi savoir s'ils utilisent des bases de données partiellement contenues car il peut être identique aux utilisateurs nommés à l'intérieur et à l'extérieur de la base de données qui causerait des problèmes similaires, apparemment, des autorisations.

0
Sting