2017-10-02 9 views
0
나는이 문제는 2016 년

행 수준 보안

, 나는 주어진 행에 걸쳐 읽기 권한이 있어야 여러 사용자를 가질 수 SQL Server의 행 수준 보안을 구현하기 위해 노력하고, 언제 해요

나는 성능이 매우 매우 나 빠지게되는 술어에 복잡한 조건을 씁니다.

테이블의 한 열에 모든 사용자 이름을 유지하고 SYSTEM_USER을 검색하기 위해 술어에서 % LIKE %으로 검색하려고했지만 성능이 낮습니다. 하나 개의 로우 내 제어 테이블의 사용자 이름 열에서 값

예 :

CREATE FUNCTION fn_securitypredicate(@Usernames AS nvarchar(4000)) 
    RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    SELECT 1 as Result 
    WHERE @Usernames LIKE '%' + SYSTEM_USER + '%' 

2 초 50되었다으로 현재 실행 시간 : 여기

domain\john.wick;domain\red.eagle;domain\spartak.something....

내 함수 비서. 개선을위한 제안.

CREATE SECURITY POLICY [Policy] 
ADD FILTER PREDICATE [fn_securitypredicate]([Usernames]) 
ON [dbo].[Products]; 
+0

1. 코드 2를 게시하십시오. % ... %와 (과) 같이 어떤 성능을 얻을 수 있습니까? 정확히 일치 검색을 해보시겠습니까? – sepupic

+0

자세한 내용과 코드를 추가했습니다. –

+0

좋아, 내 질문은 여전히, 왜 당신은 정확한 일치를 사용하지 않습니다? WHERE @ Usernames = SYSTEM_USER ' – sepupic

답변

1

이것은 이전 팀에서 생각해 낸 해결책입니다.

사용자 테이블, 사용자 권한 테이블 및 제어 테이블의 권한 열이 필요합니다. 또한 사용자와의 확장을 위해 사용자 그룹 및 사용자 그룹 권한 테이블이 있어야합니다.

users     user_permissions   controlled_table 
+-----------+---------+ +---------+---------------+ +---------------+------+------+ 
| user_name | user_id | | user_id | permission_id | | permission_id | pk_1 | pk_2 | 
+-----------+---------+ +---------+---------------+ +---------------+------+------+ 
| admin  |  1 | |  1 |    0 | |    2 | 1 | 1 | 
| user1  |  2 | |  2 |    1 | |    2 | 1 | 2 | 
| user2  |  3 | |  2 |    2 | |    3 | 1 | 3 | 
| user3  |  4 | |  2 |    3 | |    4 | 2 | 1 | 
|   |   | |  2 |    4 | |    3 | 2 | 2 | 
|   |   | |  3 |    1 | |    1 | 2 | 3 | 
|   |   | |  3 |    2 | |    1 | 3 | 1 | 
|   |   | |  4 |    2 | |    5 | 3 | 2 | 
|   |   | |  4 |    3 | |    4 | 3 | 3 | 
|   |   | |  4 |    4 | |    2 | 4 | 1 | 
|   |   | |   |    | |    3 | 4 | 2 | 
|   |   | |   |    | |    3 | 4 | 3 | 
+-----------+---------+ +---------+---------------+ +---------------+------+------+ 

성능 향상을 위해 제어되는 테이블을 검색하는 데 사용한 색인에 permission_id를 추가 할 수 있습니다. 이렇게하면 나머지 열을 검색하는 동안 색인에 대한 권한에 가입 할 수 있습니다. 인덱스에 대한 자세한 내용은 실행 계획을 확인해야합니다.

+0

그렇지만 제어 된 테이블의 각 행에 대해 다른 테이블에서 선택 될 수 있음을 의미합니다. INNER JOIN을하는 것과 같습니다. 공정 속도가 너무 느려지고 있습니다. 내가 사용하는 저장 프로 시저에는 많은 집계가 있으며 프로 시저의 정상적인 실행이 2 초인 경우 3 분 50 초가되는 방식으로 제안됩니다. –