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