2013-10-07 4 views
6

개발중인 응용 프로그램의 사용 현황을 기록하려면 응용 프로그램을 사용하는 모든 사용자가 자신의 자격 증명으로 SQL Server 데이터베이스에 대한 쿼리를 실행해야합니다. 하지하기 위해다른 사용자를 IMPERSONATE 할 권한을 부여하는 방법?

은 로그인의 경우 그 짧은 창 과거 자신의 암호를 알고 수반하기 때문에, 내가 (사용자별로 연결을 생성 할 수없는 검색 가능한 방식으로 암호를 저장한다).

이 문제에 대한 (명백하지 않을 수도있는) 명백한 해결책은 모든 중요한 쿼리를 일반 "응용 프로그램"사용자로 실행하여 로그인 한 사용자를 가장하고 (로그인 한 사용자 만 연결하도록 요구하는 것입니다 사용자 이름은 ... 나쁜 일이 아닙니다.)

내 문제는 특정 역할의 모든 사용자 또는 일반적으로 모든 사용자에게 가장을 부여하는 방법이 확실하지 않다는 것입니다 (가장 좋은 아이디어는 아닙니다. 예를 들어, 앱이 sysadmin을 가장하는 것을 원하지 않기 때문입니다).).

grant impersonate on all to ApplicationLogin 

작동하지 않습니다 , 나는 그 행할 것 역할의 구성원에 가장을 부여하는 제안 찾을 수있는 문서 ...

어떤 아이디어가 없다?

+0

특정 역할은 데이터베이스 역할을 의미합니까? –

+0

정말 넓은 범위 일 수 있습니다. – Crisfole

+1

추가 정보^ – Crisfole

답변

0

동적 SQL을 사용할 수 있습니다. 아래 코드는 특정 역할과 관련된 모든 사용자를 가져온 다음 사용자에게 권한을 부여합니다. 응용 프로그램 로그인에 사용자를 만들어 데이터베이스와 연결 한 다음 특정 역할의 모든 구성원을 가장하도록 권한을 부여해야합니다.

CREATE TRIGGER S2 
ON DATABASE 
FOR CREATE_USER 
AS 

CREATE TABLE #T 
(PRINCIPAL_NAME NVARCHAR(100),ROLE_NAME NVARCHAR(100)); 
WITH L AS (SELECT * 
      FROM (SELECT P.name AS 'PRINCIPAL_NAME',R.role_principal_id AS 'GH' 
       FROM SYS.database_principals P,sys.database_role_members R 
       WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id 
       AND type<>'R') S INNER JOIN (SELECT P.name AS 'ROLE_NAME',P.principal_id AS 'GHA' 
               FROM SYS.database_principals P,sys.database_role_members R 
               WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id 
               AND type='R') D 
       ON D.GHA=S.GH) 
INSERT INTO #T 
SELECT DISTINCT PRINCIPAL_NAME,ROLE_NAME 
FROM L 
------------ ENTER ROLE NAME HERE 
WHERE ROLE_NAME LIKE '%%' 
------------ 
DECLARE @P NVARCHAR(100),@TEXT NVARCHAR(MAX)='' 
------------------------- CHANGE IT TO YOUR DESIRED NAME OF YOUR APPLICATION USER 
DECLARE @APPUSER NVARCHAR(100)='APPLICATION_USER' 
------------------------- 
DECLARE C CURSOR FOR SELECT PRINCIPAL_NAME FROM #T 
OPEN C 
FETCH NEXT FROM C INTO @P 
WHILE(@@FETCH_STATUS=0) 
    BEGIN 
     SET @TEXT+='GRANT IMPERSONATE ON USER::['[email protected]+'] TO '[email protected]+' ' 
     FETCH NEXT FROM C INTO @P 
    END 
CLOSE C 
DEALLOCATE C 
DROP TABLE #T 
EXEC(@TEXT) 

내가 당신을 위해 일 희망 : 이 코드입니다.

+0

아, 사용자가 추가되거나 제거되거나 변경 될 때마다 쿼리를 다시 실행하지 않아도되는 것을 의미합니다. – Crisfole

+0

dbms가 알아낼 수 있고 sth를 추가 할 수있는 메커니즘이 없습니다. 사용자. 하지만 사용자를 자주 추가하면 SQL Server 에이전트에이 코드를 추가하여 자주 또는 거의 매시간 수행 할 수 있습니다. 이 쿼리는 실행하기가 어렵지 않습니다. –

+0

찾았습니다.이 작업을 수행하려면 create use에서 트리거를 만들어야합니다. 나는 나의 포스트를 새롭게 할 것이다. –

0

저장 프로 시저를 통해 사용자를 만들 수 있습니다. 저장 프로 시저의 마지막 줄은 가장 (impersonation)을 부여하는 것입니다.

현재 사용자를 설정하려면 모든 사용자를 차례로 살펴보고 권한 부여 가장을 한 번 설정해야합니다.