如何授予任何其他用户的IMPERSONATE权限?

时间:2013-10-07 16:28:59

标签: sql-server tsql database-permissions

为了记录我正在开发的应用程序的使用情况,我需要每个使用我的应用程序的用户在他们自己的凭据下对我的SQL Server数据库执行查询。

为了以可检索的方式存储他们的密码,我不能在每个用户的基础上创建一个连接(因为这需要知道他们的密码通过简短的窗口时他们登录)。

这个看似很明显的解决方案(可能是次优的)是将所有敏感查询作为通用“应用程序”用户运行,冒充登录用户(要求我只关联登录用户)用户名......这不是坏事。)

我的问题是,我不知道如何授予冒充来的某个角色的所有用户,或一般的所有用户(不亮的想法,因为我不想让应用冒充系统管理员,例如)

grant impersonate on all to ApplicationLogin

不起作用,并且没有我能找到的文件表明授予角色成员模仿是可行的......

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用Dynamic 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::['+@P+'] TO '+@APPUSER+' '
        FETCH NEXT FROM C INTO @P
    END
CLOSE C
DEALLOCATE C
DROP TABLE #T
EXEC(@TEXT)

我希望它适合你。

答案 1 :(得分:0)

您可以通过存储过程创建用户。存储过程的最后一行是授予模拟。

要设置当前用户,您必须循环浏览所有用户,并将此次设置授予模拟。