-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPROCESS_LOG_INSERT.sql
More file actions
113 lines (98 loc) · 2.72 KB
/
PROCESS_LOG_INSERT.sql
File metadata and controls
113 lines (98 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
--Процедура записи данных в таблицу логирования
CREATE OR ALTER PROC dbo.PROCESS_LOG_INSERT
@process_name varchar(255)
, @message nvarchar(255)
, @description nvarchar(4000) = null
, @date_start datetime = null
, @db_name varchar(255) = null
, @spid smallint = null
, @row_count int = null
, @params varchar(4000) = null
, @user_name nvarchar(128) = null
, @host_name nvarchar(128) = null
, @is_query_plan bit = 0
WITH EXECUTE AS 'dbo'
AS
BEGIN TRY
SET NOCOUNT ON;
--блок проверок
IF @user_name is null
SELECT @user_name = SUSER_SNAME();
IF @host_name is null
SELECT @host_name = HOST_NAME();
--/----------------------------------------/
--Сбор параметров, если не указаны (доработать)
IF @params is null
BEGIN
SET @params = '';
--SELECT @params = @params + [name] + ', '
--FROM sys.parameters
--WHERE object_id = OBJECT_ID(@process_name)
--;
END;
--/----------------------------------------/
--Поиск плана запроса, если установлен флаг
DECLARE @query_plan_xml xml;
IF @is_query_plan = 1 and @spid is not null
BEGIN
SELECT
--@CPU = er.cpu_time
--, @Duration = er.total_elapsed_time
--, @Reads = er.logical_reads
--, @Writes = er.writes
@query_plan_xml = qp.query_plan
FROM sys.dm_exec_requests AS er
CROSS APPLY sys.dm_exec_query_plan (er.plan_handle) AS qp
WHERE er.session_id = @spid
;
END
ELSE
SET @query_plan_xml = null;
--/----------------------------------------/
--Запись лога
IF @date_start is null
SELECT @date_start = getdate();
INSERT INTO dbo.PROCESS_LOG
(ProcessName, [Message], [Description], DateStart, DBName, SPID, [RowCount], Params, UserName, HostName, QueryPlan)
SELECT @process_name
, @message
, @description
, @date_start
, @db_name
, @spid
, @row_count
, @params
, @user_name
, @host_name
, @query_plan_xml
;
--/----------------------------------------/
END TRY
BEGIN CATCH
--если ошибка при записи, попробовать её записать
SELECT @description = TRY_CAST(t.error as nvarchar(4000))
FROM (
select ERROR_NUMBER() AS [@ErrorNumber]
, ERROR_SEVERITY() AS [@Severity]
, ERROR_STATE() AS [@ErrorState]
, ERROR_PROCEDURE() AS [@ErrorProcedure]
, ERROR_LINE() AS [@ErrorLine]
, ERROR_MESSAGE() AS [@ErrorMessage]
for xml path ('error')
) AS t(error)
;
SET @message = 'ERROR';
SET @db_name = DB_NAME();
SET @spid = @@SPID
INSERT INTO dbo.PROCESS_LOG
(ProcessName, [Message], [Description], DBName, SPID)
SELECT @process_name
, @message
, @description
, @db_name
, @spid
;
--/----------------------------------------/
THROW;
END CATCH
;