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.
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).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. Der Standardwert ist NULL.Hinweis In den Versionen von SQL Server bis SQL Server 2012 dürfen in untergeordneten sicherungsfähigen Elementen keine eckigen Klammern in der Form '[sub name]' verwendet werden. Verwenden Sie stattdessen 'sub name'.
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 AdventureWorks2012?
Im folgenden Beispiel wird von AdventureWorks2012 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('AdventureWorks2012.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)