Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Iscriviti oggi stessoQuesto browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
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
HAS_PERMS_BY_NAME ( securable , securable_class , permission
[ , sub-securable ] [ , sub-securable_class ] )
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.
int
Restituisce NULL se la query non viene eseguita correttamente.
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.
Si applica a: SQL Server 2008 (10.0.x) e versioni successive
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');
Si applica a: SQL Server 2008 (10.0.x) e versioni successive
SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
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
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;
SELECT HAS_PERMS_BY_NAME
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables
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');
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');
Autorizzazioni (Motore di database)
Entità a protezione diretta
Gerarchia delle autorizzazioni (Motore di database)
sys.fn_builtin_permissions (Transact-SQL)
Viste del catalogo della sicurezza (Transact-SQL)
Eventi
31 mar, 23 - 2 apr, 23
Il più grande evento di apprendimento di SQL, Infrastruttura e Power BI. 31 marzo - 2 aprile. Usare il codice FABINSIDER per salvare $400.
Iscriviti oggi stesso