Has_Perms_By_Name (Transact-SQL)

Wertet die gültige Berechtigung des aktuellen Benutzers für ein sicherungsfähiges Element aus.

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.
  • 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. 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(SCHEMA_NAME(schema_id) + '.' + name, 
    'OBJECT', 'SELECT') AS have_select, * FROM sys.tables;

G. Habe ich die INSERT-Berechtigung für die SalesPerson-Tabelle in AdventureWorks?

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

Siehe auch

Verweis

sys.fn_builtin_permissions (Transact-SQL)
Sicherheitskatalogsichten (Transact-SQL)

Andere Ressourcen

Berechtigungen
Sicherungsfähige Elemente
Berechtigungshierarchie

Hilfe und Informationen

Informationsquellen für SQL Server 2005