Create View & Alter Schema

di Luca Bianchi, in SQL Server,

Ho ricevuto una mail da uno dei partecipanti ad un mio corso su SQL Server 2005 che mi chiedeva:

"...vogliamo dare ad un gruppo di utenti l'abilitazione su un DB di poter creare (e droppare) solo e soltanto VIEW. Abbiamo assegnato a questo gruppo la grant CREATE VIEW, ma quando si cercava di creare una vista SQL restituiva il seguente errore: "The specified schema name "dbo" either does not exist or you do not have permission to use it". A questo punto abbiamo assegnato al gruppo la permission di ALTER sullo SCHEMA dbo e così ha funzionato, ma oltre a creare le viste il gruppo poteva anche modificare le tabelle a addirittura cancellarle."

Effettivamente per poter creare una vista sono necessari entrambi i permessi: il CREATE VIEW per poter creare oggetti (si tratta quindi di un permesso a livello di database) e l'ALTER SCHEMA per poter modificare uno schema aggiungendovi degli oggetti (ma questo significa anche essere in grado di eliminare gli oggetti dello schema e ciò contrasta con la nostra esigenza).

Per trovare una via d'uscita dobbiamo fare un upgrade anche del nostro modo di pensare e solo ragionando in "SQL Server 2005 mode" possiamo concludere che ciò che ci serve è un "contenitore virtuale all'interno del quale poter creare i nostri oggetti, essere in grado di rimuoverli e, al tempo stesso, non poter fare altrettanto sugli altri oggetti di database". Ovvero uno SCHEMA, un contenitore logico di oggetti di database su cui poter assegnare dei permessi. Nell'esempio che segue viene fornito lo script per eseguire il test

USE master;
CREATE DATABASE MyDB;
CREATE LOGIN MyTest WITH PASSWORD = 'MyTest123';
GO

USE MyDB;
CREATE ROLE MyRole;
CREATE USER MyTest FOR LOGIN MyTest;
EXEC sp_addrolemember MyRole, MyTest;
GO

CREATE SCHEMA Private AUTHORIZATION MyRole;
GO

CREATE VIEW dbo.V1
AS
SELECT GETDATE() as data
GO

GRANT CREATE VIEW TO MyTest
GO

EXECUTE AS USER = 'MyTest'
GO

CREATE VIEW Private.V1
AS
SELECT GETDATE() as data
GO

DROP VIEW Private.V1
GO

DROP VIEW dbo.V1
GO

REVERT
GO

USE master;
DROP DATABASE MyDB;
DROP LOGIN MyTest;
GO

Come si può vedere l'utente MyTest è in grado di creare ed eliminare viste nello schema appartenente al ruolo di cui fa parte (MyRole) ma non può fare altrettanto sugli oggetti presenti negli altri schema salvo esplicite autorizzazioni.

Bye

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese