2011-08-16 60 views
2

方案:我需要爲ASP.Net應用程序的審計人員創建報告。我有一個程序解析授權標記目錄中的web.config文件的XML,並創建一個報告,提供哪些用戶可以訪問站點結構中的哪個文件夾。該報告如下所示。SQL Group通過條件

用戶名,名字,姓氏,目錄,角色,訪問, LastLoginDate

enter image description here

問題:你可以從報告中看到一些目錄(與GISMO中間列在其中)顯示兩次,允許和拒絕用戶。我想知道是否有辦法以這樣的方式對結果進行分組,如果有一個允許目錄的行,那麼拒絕的不會顯示,但否則它們是。

或者,如果這可以在VB.net/C#中操作,那也是一個選項。它回到那裏並被輸入Excel電子表格。

任何幫助表示讚賞。提前致謝。

編輯:我應該說得更好。我仍然需要拒絕行來顯示用戶是否不被允許進入目錄。但是,如果他們被允許,那麼沒有任何一點顯示拒絕行。

+0

爲什麼不能加「那裏獲得=‘允許’」你查詢? – Ramy

+0

我應該備份......你的查詢是什麼樣的? – Ramy

+0

@雷米,請閱讀編輯我在我的解釋中不清楚。 – Gage

回答

1

像這樣的東西應該工作,但這個假定你的路並沒有如/目錄/目錄/,/目錄/目錄/,目錄/目錄/默認進入.aspx等。您最好的選擇是解析數據並刪除您創建的.NET流程級別的重複項,因爲在該階段解析通常更容易。

select derived.*, 
     case when exists 
     (select top 1 1 from table_name as t2 where t2.username = derived.username and t2.directory=derived.directory and t2.access = 'allow') then 1 else 0 end as is_allowed, 
     case when exists 
     (select top 1 1 from table_name as t2 where t2.username = derived.username and t2.directory=derived.directory and t2.access = 'deny') then 1 else 0 end as is_denied, 
from 
(
select distinct t.username, t.firstname, t.lastname, t.directory 
    from table_name as t 
) as derived 
4

這適用於Oracle數據庫,因此它應該可以在SQL Server上運行或關閉,因爲我知道SQL Server 支持CASE操作的主要組件。

CREATE TABLE user_permissions (
    user_role VARCHAR2(10) NOT NULL, 
    dir   VARCHAR2(10) NOT NULL, 
    user_access VARCHAR2(5) NOT NULL 
); 

INSERT INTO user_permissions VALUES ('admin', 'dir1', 'allow'); 
INSERT INTO user_permissions VALUES ('admin', 'dir2', 'allow'); 
INSERT INTO user_permissions VALUES ('power', 'dir1', 'allow'); -- Allow and Deny dir1 
INSERT INTO user_permissions VALUES ('power', 'dir1', 'deny'); 
INSERT INTO user_permissions VALUES ('power', 'dir2', 'deny'); 
COMMIT; 


SELECT UNIQUE j.* 
FROM (
     SELECT user_role, dir, 
       MAX(CASE user_access WHEN 'allow' THEN 1 ELSE 0 END) allowFlag, 
       MAX(CASE user_access WHEN 'deny' THEN 1 ELSE 0 END) denyFlag 
     FROM user_permissions 
     GROUP BY user_role, dir 
    ) t 
JOIN user_permissions j ON (t.user_role = j.user_role AND t.dir = j.dir) 
WHERE j.user_access = 'allow' OR (t.allowFlag = 0 and user_access = 'deny'); 

結果:

USER_ROLE DIR  USER_ACCESS 
---------- ---------- ----------- 
admin  dir1  allow  
admin  dir2  allow  
power  dir1  allow  
power  dir2  deny   

基本上,使用樞軸表的多個行聚合到單個行描述用於該目錄的屬性。一旦你有了聚合行,很容易比較你聲明的屬性加入你想要顯示的行。

+0

在SQL Server環境中,您不能使用UNIQUE,但可以使用DISTINCT。 –

2

如果你有SQL Server 2005或更新,您可以使用此:

with cte as (
    select ROW_NUMBER() OVER (partition by username, directory order by access) as row, * 
    from report 
) 
select * 
from cte 
where row = 1 

在分區子句,放在任何使「組」是唯一的。

參考: http://msdn.microsoft.com/en-us/library/ms190766.aspx

http://msdn.microsoft.com/en-us/library/ms186734.aspx

+0

您的意思是「通過Access訂購」嗎?我認爲這會更有意義。 –

+0

其實,你是對的,它可能是。改變。乾杯! –

1
SELECT UserName, Firstname, LastName, Directory, Roles, Access, LastLoginDate 
FROM Report R 
WHERE Access = 'allow' 
    OR (Access = 'deny' 
     AND NOT EXISTS 
     (SELECT * 
      FROM Report R2 
      WHERE R2.Directory = R.Directory 
      AND R2.UserName = R.UserName 
      AND R2.Roles = R.Roles 
     ) 
    ) 

根據您的意見,這條線應該被刪除,所以只有(UserName, Directory)組合檢查:

   AND R2.Roles = R.Roles