SELECT distinct([faultline].[MVMLive].[vwScan].[JobID])
,[faultline].[dbo].[Users].Name
,[faultline].[MVMLive].[vwScan].[ConfigurationName]
,[faultline].[MVMLive].[vwScan].[StartTime]
,[faultline].[MVMLive].[vwScan].[EndTime]
,STUFF((select ', '+(StartIPAddressIPv4+'-'+EndIPAddressIPv4) from [faultline].[MVMLive].[vwScannedIPRange]where JobID=5 for XML path('')),1,1,'')
FROM [faultline].[MVMLive].[vwScan]
left join [faultline].[dbo].[Jobs]on [faultline].[dbo].[Jobs].JobID= [faultline].[MVMLive].[vwScan].JobID
left join [faultline].[dbo].[Users]on [faultline].[dbo].[Jobs].UserID=[faultline].[dbo].[Users].UserID
left join [faultline].[MVMLive].[vwScannedIPRange] on [faultline].[MVMLive].[vwScannedIPRange].JobID=[faultline].[MVMLive].[vwScan].[JobID]
where [faultline].[MVMLive].[vwScan].JobID= 5
以上語句涉及到的知識點:
1.distinct 查詢結果去重功能。
2.聯合查詢left join, 聯合條件不一定必須是主表的,如 [faultline].[dbo].[Jobs].UserID=[faultline].[dbo].[Users].UserID。即是說,1、2、3,不一定非得,1-2和1-3的方式聯合,也可以是,1-2和2-3的聯合。
3.視圖和表的混用,[faultline].[MVMLive].[vwScannedIPRange]就是視圖,實際使用中發現視圖的執行需要額外的權限----相關的觸發器的權限,Fslong2IP,
4.爲特定的視圖、表、觸發器、存儲過程賦權的語句 grant execute/select on Fslong2IP to arcsight
5.stuff 函數的使用,字符替換。
視圖和觸發器的概念和關係:
視圖就是查詢結果,這個結果也是以表的形式展示的。觸發器是在執行增刪改等表的操作時,額外需要執行的一些動作。猜測上邊的Fslong2IP多半是一個將16進制存儲的IP轉換成字符串的函數,這個函數並不會顯式執行,
只有當需要獲得IP字符串的時候,纔會被調用執行,這也是爲什麼arcsight賬號沒有權限執行,需要單獨對這個觸發器賦權的原因。
---------------------2015/2/10 14:14 進過多次修改和優化後的實現---------------------------------------
use faultline
go
create view jobdesIPrange as
SELECT JobID,
cast((select StartIPAddressIPv4 +'-'+EndIPAddressIPv4+ ',' from [faultline].[MVMLive].[vwScannedIPRange] where JobID = A.jobid for XML PATH('')) as varchar(1000)) as iprange
from [faultline].[MVMLive].[vwScannedIPRange] A
group by jobid
cast--轉換爲字符串,而且指定了字符串的長度,否則默認只有30,查詢結果缺失。
xml path('')實現不同條目的統一字段的按條件拼接。有用到一種技巧,自連接條件,JobID = A.jobid。
use faultline
go
create view forsoccase as
SELECT [faultline].[MVMLive].[vwScan].[JobID]
,[faultline].[dbo].[Users].Name as UserName
,[faultline].[MVMLive].[vwScan].[ConfigurationName] as TaskName
,[faultline].[MVMLive].[vwScan].[StartTime]
,[faultline].[MVMLive].[vwScan].[EndTime]
,[faultline].[dbo].engines.serveraddress as ScanSource
,[faultline].[dbo].jobdesIPrange.iprange as ScanDestination
FROM [faultline].[MVMLive].[vwScan]
left join [faultline].[dbo].[Jobs]on [faultline].[dbo].[Jobs].JobID= [faultline].[MVMLive].[vwScan].JobID
left join [faultline].[dbo].[Users]on [faultline].[dbo].[Jobs].UserID=[faultline].[dbo].[Users].UserID
left join [faultline].[dbo].jobdesIPrange on [faultline].[dbo].jobdesIPrange.JobID=[faultline].[MVMLive].[vwScan].[JobID]
left join [faultline].[dbo].engines on [faultline].[MVMLive].[vwScan].[EngineName]=[faultline].[dbo].engines.name
where [faultline].[MVMLive].[vwScan].JobID > 0
use faultline
go
grant execute on Fslong2IP to arcsight
-------------------2015/2/13 11:26 -----------------------
由於系統時間是UTC 0的形式存儲於數據庫中,顯示的時間比正常時間少了8小時,修改對應字段。
,dateadd(hour,8,[faultline].[MVMLive].[vwScan].[StartTime]) StartTime
,dateadd (hour,8,[faultline].[MVMLive].[vwScan].[EndTime]) EndTime