AnP/SQLServer/AnP.07.logs.server.sql
2026-07-13 07:51:35 +02:00

190 lines
6.8 KiB
Transact-SQL

use AnP
if object_id(N'dbo.logs_tables_drop', N'P') is not null drop procedure dbo.logs_tables_drop
go
create procedure dbo.logs_tables_drop as begin set nocount on
if object_id(N'dbo.Exceptions', N'U') is not null drop table dbo.Exceptions
if object_id(N'dbo.Logs', N'U') is not null drop table dbo.Logs
if object_id(N'dbo.Errors', N'U') is not null drop table dbo.Errors
if object_id(N'dbo.Data', N'U') is not null drop table dbo.Data
end
go
if object_id(N'dbo.logs_tables_create', N'P') is not null drop procedure dbo.logs_tables_create
go
create procedure dbo.logs_tables_create as begin set nocount on
if object_id(N'dbo.Data', N'U') is null create table dbo.[Data](
id integer not null identity(1, 1),
[hash] varbinary(32) not null,
[data] varchar(max) not null,
date_in datetime not null constraint df_parameters_date_in default getdate(),
date_out datetime,
constraint pk_parameters primary key clustered(id),
constraint uq_parameters_name unique (name asc) with (fillfactor = 90),
constraint uq_parameters_hash unique (hash asc) with (fillfactor = 90),
constraint ck_parameters_name check ([name] not like '%[^a-zA-Z0-9_]%' and [name] like '[a-zA-Z_]%')
)
if object_id(N'dbo.Errors', N'U') is null create table dbo.Errors(
id integer not null identity(1, 1),
[error] varchar(max) not null,
date_in datetime not null constraint df_errors_date_in default getdate(),
date_out datetime,
constraint pk_errors primary key clustered(id),
constraint uq_errors_name unique (name asc) with (fillfactor = 90),
constraint ck_errors_name check ([name] not like '%[^a-zA-Z0-9_]%' and [name] like '[a-zA-Z_]%')
)
if object_id(N'dbo.Logs', N'U') is null create table dbo.Logs(
id integer not null identity(1, 1),
[session] integer not null,
[procedure] integer not null,
parameters integer not null,
error integer not null,
date_in datetime not null constraint df_logs_date_in default getdate(),
date_out datetime,
constraint pk_logs primary key clustered(id),
constraint fk_logs_session foreign key([session]) references dbo.Sessions(id)
on update no action
on delete no action,
constraint fk_logs_procedure foreign key([procedure]) references dbo.Procedures(id)
on update no action
on delete no action,
constraint fk_logs_parameters foreign key(parameters) references dbo.[Data](id)
on update no action
on delete no action,
constraint fk_logs_errors foreign key(errors) references dbo.Errors(id)
on update no action
on delete no action
)
if object_id(N'dbo.Exceptions', N'U') is null create table dbo.Exceptions(
id integer not null identity(1, 1),
[session] integer not null,
[procedure] integer not null,
parameters integer not null,
error integer not null,
[message] integer not null,
[status] varchar(16) not null,
code integer not null,
date_in datetime not null constraint df_exceptions_date_in default getdate(),
date_out datetime,
constraint pk_exceptions primary key clustered(id),
constraint fk_exceptions_session foreign key([session]) references dbo.Sessions(id)
on update no action
on delete no action,
constraint fk_exceptions_procedure foreign key([procedure]) references dbo.Procedures(id)
on update no action
on delete no action,
constraint fk_exceptions_parameters foreign key(parameters) references dbo.[Data](id)
on update no action
on delete no action,
constraint fk_logs_errors foreign key(errors) references dbo.Errors(id)
on update no action
on delete no action,
constraint fk_logs_message foreign key([message]) references dbo.[Data](id)
on update no action
on delete no action
)
end
go
if object_id(N'dbo.data_get_id', N'P') is not null drop procedure dbo.data_get_id
go
create procedure dbo.data_get_id (
@data varchar(max),
@id integer output
) as begin set nocount on
declare @hash varbinary(64) = hashbytes(dbo.get_settings('data_hash_algorithm', 'SHA2_512'), @data)
set @id = (select top 1 id from dbo.[Data] where date_out is null and [hash] = @hash)
if @id is null begin
insert into dbo.[Data] ([hash], [data]) values (@hash, @data)
set @id = scope_identity()
end
end
go
if object_id(N'dbo.error_get_id', N'P') is not null drop procedure dbo.error_get_id
go
create procedure dbo.error_get_id (
@error varchar(max),
@id integer output
) as begin set nocount on
set @id = (select top 1 id from dbo.Errors where date_out is null and error = @error)
if @id is null begin
insert into dbo.Errors (error) values (@error)
set @id = scope_identity()
end
end
go
if object_id(N'dbo.exceptions_set', N'P') is not null drop procedure dbo.exceptions_set
go
create procedure dbo.exceptions_set(
@procedure integer,
@session integer,
@parameters varchar(max),
@error varchar(512)
) as begin set nocount on
declare @paramaters_id integer
declare @error_id integer
declare @message varchar(max) = error_message()
declare @state varchar(16) = error_state()
declare @code integer = error_number()
declare @message_id integer
if @parameters is null set @parameters = ''
if @error is null set @error = ''
execute dbo.data_get_id @parameters, @paramaters_id output
execute dbo.error_get_id @error, @error_id output
execute dbo.data_get_id @message, @message_id output
insert into dbo.Exceptions([procedure], [session], [parameters], [error], [message], [state], [code]) values
(@procedure, @session, @paramaters_id, @error_id, @message_id, @state, @code)
end
go
if object_id(N'dbo.logs_set', N'P') is not null drop procedure dbo.logs_set
go
create procedure dbo.logs_set(
@procedure integer,
@session integer,
@parameters varchar(max),
@error varchar(512),
@level integer = 1
) as begin set nocount on
declare @levels integer = dbo.settings_get_int('logs_levels', null, 15)
if @levels & @level != 0 begin
declare @paramaters_id integer
declare @error_id integer
if @parameters is null set @parameters = ''
if @error is null set @error = ''
execute dbo.data_get_id @parameters, @paramaters_id output
execute dbo.error_get_id @error, @error_id output
insert into dbo.Logs([procedure], [session], [parameters], error) values
(@procedure, @session, @paramaters_id, @error_id)
end
end
go