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

Syntax

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

Argumente

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.

Rückgabetypen

int

Gibt NULL zurück, wenn die Abfrage einen Fehler erzeugt.

Bemerkungen

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.

Beispiele

A. Habe ich die VIEW SERVER STATE-Berechtigung auf Serverebene?

Gilt für: SQL Server 2008 (10.0.x) und höher

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

B. Kann ich die IMPERSONATE-Anweisung für den Ps-Serverprinzipal ausführen?

Gilt für: SQL Server 2008 (10.0.x) und höher

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

C. Habe ich Berechtigungen in der aktuellen Datenbank?

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

D: Hat der Pd-Datenbankprinzipal Berechtigungen in der aktuellen Datenbank?

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  

E. Kann ich Prozeduren und Tabellen im S-Schema erstellen?

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;  

F. Für welche Tabellen habe ich die SELECT-Berechtigung?

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

G. Verfüge ich über die INSERT-Berechtigung für die SalesPerson-Tabelle in AdventureWorks2022?

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');  

H. Für welche Spalten der T-Tabelle habe ich die SELECT-Berechtigung?

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');  

Weitere Informationen

Berechtigungen (Datenbank-Engine)
Sicherungsfähige Elemente
Berechtigungshierarchie (Datenbank-Engine)
sys.fn_builtin_permissions (Transact-SQL)
Sicherheitskatalogsichten (Transact-SQL)