HAS_PERMS_BY_NAME (Transact-SQL)

Wertet die gültige Berechtigung des aktuellen Benutzers für ein sicherungsfähiges Element aus. Eine verwandte Funktion ist fn_my_permissions.

Themenlink (Symbol)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 Datentyp 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 Datentyp nvarchar(60).

  • 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 Datentyp sysname, der den Namen der sicherungsfähigen untergeordneten Entität darstellt, für die die Berechtigung getestet wird. Der Standardwert ist NULL.

    HinweisHinweis

    In den Versionen SQL Server bis SQL Server 2008 Service Pack 2 dürfen in untergeordneten sicherungsfähigen Elementen keine eckigen Klammern in der Form '[Name des untergeordneten sicherungsfähigen 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. Der Standardwert ist NULL.

Rückgabetypen

int

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

Hinweise

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 direkt dem Prinzipal erteilt wird und nicht verweigert wird.

  • 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 wird immer im Sicherheitskontext des Aufrufers ausgeführt. 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 sind ein-, zwei- und dreiteilige Namen ungleich NULL zulässig. 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?

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

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

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 AdventureWorks2008R2?

Im folgenden Beispiel wird von AdventureWorks2008R2 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('AdventureWorks2008R2.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');