HAS_PERMS_BY_NAME (Transact-SQL)
Valuta l'autorizzazione valida dell'utente corrente per un'entità a protezione diretta. Una funzione correlata è fn_my_permissions.
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 e 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).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
Nelle versioni di SQL Server fino a SQL Server 2008 Service Pack 2, le sottoentità a protezione diretta non possono utilizzare le parentesi nella forma '[nome secondario]'. È necessario utilizzare '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.
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
A. Verifica dell'autorizzazione utente VIEW SERVER STATE a livello di server
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');
B. Verifica della capacità dell'utente di rappresentare (IMPERSONATE) l'entità server Ps
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. Verifica dell'autorizzazione INSERT nella tabella SalesPerson in AdventureWorks2008R2
Nell'esempio seguente si presuppone che AdventureWorks2008R2 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('AdventureWorks2008R2.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');