2013-10-07 74 views
6

爲了記錄我正在開發的應用程序的使用情況,我需要每個使用我的應用程序的用戶在他們自己的憑據下對我的SQL Server數據庫執行查詢。如何授予任何其他用戶的權限?

爲了而不是以可檢索的方式存儲它們的密碼,我不能在每個用戶的基礎上創建連接(因爲這需要在他們登錄時通過短窗口知道他們的密碼)。

對這個問題(這可能是次優的)看似明顯的解決方案是將所有敏感查詢作爲通用「應用程序」用戶運行,模擬登錄用戶(要求我只關聯登錄用戶用用戶名......這不是一件壞事)。

我的問題是,我不知道如何授予給某個角色的所有用戶或一般所有用戶模擬(不是最明智的想法,因爲我不希望模擬系統管理員的應用程序,例如)。

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可以找到並做有關添加用戶。但如果您頻繁添加用戶,則可以將此代碼添加到SQL Server代理,以便頻繁或幾乎每小時執行一次。這個查詢並不是很重要的。 –

+0

我發現它你應該創建一個觸發器創建使用來做到這一點。我會更新我的帖子。 –

0

您可以通過存儲過程創建用戶。存儲過程的最後一行是授予模擬。

要設置當前用戶,您必須遍歷所有用戶並設置授權模擬一次。