HAS_PERMS_BY_NAME(Transact-SQL)HAS_PERMS_BY_NAME (Transact-SQL)

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

보안 개체에 대한 현재 사용자의 유효 사용 권한을 평가합니다.Evaluates the effective permission of the current user on a securable. 연관된 함수는 fn_my_permissions입니다.A related function is fn_my_permissions.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax


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

인수Arguments

securablesecurable
보안 개체의 이름입니다.Is the name of the securable. 보안 개체가 서버 자체인 경우 이 값을 NULL로 설정해야 합니다.If the securable is the server itself, this value should be set to NULL. securablesysname 형식의 스칼라 식입니다.securable is a scalar expression of type sysname. 기본값은 없습니다.There is no default.

securable_classsecurable_class
사용 권한을 테스트한 보안 개체 클래스의 이름입니다.Is the name of the class of securable against which the permission is tested. securable_classnvarchar(60) 형식의 스칼라 식입니다.securable_class is a scalar expression of type nvarchar(60).

Azure SQL 데이터베이스Azure SQL Database에서 securable_class 인수는 DATABASE, OBJECT, ROLE, SCHEMA, USER 중 하나로 설정해야 합니다.In Azure SQL 데이터베이스Azure SQL Database, the securable_class argument must be set to one of the following: DATABASE, OBJECT, ROLE, SCHEMA, or USER.

permissionpermission
확인할 사용 권한 이름을 나타내는 sysname 형식의 Null이 아닌 스칼라 식입니다.A nonnull scalar expression of type sysname that represents the permission name to be checked. 기본값은 없습니다.There is no default. 사용 권한 이름 ANY는 와일드카드입니다.The permission name ANY is a wildcard.

sub-securablesub-securable
사용 권한이 테스트되는 대상 보안 개체 하위 엔터티의 이름을 나타내는 sysname 형식의 선택적 스칼라 식입니다.An optional scalar expression of type sysname that represents the name of the securable sub-entity against which the permission is tested. 기본값은 NULL입니다.The default is NULL.

참고

SQL ServerSQL Server ~ SQL Server 2017SQL Server 2017 버전에서는 하위 보안 개체에 '[sub name]' 형식의 대괄호를 사용할 수 없습니다.In versions of SQL ServerSQL Server through SQL Server 2017SQL Server 2017, sub-securables cannot use brackets in the form '[sub name]'. 대신 'sub name' 을 사용하세요.Use 'sub name' instead.

sub-securable_classsub-securable_class
사용 권한이 테스트되는 대상 보안 개체 하위 엔터티의 클래스를 나타내는 nvarchar(60) 형식의 선택적 스칼라 식입니다.An optional scalar expression of type nvarchar(60) that represent the class of securable subentity against which the permission is tested. 기본값은 NULL입니다.The default is NULL.

Azure SQL 데이터베이스Azure SQL Database에서 sub-securable_class 인수는 securable_class 인수가 OBJECT로 설정된 경우에만 유효합니다.In Azure SQL 데이터베이스Azure SQL Database, the sub-securable_class argument is valid only if the securable_class argument is set to OBJECT. securable_class 인수가 OBJECT로 설정된 경우 sub-securable_class 인수는 COLUMN으로 설정해야 합니다.If the securable_class argument is set to OBJECT, the sub-securable_class argument must be set to COLUMN.

반환 형식Return Types

intint

쿼리가 실패하면 NULL을 반환합니다.Returns NULL when the query fails.

RemarksRemarks

이 기본 제공 함수는 지정된 보안 개체에 대한 특정 유효 사용 권한이 현재 보안 주체에 있는지 여부를 테스트합니다.This built-in function tests whether the current principal has a particular effective permission on a specified securable. HAS_PERMS_BY_NAME은 사용자에게 보안 개체에 대한 유효 사용 권한이 있으면 1을 반환하고, 사용자에게 보안 개체에 대한 유효 사용 권한이 없으면 0을 반환하며, 보안 개체 클래스 또는 사용 권한이 유효하지 않으면 NULL을 반환합니다.HAS_PERMS_BY_NAME returns 1 when the user has effective permission on the securable, 0 when the user has no effective permission on the securable, and NULL when the securable class or permission is not valid. 유효 사용 권한은 다음 중 하나입니다.An effective permission is any of the following:

  • 보안 주체에게 직접 부여되고 거부되지 않은 사용 권한A permission granted directly to the principal, and not denied.

  • 보안 주체가 소유하는 더 높은 수준의 사용 권한에 포함되고 거부되지 않은 사용 권한A permission implied by a higher-level permission held by the principal and not denied.

  • 보안 주체가 멤버로 속한 역할이나 그룹에 부여되고 거부되지 않은 사용 권한A permission granted to a role or group of which the principal is a member, and not denied.

  • 보안 주체가 멤버로 속한 역할이나 그룹이 소유하고 거부되지 않은 사용 권한A permission held by a role or group of which the principal is a member, and not denied.

    사용 권한은 항상 호출자의 보안 컨텍스트에서 평가됩니다.The permission evaluation is always performed in the security context of the caller. 다른 사용자에게 유효 사용 권한이 있는지 여부를 확인하려면 해당 사용자에 대한 IMPERSONATE 권한이 호출자에게 있어야 합니다.To determine whether some other user has an effective permission, the caller must have IMPERSONATE permission on that user.

    스키마 수준 엔터티의 경우 한 부분, 두 부분 또는 세 부분으로 된 Null이 아닌 이름을 사용할 수 있습니다.For schema-level entities, one-, two-, or three-part nonnull names are accepted. 데이터베이스 수준 엔터티의 경우 한 부분으로 된 이름을 사용할 수 있으며 Null 값은 "현재 데이터베이스"를 나타냅니다.For database-level entities a one-part name is accepted, with a null value meaning "current database". 서버 자체인 경우에는 Null 값("현재 서버"를 나타냄)이 필요합니다.For the server itself, a null value (meaning "current server") is required. 이 함수로는 서버 수준 보안 주체가 생성되지 않은 Windows 사용자 또는 연결된 서버의 사용 권한을 확인할 수 없습니다.This function cannot check permissions on a linked server or on a Windows user for which no server-level principal has been created.

    다음 쿼리는 기본 제공 보안 개체 클래스의 목록을 반환합니다.The following query will return a list of built-in securable classes:

SELECT class_desc FROM sys.fn_builtin_permissions(default);  

사용되는 데이터 정렬은 다음과 같습니다.The following collations are used:

  • 현재 데이터베이스 데이터 정렬: 스키마에 포함되지 않은 보안 개체를 포함하는 데이터베이스 수준 보안 개체, 한 부분 또는 두 부분으로 된 스키마 범위 보안 개체, 세 부분으로 된 이름을 사용할 경우 대상 데이터베이스Current database collation: Database-level securables that include securables not contained by a schema; one- or two-part schema-scoped securables; target database when using a three-part name.

  • master 데이터베이스 데이터 정렬: 서버 수준 보안 개체master database collation: Server-level securables.

  • 열 수준 확인에는 'ANY'를 사용할 수 없습니다.'ANY' is not supported for column-level checks. 적절한 사용 권한을 지정해야 합니다.You must specify the appropriate permission.

Examples

1.A. 서버 수준 VIEW SERVER STATE 권한이 있는지 확인Do I have the server-level VIEW SERVER STATE permission?

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

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

2.B. Ps 서버 보안 주체에 대한 IMPERSONATE 권한이 있는지 확인Am I able to IMPERSONATE server principal Ps?

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

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

3.C. 현재 데이터베이스에서 사용 권한이 있는지 확인Do I have any permissions in the current database?

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

4.D. 현재 데이터베이스에서 Pd 데이터베이스 보안 주체에 부여된 사용 권한 확인Does database principal Pd have any permission in the current database?

Pd 보안 주체에 대한 IMPERSONATE 권한이 호출자에게 있다고 가정합니다.Assume caller has IMPERSONATE permission on principal Pd.

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

5.E. S 스키마에서 프로시저와 테이블을 만들 수 있는지 확인Can I create procedures and tables in schema S?

다음 예에는 ALTER에 대한 S 권한과 데이터베이스에 대한 CREATE PROCEDURE 권한이 필요합니다. 테이블의 경우에도 비슷합니다.The following example requires ALTER permission in S and CREATE PROCEDURE permission in the database, and similarly for tables.

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;  

6.F. 어떤 테이블에 대해 SELECT 권한이 있는지 확인Which tables do I have SELECT permission on?

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

7.G. AdventureWorks2012의 SalesPerson 테이블에 대한 INSERT 권한이 있는지 확인Do I have INSERT permission on the SalesPerson table in AdventureWorks2012?

다음 예에서는 AdventureWorks2012가 현재 데이터베이스 컨텍스트이고 두 부분으로 된 이름을 사용한다고 가정합니다.The following example assumes AdventureWorks2012 is my current database context, and uses a two-part name.

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

다음 예에서는 현재 데이터베이스 컨텍스트에 대한 가정을 하지 않고 세 부분으로 된 이름을 사용합니다.The following example makes no assumptions about my current database context, and uses a three-part name.

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

8.H. T 테이블의 어떤 열에 대해 SELECT 권한이 있는지 확인Which columns of table T do I have SELECT permission on?

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');  

참고 항목See Also

사용 권한(데이터베이스 엔진) Permissions (Database Engine)
Securables Securables
사용 권한 계층(데이터베이스 엔진) Permissions Hierarchy (Database Engine)
sys.fn_builtin_permissions(Transact-SQL) sys.fn_builtin_permissions (Transact-SQL)
보안 카탈로그 뷰(Transact-SQL)Security Catalog Views (Transact-SQL)