Ermöglichen Sie dem Benutzer, alles innerhalb seines eigenen Schemas zu tun, ohne das Schema selbst zu erstellen oder zu löschen

12

Ich habe ein Schema in SQL Azure erstellt und einer Datenbankrolle die folgenden Berechtigungen erteilt:

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;

Über die oben definierten Berechtigungen myuserkann ein eigenes Schema erstellt / gelöscht werden. Um das Problem zu lösen, habe ich die ALTER ANY SCHEMA-Berechtigung verwendet. Diese Berechtigung verweigert dem Benutzer jedoch auch das Erstellen / Löschen von Tabellen.

Welche Berechtigungen sind erforderlich, damit der Benutzer innerhalb seines eigenen Schemas etwas tun kann, das Schema selbst jedoch nicht erstellen oder löschen kann?

user960567
quelle

Antworten:

8

Es ist nicht erforderlich, CONTROLdas Schema zu gewähren .
Die dafür erforderliche Berechtigung DROP SCHEMAbefindet sich entweder CONTROLauf Schema- oder ALTER ANY SCHEMAauf Datenbankebene. Aus diesem Grund konnte Ihr Benutzer das Schema löschen. Durch das Entfernen dieser beiden Berechtigungen wird verhindert, dass die rollenassoziierten Benutzer das Schema erstellen und löschen (es sei denn, sie verfügen natürlich über Berechtigungen höherer Ebene).

Die erforderliche Berechtigung für CREATE ALTERund DROPandere Objekte ist die CREATEBerechtigung für den Objekttyp (Tabelle \ Prozedur \ Funktion \ Ansicht), kombiniert mit der ALTERBerechtigung für das Schema.
Sie haben diese Berechtigungen bereits in Ihrem Skript. Alles, was Sie tun müssen, ist, die CONTROLBerechtigung zu entfernen . Als Referenz finden Sie hier eine BOL- Liste von DDLAnweisungen, in denen Sie die erforderliche Berechtigung für alle Objekttypen finden.

Für die Faulen ist hier Ihr Code, nachdem Sie die unnötige Erlaubnis entfernt haben:

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;
Roi Gavish
quelle
Aber der Benutzer kann auch Objekte in einem anderen Schema erstellen?
u23432534
3

Da das neue Schema die Berechtigung "dbo" hat, kann der Benutzer indirekt auf alle Datenbankobjekte zugreifen, deren Eigentümer das Schema dbo ist.

Beispiel:

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.

Dies ist die korrekte Funktionsweise des SQL Server-Moduls. Berechtigungen dringen mit derselben Berechtigung in andere Schemata ein. Um diesen Zugriff einzuschränken, gibt es hier eine Option für die Schemaerstellung:

CREATE SCHEMA myschema AUTHORIZATION myrole;
Jonathan Mears
quelle