Bagikan melalui


HAS_PERMS_BY_NAME (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Mengevaluasi izin efektif pengguna saat ini pada yang dapat diamankan. Fungsi terkait fn_my_permissions.

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

Securable
Adalah nama yang dapat diamankan. Jika yang dapat diamankan adalah server itu sendiri, nilai ini harus diatur ke NULL. securable adalah ekspresi skalar dari jenis sysname. Tidak ada default.

securable_class
Adalah nama kelas yang dapat diamankan yang izinnya diuji. securable_class adalah ekspresi skalar jenis nvarchar(60).

Di Azure SQL Database, argumen securable_class harus diatur ke salah satu hal berikut ini: DATABASE, OBJECT, ROLE, SCHEMA, atau USER.

Izin
Ekspresi skalar nonnull dari jenis sysname yang mewakili nama izin yang akan diperiksa. Tidak ada default. Nama izin ANY adalah kartubebas.

sub-dapat diamankan
Ekspresi skalar opsional dari jenis sysname yang mewakili nama sub-entitas yang dapat diamankan tempat izin diuji. Defaultnya adalah NULL.

Catatan

Sub-securables tidak dapat menggunakan tanda kurung dalam formulir '[sub-nama]'. Gunakan 'sub nama' sebagai gantinya.

sub-securable_class
Ekspresi skalar opsional jenis nvarchar(60) yang mewakili kelas subentitas yang dapat diamankan tempat izin diuji. Defaultnya adalah NULL.

Di Azure SQL Database, argumen sub-securable_class hanya valid jika argumen securable_class diatur ke OBJECT. Jika argumen securable_class diatur ke OBJECT, argumen sub-securable_class harus diatur ke COLUMN.

Jenis Kembalian

int

Mengembalikan NULL saat kueri gagal.

Keterangan

Fungsi bawaan ini menguji apakah prinsipal saat ini memiliki izin efektif tertentu pada securable tertentu. HAS_PERMS_BY_NAME mengembalikan 1 ketika pengguna memiliki izin efektif pada yang dapat diamankan, 0 ketika pengguna tidak memiliki izin yang efektif pada yang dapat diamankan, dan NULL ketika kelas atau izin yang dapat diamankan tidak valid. Izin yang efektif adalah salah satu hal berikut:

  • Izin yang diberikan langsung kepada kepala sekolah, dan tidak ditolak.

  • Izin yang tersirat oleh izin tingkat yang lebih tinggi yang dipegang oleh prinsipal dan tidak ditolak.

  • Izin yang diberikan kepada peran atau grup yang utamanya adalah anggota, dan tidak ditolak.

  • Izin yang dipegang oleh peran atau grup yang utamanya adalah anggota, dan tidak ditolak.

Evaluasi izin selalu dilakukan dalam konteks keamanan pemanggil. Untuk menentukan apakah beberapa pengguna lain memiliki izin yang efektif, pemanggil harus memiliki izin IMPERSONATE pada pengguna tersebut.

Untuk entitas tingkat skema, nama nonnull satu, dua, atau tiga bagian diterima. Untuk entitas tingkat database, nama satu bagian diterima, dengan nilai null yang berarti "database saat ini". Untuk server itu sendiri, nilai null (yang berarti "server saat ini") diperlukan. Fungsi ini tidak dapat memeriksa izin pada server tertaut atau pada pengguna Windows yang tidak ada prinsipal tingkat server yang dibuat.

Kueri berikut akan mengembalikan daftar kelas bawaan yang dapat diamankan:

SELECT class_desc FROM sys.fn_builtin_permissions(default);  

Kolagasi berikut digunakan:

  • Kolase database saat ini: Keamanan tingkat database yang mencakup keamanan yang tidak terkandung oleh skema; pengamanan cakupan skema satu atau dua bagian; database target saat menggunakan nama tiga bagian.

  • kolatasi database master: Keamanan tingkat server.

  • 'ANY' tidak didukung untuk pemeriksaan tingkat kolom. Anda harus menentukan izin yang sesuai.

Contoh

J. Apakah saya memiliki izin STATUS VIEW SERVER tingkat server?

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru

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

B. Apakah saya dapat MENIRU Ps utama server?

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru

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

C. Apakah saya memiliki izin dalam database saat ini?

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

D. Apakah Pd utama database memiliki izin dalam database saat ini?

Asumsikan penelepon memiliki izin IMPERSONATE pada prinsipal Pd.

EXECUTE AS user = 'Pd'  
GO  
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');  
GO  
REVERT;  
GO  

E. Bisakah saya membuat prosedur dan tabel dalam skema S?

Contoh berikut memerlukan ALTER izin masuk S dan CREATE PROCEDURE izin dalam database, dan demikian pula untuk tabel.

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. Tabel mana yang memiliki izin SELECT?

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

G. Apakah saya memiliki izin INSERT pada tabel SalesPerson di AdventureWorks2022?

Contoh berikut mengasumsikan AdventureWorks2022 adalah konteks database saya saat ini, dan menggunakan nama dua bagian.

SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');  

Contoh berikut tidak membuat asumsi tentang konteks database saya saat ini, dan menggunakan nama tiga bagian.

SELECT HAS_PERMS_BY_NAME('AdventureWorks2022.Sales.SalesPerson',   
    'OBJECT', 'INSERT');  

H. Kolom tabel T mana yang memiliki izin 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');  

Lihat Juga

Izin (Mesin Database)
Securable
Hierarki Izin (Mesin Database)
sys.fn_builtin_permissions (T-SQL)
Tampilan Katalog Keamanan (Transact-SQL)