web-dev-qa-db-fra.com

Autoriser l'utilisateur à faire quoi que ce soit dans son propre schéma mais pas à créer ou à supprimer le schéma lui-même

J'ai créé un schéma dans SQL Azure et accordé les autorisations suivantes à un rôle de base de données:

CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';

CREATE SCHEMA myschema AUTHORIZATION dbo;

GRANT ALTER, CONTROL, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE, VIEW 
DEFINITION ON SCHEMA::myschema TO myrole;

GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;

Grâce aux autorisations définies ci-dessus, myuser peut créer/supprimer son propre schéma, afin de surmonter le problème, j'ai essayé l'autorisation ALTER ANY SCHEMA. Mais cette autorisation empêche également l'utilisateur de créer/supprimer des tables.

Quelles autorisations sont nécessaires pour permettre à l'utilisateur de faire quoi que ce soit au sein de son propre schéma sans pouvoir créer ou supprimer le schéma lui-même?

12
user960567

Il n'est pas nécessaire d'accorder CONTROL sur le schéma.
L'autorisation requise pour DROP SCHEMA est CONTROL sur le schéma ou ALTER ANY SCHEMA au niveau de la base de données, et c'est pourquoi votre utilisateur a pu supprimer le schéma. La suppression de ces deux autorisations empêchera les utilisateurs associés au rôle de créer et de supprimer le schéma (sauf s'ils disposent bien sûr d'autorisations de niveau supérieur).

L'autorisation requise pour CREATEALTER et DROP d'autres objets est l'autorisation CREATE pour le type d'objet (table\procédure\fonction\vue) combiné avec ALTER autorisation sur le schéma.
Vous disposez déjà de ces autorisations dans votre script, il vous suffit donc de supprimer l'autorisation CONTROL. Pour référence, voici une liste BOL des instructions DDL où vous pouvez trouver l'autorisation requise pour tous les types d'objets.

Pour les paresseux, voici votre code après avoir supprimé l'autorisation inutile:

CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';

CREATE SCHEMA myschema AUTHORIZATION dbo;

GRANT ALTER, DELETE, EXECUTE, INSERT, REFERENCES, SELECT,
          UPDATE, VIEW DEFINITION ON SCHEMA::myschema TO myrole;

GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;
8
Roi Gavish

Notez que puisque le nouveau schéma a l'autorisation de "dbo", l'utilisateur pourra accéder indirectement à tous les objets de base de données où le schéma appartient à dbo.

Exemple:

select * from dbo.test; --fails

create view myschema.test
as 
select * 
from dbo.test; --view is created

select * from myschema.test;  --contents of dbo.test now revealed.

Il s'agit du bon fonctionnement du moteur SQL Server; les autorisations imprègnent d'autres schémas avec la même autorisation. Pour restreindre cet accès, voici une option pour la création de schéma:

CREATE SCHEMA myschema AUTHORIZATION myrole;
5
Jonathan Mears