Has_Perms_By_Name(Transact-SQL)
보안 개체에 대한 현재 사용자의 유효 사용 권한을 평가합니다.
구문
Has_perms_by_name (
securable ,
securable_class ,
permission
[ , sub-securable ]
[ , sub-securable_class ]
)
인수
- securable
보안 개체의 이름입니다. 보안 개체가 서버 자체인 경우 이 값은 NULL이어야 합니다. securable은 sysname 형식의 스칼라 식입니다. 기본값이 없습니다.
- securable_class
사용 권한을 테스트한 보안 개체 클래스의 이름입니다. securable_class는 nvarchar(60) 형식의 스칼라 식입니다.
- permission
확인할 사용 권한 이름을 나타내는 sysname 형식의 Null이 아닌 스칼라 식입니다. 기본값이 없습니다. 사용 권한 이름 ANY는 와일드카드입니다.
- sub-securable
사용 권한을 테스트한 보안 개체 하위 엔터티의 이름을 나타내는 sysname 형식의 선택적 스칼라 식입니다. 기본값은 NULL입니다.
- sub-securable_class
사용 권한을 테스트한 보안 개체 하위 엔터티의 클래스를 나타내는 nvarchar(60) 형식의 선택적 스칼라 식입니다. 기본값은 NULL입니다.
주의
이 기본 제공 함수는 현재 보안 주체에게 지정한 보안 개체에 대한 특정 유효 사용 권한이 있는지 여부를 테스트합니다. 유효 사용 권한은 다음 중 하나입니다.
- 보안 주체에게 직접 부여되고 거부되지 않은 사용 권한
- 보안 주체가 소유하는 더 높은 수준의 사용 권한에 포함되고 거부되지 않은 사용 권한
- 보안 주체가 멤버로 속한 역할이나 그룹에 부여되고 거부되지 않은 사용 권한
- 보안 주체가 멤버로 속한 역할이나 그룹이 소유하고 거부되지 않은 사용 권한
사용 권한은 항상 호출자의 보안 컨텍스트에서 평가됩니다. 다른 사용자에게 유효 사용 권한이 있는지 여부를 확인하려면 호출자에게 해당 사용자에 대한 IMPERSONATE 권한이 있어야 합니다.
스키마 수준 엔터티의 경우 한 부분, 두 부분 또는 세 부분으로 된 Null이 아닌 이름을 사용할 수 있습니다. 데이터베이스 수준 엔터티의 경우 한 부분으로 된 이름을 사용할 수 있으며 Null 값은 "현재 데이터베이스"를 나타냅니다. 서버 자체인 경우에는 Null 값("현재 서버"를 나타냄)이 필요합니다. 이 함수는 서버 수준 보안 주체가 생성되지 않은 Windows 사용자 또는 연결된 서버의 사용 권한을 확인할 수 없습니다.
다음 쿼리는 기본 제공 보안 개체 클래스의 목록을 반환합니다.
SELECT class_desc FROM sys.fn_builtin_permissions(default)
다음 데이터 정렬이 사용됩니다.
- 현재 데이터베이스 데이터 정렬 - 스키마에 포함되지 않은 보안 개체를 포함하는 데이터베이스 수준 보안 개체, 한 부분 또는 두 부분으로 된 스키마 범위 보안 개체, 세 부분으로 된 이름을 사용할 경우 대상 데이터베이스
- master 데이터베이스 데이터 정렬 - 서버 수준 보안 개체
- 열 수준 확인에는 'ANY'를 사용할 수 없습니다. 해당 사용 권한을 지정해야 합니다.
반환 형식
int
쿼리가 실패하는 경우 NULL을 반환합니다.
예
1. 서버 수준 VIEW SERVER STATE 권한이 있는지 확인
SELECT has_perms_by_name(null, null, 'VIEW SERVER STATE');
2. Ps 서버 보안 주체에 대한 IMPERSONATE 권한이 있는지 확인
SELECT has_perms_by_name('Ps', 'LOGIN', 'IMPERSONATE')
3. 현재 데이터베이스에서 사용 권한이 있는지 확인
SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')
4. 현재 데이터베이스에서 Pd 데이터베이스 보안 주체에 부여된 사용 권한 확인
호출자에게 Pd
보안 주체에 대한 IMPERSONATE 권한이 있다고 가정합니다.
EXECUTE AS user = 'Pd'
GO
SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')
GO
REVERT
GO
5. S 스키마에서 프로시저와 테이블을 만들 수 있는지 확인
다음 예에는 S
에 대한 ALTER
권한과 데이터베이스에 대한 CREATE PROCEDURE
권한이 필요합니다. 테이블의 경우에도 비슷합니다.
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. 어떤 테이블에 대해 SELECT 권한이 있는지 확인
SELECT has_perms_by_name(SCHEMA_NAME(schema_id) + '.' + name,
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables;
7. AdventureWorks의 SalesPerson 테이블에 대한 INSERT 권한이 있는지 확인
다음 예에서는 AdventureWorks
가 현재 데이터베이스 컨텍스트이고 두 부분으로 된 이름을 사용한다고 가정합니다.
SELECT has_perms_by_name('Sales.SalesPerson', 'OBJECT', 'INSERT')
다음 예에서는 현재 데이터베이스 컨텍스트에 대한 가정이 필요 없으며 세 부분으로 된 이름을 사용합니다.
SELECT has_perms_by_name('AdventureWorks.Sales.SalesPerson',
'OBJECT', 'INSERT')
8. T 테이블에서 어떤 열에 대해 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');
참고 항목
참조
sys.fn_builtin_permissions(Transact-SQL)
보안 카탈로그 뷰(Transact-SQL)