Named user license報表是用來統計各類受權類型用戶數的,這裏來看看報表數據具體是如何來的。這是一個SSRS的報表,最主要的數據源是來自於類SysUserLicenseCountReport定義的RDP,在SysUserLicenseCountReport的方法processReport中使用SysUserLicenseMiner::fillUserLicenseCountTmpTbl()填充一個臨時表,最核心的部分就是這個方法:數據庫
public static void fillUserLicenseCountTmpTbl(SysUserLicenseCountTmp _userLicCountTblTmp, date _reportStateDate) { SysUserLicenseCount sulcTbl; SysUserLicenseList sullTbl; SecurityUserRole surTbl; SecurityRole rTbl; SysRoleLicenseType userRoleLicense; delete_from _userLicCountTblTmp; ttsbegin; while select validTimeState(_reportStateDate, _reportStateDate) * from sulcTbl outer join sullTbl outer join User, SecurityRole from surTbl join SecurityRole, UserLicenseType from userRoleLicense join RecId, Name from rTbl order by sulcTbl.UserLicenseType desc where (sulcTbl.RecId == sullTbl.SysUserLicenseCount && sullTbl.UserName == surTbl.User && userRoleLicense.SecurityRole ==surTbl.SecurityRole && rTbl.RecId == surTbl.SecurityRole) { _userLicCountTblTmp.UserLicenseType = sulcTbl.UserLicenseType; _userLicCountTblTmp.LicensedCount = sulcTbl.LicensedCount; _userLicCountTblTmp.ActualCount = sulcTbl.ActualCount; _userLicCountTblTmp.ValidFor = sulcTbl.ValidFrom; _userLicCountTblTmp.NetworkDomain =sullTbl.NetworkDomain; _userLicCountTblTmp.NetworkAlias =sullTbl.NetworkAlias; _userLicCountTblTmp.Username =sullTbl.UserName; _userLicCountTblTmp.SecurityRole = rTbl.Name; _userLicCountTblTmp.SecurityRoleLicenseType = userRoleLicense.UserLicenseType; _userLicCountTblTmp.insert(); } ttscommit; }
這裏用到好幾個表,SysUserLicenseCount保存的是四種用戶受權類型(枚舉UserLicenseType:Enterprise,Functional,Task,Self serve)相應的用戶數;SysUserLicenseList保存的是每一個用戶的受權記錄,其SysUserLicenseCount記錄的是表SysUserLicenseCount的recId;SecurityUserRole表不在AOT中,查看數據庫得知保存的是每一個用戶對應的Role,若是一個用戶被指定了多個Role,每一個Role在這表中對應一條記錄,列SecurityRole保存的是具體Role的ID;SecurityRole既不在AOT,連SQL數據庫中也沒有這個表,好在上面的代碼中能夠推測是AOT中全部Security roles的列表,這裏用到的只是Role的名稱;SysRoleLicenseType也不在AOT,可是在SQL數據庫中,重要的是SecurityRole和UserlicenseType兩個字段,前者記錄的是每種Role的ID,後者則是這個Role相應的用戶受權類型,每一個Role只有一種用戶受權類型。網絡
所以上面的代碼完成的就是構建一個臨時表來記錄每一個用戶的名稱、網絡別名、對應的每一個角色、角色對應的用戶受權類型、用戶受權類型的受權用戶數、用戶受權類型的當前使用數。須要注意的是角色「System administrator」和「System user」在表SysRoleLicenseType是沒有記錄的,若是一個用戶只有這兩種角色,這個用戶不會出如今報表中,可是System administrator仍然會佔用一個Enterprise受權,僅僅是System user是不會影響到受權數的。spa
運行報表老是獲得空白的結果,仔細查看發現上面的代碼中有一行是有問題的(R3 CU8的系統),「&& sullTbl.UserName == surTbl.User」,查看數據庫表SecurityUserRole,User一列實際上保存的是用戶的網絡別名,更改成「&& sullTbl.NetworkAlias == surTbl.User」後運行報表獲得結果,相似:code
還須要注意必須切換到DAT公司下才會有數據,用到的表SysUserLicenseCount等等是不保存公司信息的,按照個人理解應該無論在哪一個公司下都應該獲得相同的結果,可實際上只有切換到DAT公司報表纔有數據。 blog
接下來的問題相關表中的數據又是哪裏來的呢?在部署系統的時候系統會自動爲咱們建立一個名爲「Named user license count reports processing」的批處理任務,由它更新數據到這些表中,默認一週運行一次。這個批處理任務具體執行的是SysUserLicenseMiner類,run方法調用SysUserLicenseMiner::GenerateUserLicenseCountReportInfo(),咱們直接調用這個方法也是能夠更新受權數數據的。若是你在批處理列表中找不到這個job,能夠調用SysUserLicenseMiner::createBatchJob()爲你建立一個。而具體是如何更新的呢?答案天然也是在 SysUserLicenseMiner中,這裏就不翻代碼了,就別的地方看到的總結一下。AOT中打開一個Menu item,有兩個屬性是和受權相關的,ViewUserLicense和MaintainUserLicense,前者是查看須要的受權,後者是維護數據須要的受權,它們的值都是前面提到的枚舉UserLicenseType。SysUserLicenseMiner的工做就是遍歷全部Menu item,找出相應的用戶受權,接着遍歷用戶用戶角色,找出每一個用戶角色對應的用戶受權類型,最後遍歷每一個用戶,找出用戶的最高用戶受權類型(Enterprise最高)。因此問題的核心在於菜單項的用戶受權類型,若是咱們新建一個本身的菜單項會怎樣?默認ViewUserLicense和MaintainUserLicense都是NONE,是不影響受權數的,固然你能夠閒着沒事修改這兩個屬性成其餘數值。咱們能夠duplicate系統自帶的菜單項,而後修改這兩個屬性爲NONE,後面就不細說了。部署
最後要說的是這個報表的格式,不管我是否選中「show list of users per access license type 」結果都是同樣,Report的design也只有上面圖中的一個,有知道緣由的朋友請告訴我爲何...it