HAS_PERMS_BY_NAME (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Wertet die gültige Berechtigung des aktuellen Benutzers für ein sicherungsfähiges Element aus. Eine verwandte Funktion ist fn_my_permissions.
Transact-SQL-Syntaxkonventionen
HAS_PERMS_BY_NAME ( securable , securable_class , permission
[ , sub-securable ] [ , sub-securable_class ] )
securable
Der Name des sicherungsfähigen Elements. Wenn das sicherungsfähige Element der Server selbst ist, sollte dieser Wert auf NULL festgelegt werden. securable ist ein Skalarausdruck vom Typ sysname. Es gibt keinen Standardwert.
securable_class
Der Name der Klasse des sicherungsfähigen Elements, für das die Berechtigung getestet wird. securable_class ist ein Skalarausdruck vom Typ nvarchar(60).
In Azure SQL-Datenbank muss das securable_class-Argument auf einen der folgenden Werte festgelegt werden: DATABASE, OBJECT, ROLE, SCHEMA oder USER.
permission
Ein Skalarausdruck ungleich NULL vom Datentyp sysname, der den zu überprüfenden Berechtigungsnamen darstellt. Es gibt keinen Standardwert. Der Berechtigungsname ANY ist ein Platzhalter.
sub-securable
Ein optionaler Skalarausdruck vom Typ sysname, der den Namen der sicherungsfähigen untergeordneten Entität darstellt, mit der die Berechtigung getestet wird. Die Standardeinstellung ist NULL.
Hinweis
In untergeordneten sicherungsfähigen Elementen dürfen keine Klammern in der Form „[Name des untergeordneten Elements]“ verwendet werden. Verwenden Sie stattdessen 'Name des untergeordneten sicherungsfähigen Elements' .
sub-securable_class
Ein optionaler Skalarausdruck vom Datentyp nvarchar(60), der die Klasse der sicherungsfähigen untergeordneten Entität darstellt, für die die Berechtigung getestet wird. Die Standardeinstellung ist NULL.
Das sub-securable_class-Argument ist in Azure SQL-Datenbank nur gültig, wenn das securable_class-Argument auf OBJECT festgelegt ist. Wenn das securable_class-Argument auf OBJECT festgelegt ist, muss das sub-securable_class-Argument auf COLUMN festgelegt werden.
int
Gibt NULL zurück, wenn die Abfrage einen Fehler erzeugt.
Diese integrierte Funktion testet, ob der aktuelle Prinzipal eine bestimmte gültige Berechtigung für ein bestimmtes sicherungsfähiges Element aufweist. HAS_PERMS_BY_NAME gibt 1 zurück, wenn der Benutzer über eine gültige Berechtigung für das sicherungsfähige Element verfügt, 0, wenn der Benutzer über keine gültige Berechtigung für das sicherungsfähige Element verfügt, und NULL, wenn die sicherungsfähige Klasse oder die Berechtigung nicht gültig ist. Bei einer gültigen Berechtigung kann es sich um Folgendes handeln:
Eine Berechtigung, die dem Prinzipal direkt gewährt und nicht verweigert wurde.
Eine Berechtigung, die durch eine Berechtigung auf höherer Ebene des Prinzipals impliziert wird und nicht verweigert wird.
Eine Berechtigung, die einer Rolle oder Gruppe erteilt wird, der der Prinzipal als Mitglied angehört, und nicht verweigert wird.
Eine Berechtigung einer Rolle oder Gruppe, der der Prinzipal als Mitglied angehört, und die nicht verweigert wird.
Die Berechtigungsauswertung erfolgt immer im Sicherheitskontext des Aufrufers. Wenn Sie bestimmen möchten, ob ein anderer Benutzer eine gültige Berechtigung aufweist, benötigt der Aufrufer die IMPERSONATE-Berechtigung für diesen Benutzer.
Für Entitäten auf Schemaebene werden ein-, zwei- oder dreiteilige Namen akzeptiert, die ungleich NULL sind. Für Entitäten auf Datenbankebene ist ein einteiliger Name zulässig, wobei ein NULL-Wert für "aktuelle Datenbank" steht. Für den Server selbst ist ein NULL-Wert (steht für "aktueller Server") erforderlich. Mit dieser Funktion können keine Berechtigungen auf einem Verbindungsserver oder für einen Windows-Benutzer überprüft werden, für den kein Prinzipal auf Serverebene erstellt wurde.
Die folgende Abfrage gibt eine Liste integrierter sicherungsfähiger Klassen zurück:
SELECT class_desc FROM sys.fn_builtin_permissions(default);
Die folgenden Sortierungen werden verwendet:
Aktuelle Datenbanksortierung: auf Datenbankebene sicherungsfähige Elemente einschließlich sicherungsfähiger Elemente, die nicht in einem Schema enthalten sind; ein- oder zweiteilige sicherungsfähige Elemente mit Schemabereich; Zieldatenbanken, falls ein dreiteiliger Name verwendet wird.
master-Datenbanksortierung: auf Serverebene sicherungsfähige Elemente.
'ANY' wird für Überprüfungen auf Spaltenebene nicht unterstützt. Sie müssen die entsprechende Berechtigung angeben.
Gilt für: SQL Server 2008 (10.0.x) und höher
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');
Gilt für: SQL Server 2008 (10.0.x) und höher
SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
Angenommen, der Aufrufer hat die IMPERSONATE-Berechtigung für den Pd
-Prinzipal.
EXECUTE AS user = 'Pd'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
GO
REVERT;
GO
Für das folgende Beispiel ist die ALTER
-Berechtigung in S
und die CREATE PROCEDURE
-Berechtigung für die Datenbank und entsprechend für Tabellen erforderlich.
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
Im folgenden Beispiel wird von AdventureWorks2022
als aktuellem Datenbankkontext ausgegangen und ein zweiteiliger Name verwendet.
SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');
Im folgenden Beispiel wird von keinem aktuellen Datenbankkontext ausgegangen und ein dreiteiliger Name verwendet.
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');
Berechtigungen (Datenbank-Engine)
Sicherungsfähige Elemente
Berechtigungshierarchie (Datenbank-Engine)
sys.fn_builtin_permissions (Transact-SQL)
Sicherheitskatalogsichten (Transact-SQL)