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?
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 CREATE
ALTER
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;
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;