Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Vyhodnocuje efektivní oprávnění aktuálního uživatele na securable. Související funkcí je fn_my_permissions.
Syntaxe
HAS_PERMS_BY_NAME ( securable , securable_class , permission
[ , sub-securable ] [ , sub-securable_class ] )
Arguments
Zabezpečený
Je název pro sebe. Pokud je securable samotný server, měla by být tato hodnota nastavena na NULL.
securable je skalární výraz typového sysname. Neexistuje žádný výchozí stav.
securable_class
je název třídy zajišťovatelných látek, proti kterým je povolení testováno.
securable_class je skalární výraz typu nvarchar(60).
V Azure SQL Database musí být argument securable_class nastaven na jednu z následujících hodnot: DATABASE, OBJECT, ROLE,SCHEMA nebo USER.
povolení
Nenulový skalární výraz typu sysname , který reprezentuje oprávnění, které má být zkontrolováno. Neexistuje žádný výchozí stav. Jméno oprávnění ANY je žolík.
Pod-zajišťovatelné
Volitelný skalární výraz typu sysname , který reprezentuje název zabezpečené podentity, proti které je oprávnění testováno. Výchozí nastavení je NULL.
Poznámka:
Pod-zajišťovatelné předměty nemohou používat závorky ve tvaru '[podjméno]'. Použijte místo toho 'sub name' .
pod securable_class
Volitelný skalární výraz typu nvarchar(60), který reprezentuje třídu zabezpečených podentit, proti kterým je oprávnění testováno. Výchozí nastavení je NULL.
V Azure SQL Database je argument sub-securable_class platný pouze tehdy, pokud je argument securable_class nastaven na OBJECT. Pokud je argument securable_class nastaven na OBJECT, musí být argument sub-securable_class nastaven na COLUMN.
Návratové typy
int
Vrátí NULL, když dotaz selže.
Poznámky
Tato vestavěná funkce testuje, zda má aktuální principal konkrétní efektivní povolení k určenému securable. HAS_PERMS_BY_NAME vrátí 1, když má uživatel efektivní oprávnění k securable, 0, když uživatel nemá efektivní oprávnění k securable, a NULL, když securable třída nebo oprávnění není platná. Efektivní povolení je některá z následujících podmínek:
Povolení udělené přímo zmocniteli a nebylo zamítnuto.
Povolení naznačené vyšším povolením drženým zmocnitelem a nebylo zamítnuto.
Povolení udělené roli nebo skupině, jejímž je zmocněný členem, a není odepřeno.
Povolení držené rolí nebo skupinou, jejímž členem je zmocnělý subjekt, a není odepřeno.
Hodnocení oprávnění se vždy provádí v bezpečnostním kontextu volajícího. Aby bylo možné zjistit, zda má jiný uživatel efektivní oprávnění, musí volající mít na tomto uživateli oprávnění vydávat se za PŘEDSTÍRÁNÍ.
Pro entity na úrovni schématu jsou přijímány jednodílná, dvou- nebo třídílná nenulová jména. Pro entity na úrovni databáze je akceptováno jednočlenné jméno, přičemž nulová hodnota znamená "aktuální databáze". Pro samotný server je vyžadována nulová hodnota (tedy "aktuální server"). Tato funkce nemůže kontrolovat oprávnění na propojeném serveru ani u uživatele Windows, pro kterého nebyl vytvořen serverový princip.
Následující dotaz vrátí seznam vestavěných securable tříd:
SELECT class_desc FROM sys.fn_builtin_permissions(default);
Používají se následující kolace:
Aktuální třídění databází: Databázové zabezpečené objekty, které zahrnují zabezpečené předměty, které nejsou obsaženy v schématu; jedno- nebo dvoudílné schema-scoped securables; Cílová databáze při použití tříčlenného názvu.
Hlavní kolekce databáze: Serverové zabezpečené objekty.
"ANY" není podporováno pro kontroly na úrovni sloupců. Musíte uvést příslušné povolení.
Examples
A. Mám oprávnění ZOBRAZIT STAV SERVERU na úrovni serveru?
Platí na: SQL Server 2008 (10.0.x) a novější
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');
B. Mohu se vydávat za hlavního serverového Ps?
Platí na: SQL Server 2008 (10.0.x) a novější
SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');
C. Mám v aktuální databázi nějaká oprávnění?
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
D. Má databázový principal Pd nějaké oprávnění v aktuální databázi?
Předpokládejme, že volající má na principu Pdpovolení k PŘEDSTÍRÁNÍ .
EXECUTE AS user = 'Pd'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
GO
REVERT;
GO
E. Mohu vytvářet procedury a tabulky ve schématu S?
Následující příklad vyžaduje ALTER povolení do S databáze a CREATE PROCEDURE povolení v databázi, stejně jako pro tabulky.
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. Na kterých tabulkách mám povolení SELECT?
SELECT HAS_PERMS_BY_NAME
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables
G. Mám povolení VLOŽIT do tabulky SalesPerson v AdventureWorks2022?
Následující příklad předpokládá AdventureWorks2025 můj aktuální databázový kontext a používá dvoudílný název.
SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');
Následující příklad nepředpokládá mé současné databázové kontext a používá třídílný název.
SELECT HAS_PERMS_BY_NAME('AdventureWorks2022.Sales.SalesPerson',
'OBJECT', 'INSERT');
H. Na které sloupce tabulky T mám povolení SELECT?
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');
Viz také
Oprávnění (databázový stroj)
zabezpečitelných
Hierarchie oprávnění (databázový stroj)
sys.fn_vestavěná_oprávnění (Transact-SQL)
Zobrazení katalogu zabezpečení (Transact-SQL)