gpt4 book ai didi

sql-server - 如何授予冒充任何其他用户的权限?

转载 作者:行者123 更新时间:2023-12-02 17:46:32 25 4
gpt4 key购买 nike

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

为了以可检索的方式存储他们的密码,我无法在每个用户的基础上创建连接(因为这需要在短暂的窗口后知道他们的密码)他们登录)。

解决此问题的看似显而易见的解决方案(可能不是最佳方案)是将所有敏感查询作为通用“应用程序”用户运行,模拟登录用户(要求我仅将登录用户与用户名...这不是一件坏事)。

我的问题是,我不确定如何向特定角色的所有用户或一般所有用户授予模拟权限(这不是最好的主意,因为我不希望应用程序模拟系统管理员) .

grant impersonate on all to ApplicationLogin

不起作用,而且我找不到任何文档表明可以对角色成员进行模拟...

有什么想法吗?

最佳答案

您可以使用动态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)

希望它对您有用。

关于sql-server - 如何授予冒充任何其他用户的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com