USE master
GO
IF EXISTS(
SELECT
*
FROM
sys.objects
WHERE
object_id=OBJECT_ID(N
'[dbo].[ufn_AuditReport]'
)
AND
type
in
(N
'FN'
,N
'IF'
,N
'TF'
,N
'FS'
,N
'FT'
))
DROP
FUNCTION
[dbo].[ufn_AuditReport]
GO
CREATE
FUNCTION
dbo.ufn_AuditReport
(@filepath
varchar
(1000))
RETURNS
@retAuditReport
TABLE
(
[session_id]
int
NULL
,
[server_principal_name] sysname
NOT
NULL
,
[ip] nvarchar(100)
NULL
,
[login_time] datetimeoffset(7)
NULL
,
[database_name] sysname
NOT
NULL
,
[action_time] datetimeoffset(7)
NULL
,
[tsql] nvarchar(4000)
NULL
)
AS
BEGIN
DECLARE
@tsl
TABLE
(RN
int
, session_id
int
, event_time datetime2, server_principal_name sysname,
Server_principal_id
int
, database_name sysname, statement nvarchar(4000))
DECLARE
@tlgls
TABLE
(RN
int
IDENTITY(1,1), event_time datetime2, additional_information nvarchar(4000))
INSERT
@tsl
SELECT
ROW_NUMBER() OVER(
ORDER
BY
event_time)
'RN'
,
Session_id,event_time,server_principal_name,server_principal_id,database_name,statement
FROM
sys.fn_get_audit_file(@filepath,
default
,
default
)
WHERE
action_id
IN
(
'SL'
)
DECLARE
@rid
INT
=1
DECLARE
@tslRN
INT
=(
SELECT
MAX
(RN)
FROM
@tsl)
WHILE @tslRN>=@rid
BEGIN
DECLARE
@session_id
int
=(
SELECT
session_id
FROM
@tsl
WHERE
RN=@rid)
DECLARE
@event_time datetime2=(
SELECT
event_time
FROM
@tsl
WHERE
RN=@rid)
DECLARE
@server_principal_id
int
=(
SELECT
server_principal_id
FROM
@tsl
WHERE
RN=@rid)
INSERT
@tlgls(event_time,additional_information)
SELECT
TOP
(1) event_time,additional_information
FROM
sys.fn_get_audit_file(@filepath,
default
,
default
)
WHERE
action_id=
'LGIS'
AND
session_id=@session_id
AND
server_principal_id=@server_principal_id
AND
event_time<@event_time
ORDER
BY
event_time
DESC
SET
@rid+=1
END
INSERT
@retAuditReport
SELECT
s.session_id, s.server_principal_name, (
CAST
(g.additional_information
AS
XML)).value(
'declare default element namespace "http://schemas.microsoft.com/sqlserver/2008/sqlaudit_data";(action_info/address)[1]'
,
'nvarchar(100)'
) N
'ip'
,
SWITCHOFFSET(
CAST
(g.event_time
AS
datetimeoffset),
'+08:00'
) N
'login_time'
,
s.database_name,
SWITCHOFFSET(
CAST
(s.event_time
AS
datetimeoffset),
'+08:00'
) N
'action_time'
,
s.statement N
'tsql'
FROM
@tsl s
INNER
JOIN
@tlgls g
ON
s.RN=g.RN
RETURN
END
;
GO