Condividi tramite


HAS_PERMS_BY_NAME (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Valuta l'autorizzazione valida dell'utente corrente per un'entità a protezione diretta. Una funzione correlata è fn_my_permissions.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

HAS_PERMS_BY_NAME ( securable , securable_class , permission    
    [ , sub-securable ] [ , sub-securable_class ] )  

Argomenti

securable
Nome dell'entità a protezione diretta. Se l'entità a protezione diretta è il server stesso, questo valore deve essere impostato su NULL. securable è un'espressione scalare di tipo sysname. Non prevede alcun valore predefinito.

securable_class
Nome della classe dell'entità a protezione diretta in cui viene testata l'autorizzazione. securable_class è un'espressione scalare di tipo nvarchar(60).

In database SQL di Azure l'argomento securable_class deve essere impostato su uno dei seguenti valori DATABASE, OBJECT, ROLE, SCHEMA, or USER.

permission
Espressione scalare non Null di tipo sysname che rappresenta il nome dell'autorizzazione da controllare. Non prevede alcun valore predefinito. Il nome di autorizzazione ANY è un carattere jolly.

sub-securable
Espressione scalare facoltativa di tipo sysname che rappresenta il nome della sottoentità a protezione diretta in cui viene testata l'autorizzazione. Il valore predefinito è NULL.

Nota

Le sottoentità a protezione diretta non possono usare le parentesi quadre nella forma '[nome secondario]'. Usare invece 'nome secondario'.

sub-securable_class
Espressione scalare facoltativa di tipo nvarchar(60) che rappresenta la classe della sottoentità a protezione diretta in cui viene testata l'autorizzazione. Il valore predefinito è NULL.

In database SQL di Azure l'argomento sub-securable_class è valido solo se l'argomento securable_class è impostato su OBJECT. Se l'argomento securable_class è impostato su OBJECT, l'argomento sub-securable_class deve essere impostato su COLUMN.

Tipi restituiti

int

Restituisce NULL se la query non viene eseguita correttamente.

Osservazioni:

Questa funzione predefinita testa se l'entità principale dispone di una determinata autorizzazione valida per un'entità a protezione diretta specificata. HAS_PERMS_BY_NAME restituisce 1 quando l'utente dispone dell'autorizzazione valida sull'entità a protezione diretta, 0 in caso contrario oppure NULL quando la classe di entità a protezione diretta o l'autorizzazione non è valida. Di seguito vengono riportate le autorizzazioni valide:

  • Autorizzazione concessa direttamente all'entità di protezione e non negata.

  • Un'autorizzazione inclusa in un'autorizzazione di livello superiore assegnata all'entità di protezione e non negata.

  • Un'autorizzazione concessa a un ruolo o a un gruppo cui appartiene l'entità di protezione e non negata.

  • Un'autorizzazione di cui dispone un ruolo o un gruppo a cui appartiene l'entità di protezione e non negata.

La valutazione dell'autorizzazione viene sempre eseguita nel contesto di sicurezza del chiamante. Per determinare se altri utenti dispongono di un'autorizzazione valida, il chiamante deve disporre dell'autorizzazione IMPERSONATE per l'utente.

Per le entità a livello di schema, sono accettati i nomi non Null composti da una, due o tre parti. Per le entità a livello di database, è accettato un nome composto da una parte, con un valore Null ad indicare il database corrente. Per il server stesso, è richiesto un valore Null, ad indicare il server corrente. Questa funzione non può controllare le autorizzazioni per un server collegato o per un utente di Windows per cui non è stata creata un'entità a livello di server.

La query seguente restituirà un elenco di classi di entità a protezione diretta predefinite:

SELECT class_desc FROM sys.fn_builtin_permissions(default);  

Vengono utilizzate le regole di confronto seguenti:

  • Regole di confronto del database corrente: entità a protezione diretta che includono le entità a protezione diretta non contenute in uno schema, entità a protezione diretta con ambito schema in una o due parti, database di destinazione quando si utilizza un nome in tre parti.

  • Regole di confronto del database master: entità a protezione diretta del database.

  • ANY non è supportato per i controlli a livello di colonna. È necessario specificare l'autorizzazione appropriata.

Esempi

R. Verifica dell'autorizzazione utente VIEW SERVER STATE a livello di server

Si applica a: SQL Server 2008 (10.0.x) e versioni successive

SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');  

B. Verifica della capacità dell'utente di rappresentare (IMPERSONATE) l'entità server Ps

Si applica a: SQL Server 2008 (10.0.x) e versioni successive

SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');  

C. Verifica delle autorizzazioni dell'utente per il database corrente

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');  

D. Verifica delle autorizzazioni dell'entità di database Pd per il database corrente

Nell'esempio si presuppone che il chiamante disponga dell'autorizzazione IMPERSONATE per l'entità Pd.

EXECUTE AS user = 'Pd'  
GO  
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');  
GO  
REVERT;  
GO  

E. Verifica delle autorizzazioni dell'utente per creare procedure e tabelle nello schema S

Nell'esempio seguente è richiesta l'autorizzazione ALTER in S e l'autorizzazione CREATE PROCEDURE nel database e le autorizzazioni corrispondenti per le tabelle.

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE')  
    & HAS_PERMS_BY_NAME('S', 'SCHEMA', 'ALTER') AS _can_create_procs,  
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') &  
    HAS_PERMS_BY_NAME('S', 'SCHEMA', 'ALTER') AS _can_create_tables;  

F. Verifica delle tabelle per cui l'utente dispone dell'autorizzazione SELECT

SELECT HAS_PERMS_BY_NAME  
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),   
    'OBJECT', 'SELECT') AS have_select, * FROM sys.tables  

G. Si dispone dell'autorizzazione INSERT per la tabella SalesPerson in AdventureWorks2022?

Nell'esempio seguente si presuppone che AdventureWorks2022 sia il contesto del database corrente dell'utente e viene utilizzato un nome composto da due parti.

SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');  

Nell'esempio corrente non vi sono presupposizioni sul contesto del database corrente e viene utilizzato un nome composto da tre parti.

SELECT HAS_PERMS_BY_NAME('AdventureWorks2022.Sales.SalesPerson',   
    'OBJECT', 'INSERT');  

H. Verifica delle colonne della tabella T per cui l'utente dispone dell'autorizzazione SELECT

SELECT name AS column_name,   
    HAS_PERMS_BY_NAME('T', 'OBJECT', 'SELECT', name, 'COLUMN')   
    AS can_select   
    FROM sys.columns AS c   
    WHERE c.object_id=object_id('T');  

Vedi anche

Autorizzazioni (Motore di database)
Entità a protezione diretta
Gerarchia delle autorizzazioni (Motore di database)
sys.fn_builtin_permissions (Transact-SQL)
Viste del catalogo relative alla sicurezza (Transact-SQL)