diff --git a/MD/doc/es/db.md b/MD/doc/es/db.md new file mode 100644 index 0000000..9c8ccc5 --- /dev/null +++ b/MD/doc/es/db.md @@ -0,0 +1,34 @@ +# Base de datos + +```mermaid +erDiagram + +Common{ + integer id PK "not null" + integer procedure FK "not null Procedures" + integer session FK "not null Sessions" + datetime date_in "CK not null default now()" + datetime date_out +} + +_Common{ + integer id PK "not null" + integer register FK "not null Entity" + integer procedure FK "not null Procedures" + integer session FK "not null Sessions" + datetime date_in "CK not null default now()" + datetime date_out +} + +Databases{ + varchar(64) name UK "CK not null" +} + +Procedures{ + integer database FK,UK "not null Database" + varchar(64) name UK "CK not null" +} + +Databases ||--|{ Procedures : is + +``` \ No newline at end of file diff --git a/SQLServer/AnP.01.base.server.sql b/SQLServer/AnP.01.base.server.sql new file mode 100644 index 0000000..c16a38f --- /dev/null +++ b/SQLServer/AnP.01.base.server.sql @@ -0,0 +1,118 @@ +if (select top 1 0 from sys.databases where name = 'AnP') is null create database AnP collate Latin1_General_100_CI_AS_SC_UTF8 +go +use AnP + +if object_id(N'dbo.common_tables_drop', N'P') is not null drop procedure dbo.common_tables_drop +go +create procedure dbo.common_tables_drop as begin set nocount on + + if object_id(N'dbo.Procedures', N'U') is not null drop table dbo.Procedures + if object_id(N'dbo.Databases', N'U') is not null drop table dbo.Databases + +end +go + +if object_id(N'dbo.common_tables_create', N'P') is not null drop procedure dbo.common_tables_create +go +create procedure dbo.common_tables_create as begin set nocount on + + declare @table_names varchar(max) = '' + + if object_id(N'dbo.HistoryModes', N'U') is null begin + create table dbo.HistoryModes( + id integer not null identity(1, 1), + [name] varchar(16) not null, + [description] varchar(512), + date_in datetime2 not null constraint df_history_modes_date_in default getdate(), + date_out datetime2, + constraint pk_history_modes primary key clustered(id), + constraint uq_history_modes_name unique nonclustered ([name] asc) with (fillfactor = 90), + constraint ck_history_modes_name check ([name] not like '%[^a-zA-Z0-9_]%' and [name] like '[a-zA-Z_]%') + ) + insert into dbo.HistoryModes([name]) values('insert'), ('update'), ('delete'), ('unknown') + end + + if object_id(N'dbo.Databases', N'U') is null create table dbo.Databases( + id integer not null identity(1, 1), + [name] varchar(32) not null, + [description] varchar(512), + date_in datetime2 not null constraint df_databases_date_in default getdate(), + date_out datetime2, + constraint pk_databases primary key clustered(id), + constraint uq_databases_name unique nonclustered ([name] asc) with (fillfactor = 90), + constraint ck_databases_name check ([name] not like '%[^a-zA-Z0-9_]%' and [name] like '[a-zA-Z_]%') + ) + + if object_id(N'dbo.Procedures', N'U') is null create table dbo.Procedures( + id integer not null identity(1, 1), + [database] integer not null, + [name] varchar(32) not null, + [description] varchar(512), + date_in datetime2 not null constraint df_procedures_date_in default getdate(), + date_out datetime2, + constraint pk_procedures primary key clustered(id), + constraint fk_procedures_database foreign key([database]) references dbo.Databases(id) + on update no action + on delete no action, + constraint uq_procedures_name unique nonclustered ([database] asc, [name] asc) with (fillfactor = 90), + constraint ck_procedures_name check ([name] not like '%[^a-zA-Z0-9_]%' and [name] like '[a-zA-Z_]%') + ) + +end +go + +if object_id(N'dbo.procedure_get_id', N'P') is not null drop procedure dbo.procedure_get_id +go +create procedure dbo.procedure_get_id ( + @database varchar(32), + @name varchar(32), + @id integer output +) as begin set nocount on + + declare @database_id integer = (select id from dbo.Databases where [name] = @database) + + if @database_id is null begin + insert into dbo.Databases ([name]) values (@database) + set @database_id = scope_identity() + end + + set @id = (select id from dbo.Procedures where [database] = @database_id and [name] = @name) + + if @id is null begin + insert into dbo.Procedures ([database], [name]) values (@database_id, @name) + set @id = scope_identity() + end + +end +go + +execute dbo.common_tables_drop +execute dbo.common_tables_create + +if object_id(N'dbo.bw', N'FN') is not null drop function dbo.bw +go +create function dbo.bw( + @number bigint, + @bits smallint +) returns bigint begin + return (case + when @bits > 0 then @number * power(cast(2 as bigint), @bits) + when @bits < 0 then @number / power(cast(2 as bigint), -@bits) + else @number end) +end +go + +if object_id(N'dbo.history_mode_get', N'P') is not null drop procedure dbo.history_mode_get +go +create procedure dbo.history_mode_get( + @insert integer output, + @update integer output, + @delete integer output, + @unknown integer output +) as begin set nocount on + set @insert = (select top 1 id from dbo.HistoryModes where [name] = 'insert') + set @update = (select top 1 id from dbo.HistoryModes where [name] = 'update') + set @delete = (select top 1 id from dbo.HistoryModes where [name] = 'delete') + set @unknown = (select top 1 id from dbo.HistoryModes where [name] = 'unknown') +end +go \ No newline at end of file diff --git a/SQLServer/AnP.02.users.server.sql b/SQLServer/AnP.02.users.server.sql new file mode 100644 index 0000000..ff5d50c --- /dev/null +++ b/SQLServer/AnP.02.users.server.sql @@ -0,0 +1,120 @@ +use AnP + +if object_id(N'dbo.users_tables_remove', N'P') is not null drop procedure dbo.users_tables_remove +go +create procedure dbo.users_tables_remove as begin set nocount on + if object_id(N'dbo._Users', N'U') is not null drop table dbo._Users + if object_id(N'dbo.Users', N'U') is not null drop table dbo.Users +end +go + +if object_id(N'dbo.users_tables_create', N'P') is not null drop procedure dbo.users_tables_create +go +create procedure dbo.users_tables_create as begin set nocount on + + if object_id(N'dbo.Users', N'U') is null create table dbo.Users( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + nick varchar(32) not null, + [password] varbinary(64) not null, + accessible bit not null constraint df_users_accessible default 1, + date_in datetime2 not null constraint df_users_date_in default getdate(), + date_out datetime2, + constraint pk_users primary key clustered(id), + constraint fk_users_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint uq_users_nick unique(nick) with(fillfactor = 90), + constraint ck_users_nick check(nick != '' and nick not like '%[^a-zA-Z0-9_]%' and nick not like '[^a-zA-Z_]%'), + constraint ck_users_password check(datalength([password]) > 0) + ) + + if object_id(N'dbo._Users', N'U') is null create table dbo._Users( + id integer not null identity(1, 1), + mode integer not null, + entity integer not null, + [procedure] integer not null, + [session] integer not null, + nick varchar(32) not null, + [password] varbinary(64) not null, + accessible bit not null, + date_in datetime2 not null, + date_out datetime2, + history_date datetime2 not null constraint df__users_history_in default sysutcdatetime(), + constraint pk__users primary key clustered(id), + constraint fk__users_mode foreign key(mode) references dbo.HistoryModes(id) + on update no action + on delete no action, + constraint fk__users_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + index ix__users_history nonclustered(entity, history_date) + ) + +end +go + +execute dbo.users_tables_create + +if object_id(N'dbo.users_tables_upgrade', N'P') is not null drop procedure dbo.users_tables_upgrade +go +create procedure dbo.users_tables_upgrade as begin set nocount on + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = 'Users' and + constraint_name = 'fk_users_session' + ) is null alter table dbo.Users add constraint fk_users_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = '_Users' and + constraint_name = 'fk__users_session' + ) is null alter table dbo._Users add constraint fk__users_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + +end +go + +if object_id(N'dbo.users_trigger', N'TR') is not null drop trigger dbo.users_trigger +go +create trigger dbo.users_trigger on dbo.Users for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._Users(mode, entity, [procedure], [session], nick, [password], accessible, date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.nick, inserted.[password], inserted.accessible, inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.nick != deleted.nick or + inserted.[password] != deleted.[password] or + inserted.accessible != deleted.accessible or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._Users(mode, entity, [procedure], [session], nick, [password], accessible, date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.nick, inserted.[password], inserted.accessible, inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._Users(mode, entity, [procedure], [session], nick, [password], accessible, date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.nick, deleted.[password], deleted.accessible, deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go \ No newline at end of file diff --git a/SQLServer/AnP.03.ips.server.sql b/SQLServer/AnP.03.ips.server.sql new file mode 100644 index 0000000..6e463a8 --- /dev/null +++ b/SQLServer/AnP.03.ips.server.sql @@ -0,0 +1,125 @@ +use AnP + +if object_id(N'dbo.ips_tables_remove', N'P') is not null drop procedure dbo.ips_tables_remove +go +create procedure dbo.ips_tables_remove as begin set nocount on + if object_id(N'dbo._Ips', N'U') is not null drop table dbo._Ips + if object_id(N'dbo.Ips', N'U') is not null drop table dbo.Ips +end +go + +if object_id(N'dbo.ips_tables_create', N'P') is not null drop procedure dbo.ips_tables_create +go +create procedure dbo.ips_tables_create as begin set nocount on + + if object_id(N'dbo.Ips', N'U') is null create table dbo.Ips( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer, + [address] varchar(39) not null, + accessible bit not null constraint df_ips_accessible default 1, + date_in datetime not null constraint df_ips_date_in default getdate(), + date_out datetime, + constraint pk_ips primary key clustered(id), + constraint fk_ips_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint uq_ips_ip unique(ip) with(fillfactor = 90), + constraint ck_ips_ip check(( + [ip] like '%._%._%._%' and + [ip] not like '%[^0-9.]%' and + len([ip]) - len(replace([ip], '.', '')) = 3 and + parsename([ip], 1) between 0 and 255 and + parsename([ip], 2) between 0 and 255 and + parsename([ip], 3) between 0 and 255 and + parsename([ip], 4) between 0 and 255 + ) or ( + [ip] not like '%[^0-9a-fA-F:]%' and + [ip] like '%:%' and + [ip] not like '%:::%' and + [ip] not like '%[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]%' and + len([ip]) - len(replace([ip], ':', '')) between 2 and 7 + )) + ) + + if object_id(N'dbo._Ips', N'U') is null create table dbo._Ips( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [session] integer, + [address] varchar(39) not null, + accessible bit not null, + date_in datetime not null, + date_out datetime, + history_date datetime2 not null constraint df__ips_history_in default sysutcdatetime(), + constraint pk__ips primary key clustered(id), + constraint fk_ips_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action + ) + +end +go + +execute dbo.ips_tables_create + +if object_id(N'dbo.ips_tables_upgrade', N'P') is not null drop procedure dbo.ips_tables_upgrade +go +create procedure dbo.ips_tables_upgrade as begin set nocount on + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = 'Ips' and + constraint_name = 'fk_ips_session' + ) is null alter table dbo.Ips add constraint fk_ips_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = '_Ips' and + constraint_name = 'fk__ips_session' + ) is null alter table dbo._Ips add constraint fk__ips_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + +end +go + +if object_id(N'dbo.ips_trigger', N'TR') is not null drop trigger dbo.ips_trigger +go +create trigger dbo.ips_trigger on dbo.Ips for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._Ips(mode, entity, [procedure], [session], [address], accessible, date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[address], inserted.accessible, inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[address] != deleted.[address] or + inserted.accessible != deleted.accessible or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._Ips(mode, entity, [procedure], [session], [address], accessible, date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[address], inserted.accessible, inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._Ips(mode, entity, [procedure], [session], [address], accessible, date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[address], deleted.accessible, deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go \ No newline at end of file diff --git a/SQLServer/AnP.04.sessions.server.sql b/SQLServer/AnP.04.sessions.server.sql new file mode 100644 index 0000000..b2fddb1 --- /dev/null +++ b/SQLServer/AnP.04.sessions.server.sql @@ -0,0 +1,190 @@ +use AnP + +if object_id(N'dbo.users_tables_remove', N'P') is not null drop procedure dbo.users_tables_remove +go +create procedure dbo.users_tables_remove as begin set nocount on + if object_id(N'dbo._Sessions', N'U') is not null drop table dbo._Sessions + if object_id(N'dbo.SessionsActived', N'U') is not null drop table dbo.SessionsActived + if object_id(N'dbo.Sessions', N'U') is not null drop table dbo.Sessions +end +go + +if object_id(N'dbo.users_tables_create', N'P') is not null drop procedure dbo.users_tables_create +go +create procedure dbo.users_tables_create as begin set nocount on + + if object_id(N'dbo.Sessions', N'U') is null create table dbo.Sessions( + id integer not null identity(1, 1), + [procedure] integer not null, + [user] integer not null, + [ip] integer not null, + date_last integer not null constraint df_sessions_date_last default getdate(), + date_in datetime not null constraint df_sessions_date_in default getdate(), + date_out datetime, + constraint pk_sessions primary key clustered(id), + constraint fk_sessions_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_sessions_user foreign key([user]) references dbo.Users(id) + on update no action + on delete no action, + constraint fk_sessions_ip foreign key([ip]) references dbo.Ips(id) + on update no action + on delete no action + ) + + if object_id(N'dbo.SessionsActived', N'U') is null create table dbo.SessionsActived( + id integer not null, + [procedure] integer not null, + [user] integer not null, + [ip] integer not null, + date_last integer not null constraint df_sessions_date_last default getdate(), + date_in datetime not null constraint df_sessions_date_in default getdate(), + [timeout] integer not null constraint df_sessions_timeout default 300, + constraint pk_sessions primary key clustered(id), + constraint fk_sessions_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_sessions_user foreign key([user]) references dbo.Users(id) + on update no action + on delete no action, + constraint fk_sessions_ip foreign key([ip]) references dbo.Ips(id) + on update no action + on delete no action + ) + + if object_id(N'dbo._Sessions', N'U') is null create table dbo._Sessions( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [user] integer not null, + [ip] integer not null, + date_last integer not null, + date_in datetime not null, + date_out datetime, + history_date datetime2 not null constraint df__sessions_history_in default sysutcdatetime(), + constraint pk__sessions primary key clustered(id), + constraint fk__sessions_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__sessions_user foreign key([user]) references dbo.Users(id) + on update no action + on delete no action, + constraint fk__sessions_ip foreign key([ip]) references dbo.Ips(id) + on update no action + on delete no action + ) + +end +go + +if object_id(N'dbo.users_tables_upgrade', N'P') is not null drop procedure dbo.users_tables_upgrade +go +create procedure dbo.users_tables_upgrade as begin set nocount on + execute dbo.users_tables_upgrade + execute dbo.ips_tables_upgrade +end +go + +execute dbo.users_tables_create + +if object_id(N'dbo.sessions_actived_trigger', N'TR') is not null drop trigger dbo.sessions_actived_trigger on dbo.SessionsActived +go +create trigger dbo.sessions_actived_trigger on dbo.SessionsActived after insert, update, delete as begin set nocount on + + -- Updates. + update sessions set + sessions.[procedure] = inserted.[procedure], + sessions.[user] = inserted.[user], + sessions.[ip] = inserted.[ip], + sessions.date_last = inserted.date_last, + sessions.date_in = inserted.date_in + from inserted inserted + join dbo.Sessions sessions on inserted.id = sessions.id + join deleted deleted on inserted.id = deleted.id + + -- Inserts. + insert into dbo.Sessions(id, [procedure], [user], [ip], date_last, date_in) + select inserted.id, inserted.[procedure], inserted.[user], inserted.[ip], inserted.date_last, inserted.date_in + from inserted inserted + left join dbo.Sessions sessions on inserted.id = sessions.id + left join deleted deleted on inserted.id = deleted.id + where sessions.id is null and deleted.id is null + + -- Deletes. + update sessions set + sessions.[procedure] = deleted.[procedure], + sessions.[user] = deleted.[user], + sessions.[ip] = deleted.[ip], + sessions.date_last = deleted.date_last, + sessions.date_in = deleted.date_in, + sessions.date_out = getdate() + from deleted deleted + join dbo.Sessions sessions on deleted.id = sessions.id + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + + -- Deletes unexistent. + insert into dbo.Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out) + select deleted.id, deleted.[procedure], deleted.[user], deleted.[ip], deleted.date_last, deleted.date_in, getdate() + from deleted deleted + left join dbo.Sessions sessions on deleted.id = sessions.id + left join inserted inserted on deleted.id = inserted.id + where sessions.id is null and inserted.id is null + +end +go + +if object_id(N'dbo.sessions_trigger', N'TR') is not null drop trigger dbo.sessions_trigger on dbo.Sessions +go +create trigger dbo.sessions_trigger on dbo.Sessions after insert, update, delete as begin set nocount on + + -- Update. + insert into dbo._Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out) + select inserted.id, inserted.[procedure], inserted.[user], inserted.[ip], inserted.date_last, inserted.date_in, null + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where ( + inserted.[procedure] != deleted.[procedure] or + inserted.[user] != deleted.[user] or + inserted.[ip] != deleted.[ip] or + inserted.date_last != deleted.date_last or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + ) and not ( + inserted.[procedure] = deleted.[procedure] and + inserted.[user] = deleted.[user] and + inserted.[ip] = deleted.[ip] and + inserted.date_last != deleted.date_last and + inserted.date_in = deleted.date_in and + isnull(inserted.date_out, '0001-01-01') = isnull(deleted.date_out, '0001-01-01') + ) + + -- Insert. + insert into dbo._Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out) + select inserted.id, inserted.[procedure], inserted.[user], inserted.[ip], inserted.date_last, inserted.date_in, null + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- Delete. + insert into dbo._Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out, history_out) + select deleted.id, deleted.[procedure], deleted.[user], deleted.[ip], deleted.date_last, deleted.date_in, getdate(), sysutcdatetime() + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go + +if object_id(N'dbo.machine_session_get', N'FN') is not null drop function dbo.machine_session_get +go +create function machine_session_get() returns integer begin + return ( + select top 1 sessions.id + from dbo.Sessions sessions + join dbo.Users users on users.id = sessions.[user] + where date_out is null and users.nick = 'machine' + ) +end +go \ No newline at end of file diff --git a/SQLServer/AnP.05.logs.server.sql b/SQLServer/AnP.05.logs.server.sql new file mode 100644 index 0000000..23e48ca --- /dev/null +++ b/SQLServer/AnP.05.logs.server.sql @@ -0,0 +1,190 @@ +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', 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 \ No newline at end of file diff --git a/SQLServer/AnP.06.groups.server.sql b/SQLServer/AnP.06.groups.server.sql new file mode 100644 index 0000000..be714b4 --- /dev/null +++ b/SQLServer/AnP.06.groups.server.sql @@ -0,0 +1,281 @@ +use AnP + +if object_id(N'dbo.groups_tables_remove', N'P') is not null drop procedure dbo.groups_tables_remove +go +create procedure dbo.groups_tables_remove as begin set nocount on + + if object_id(N'dbo._GroupsUsers', N'U') is not null drop table dbo._GroupsUsers + if object_id(N'dbo._GroupsIps', N'U') is not null drop table dbo._GroupsIps + if object_id(N'dbo._Groups', N'U') is not null drop table dbo._Groups + + if object_id(N'dbo.GroupsUsers', N'U') is not null drop table dbo.GroupsUsers + if object_id(N'dbo.GroupsIps', N'U') is not null drop table dbo.GroupsIps + if object_id(N'dbo.Groups', N'U') is not null drop table dbo.Groups + +end +go + +if object_id(N'dbo.groups_tables_create', N'P') is not null drop procedure dbo.groups_tables_create +go +create procedure dbo.groups_tables_create as begin set nocount on + + if object_id(N'dbo.Groups', N'U') is null create table dbo.Groups( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [name] varchar(64) not null, + [description] varchar(512) not null, + date_in datetime not null constraint df_groups_date_in default getdate(), + date_out datetime, + constraint pk_groups primary key clustered(id), + constraint fk_groups_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_groups_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint uq_groups_name unique([name]) with(fillfactor = 90), + constraint ck_groups_name check([name] != '' and [name] not like '%[^a-zA-Z0-9_]%' and [name] not like '[^a-zA-Z_]%') + ) + + if object_id(N'dbo.GroupsUsers', N'U') is null create table dbo.GroupsUsers( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [group] integer not null, + [user] integer not null, + belongs bit not null constraint df_groups_users_belongs default 1, + date_in datetime not null constraint df_groups_users_date_in default getdate(), + date_out datetime, + constraint pk_groups_users primary key clustered(id), + constraint fk_groups_users_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_groups_users_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk_groups_users_group foreign key([group]) references dbo.Groups(id) + on update no action + on delete no action, + constraint fk_groups_users_user foreign key([user]) references dbo.Users(id) + on update no action + on delete no action, + constraint uq_groups_users unique([group], [user]) with(fillfactor = 90) + ) + + if object_id(N'dbo.GroupsIps', N'U') is null create table dbo.GroupsIps( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [group] integer not null, + [ip] integer not null, + belongs bit not null constraint df_groups_ips_belongs default 1, + date_in datetime not null constraint df_groups_ips_date_in default getdate(), + date_out datetime, + constraint pk_groups_ips primary key clustered(id), + constraint fk_groups_ips_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_groups_ips_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk_groups_ips_group foreign key([group]) references dbo.Groups(id) + on update no action + on delete no action, + constraint fk_groups_ips_ip foreign key([ip]) references dbo.Ips(id) + on update no action + on delete no action, + constraint uq_groups_ips unique([group], [ip]) with(fillfactor = 90) + ) + + if object_id(N'dbo._Groups', N'U') is null create table dbo._Groups( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [session] integer not null, + [name] varchar(64) not null, + [description] varchar(512) not null, + date_in datetime not null, + date_out datetime, + history_date datetime2 not null constraint df__groups_history_in default sysutcdatetime(), + constraint pk__groups primary key clustered(id), + constraint fk__groups_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__groups_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + ) + + if object_id(N'dbo._GroupsUsers', N'U') is null create table dbo._GroupsUsers( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [session] integer not null, + [group] integer not null, + [user] integer not null, + belongs bit not null, + date_in datetime not null, + date_out datetime, + history_date datetime2 not null constraint df__groups_users_history_in default sysutcdatetime(), + constraint pk__groups_users primary key clustered(id), + constraint fk__groups_users_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__groups_users_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk__groups_users_group foreign key([group]) references dbo.Groups(id) + on update no action + on delete no action, + constraint fk__groups_users_user foreign key([user]) references dbo.Users(id) + on update no action + on delete no action + ) + + if object_id(N'dbo._GroupsIps', N'U') is null create table dbo._GroupsIps( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [session] integer not null, + [group] integer not null, + [ip] integer not null, + belongs bit not null, + date_in datetime not null, + date_out datetime, + history_date datetime2 not null constraint df__groups_ips_history_in default sysutcdatetime(), + constraint pk__groups_ips primary key clustered(id), + constraint fk__groups_ips_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__groups_ips_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk__groups_ips_group foreign key([group]) references dbo.Groups(id) + on update no action + on delete no action, + constraint fk__groups_ips_ip foreign key([ip]) references dbo.Ips(id) + on update no action + on delete no action + ) + +end +go + +execute dbo.groups_tables_create + +if object_id(N'dbo.groups_trigger', N'TR') is not null drop trigger dbo.groups_trigger +go +create trigger dbo.groups_trigger on dbo.Groups for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._Groups(mode, entity, [procedure], [session], [name], [description], date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[name], inserted.[description], inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[name] != deleted.[name] or + inserted.[description] != deleted.[description] or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._Groups(mode, entity, [procedure], [session], [name], [description], date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[name], inserted.[description], inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._Groups(mode, entity, [procedure], [session], [name], [description], date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[name], deleted.[description], deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go + +if object_id(N'dbo.groups_users_trigger', N'TR') is not null drop trigger dbo.groups_users_trigger +go +create trigger dbo.groups_users_trigger on dbo.GroupsUsers for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._GroupsUsers(mode, entity, [procedure], [session], [group], [user], belongs, date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[group], inserted.[user], inserted.belongs, inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[group] != deleted.[group] or + inserted.[user] != deleted.[user] or + inserted.belongs != deleted.belongs or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._GroupsUsers(mode, entity, [procedure], [session], [group], [user], belongs, date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[group], inserted.[user], inserted.belongs, inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._GroupsUsers(mode, entity, [procedure], [session], [group], [user], belongs, date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[group], deleted.[user], deleted.belongs, deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go + +if object_id(N'dbo.groups_ips_trigger', N'TR') is not null drop trigger dbo.groups_ips_trigger +go +create trigger dbo.groups_ips_trigger on dbo.GroupsIps for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._GroupsIps(mode, entity, [procedure], [session], [group], [ip], belongs, date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[group], inserted.[ip], inserted.belongs, inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[group] != deleted.[group] or + inserted.[ip] != deleted.[ip] or + inserted.belongs != deleted.belongs or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._GroupsIps(mode, entity, [procedure], [session], [group], [ip], belongs, date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[group], inserted.[ip], inserted.belongs, inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._GroupsIps(mode, entity, [procedure], [session], [group], [ip], belongs, date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[group], deleted.[ip], deleted.belongs, deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go \ No newline at end of file diff --git a/SQLServer/AnP.07.settings.server.sql b/SQLServer/AnP.07.settings.server.sql new file mode 100644 index 0000000..a0911a1 --- /dev/null +++ b/SQLServer/AnP.07.settings.server.sql @@ -0,0 +1,353 @@ +use AnP + +if object_id(N'dbo.settings_tables_remove', N'P') is not null drop procedure dbo.settings_tables_remove +go +create procedure dbo.settings_tables_remove as begin set nocount on + + if object_id(N'dbo._SettingsGroups', N'U') is not null drop table dbo._SettingsGroups + if object_id(N'dbo._Settings', N'U') is not null drop table dbo._Settings + if object_id(N'dbo._SettingsTypes', N'U') is not null drop table dbo._SettingsTypes + + if object_id(N'dbo.SettingsGroups', N'U') is not null drop table dbo.SettingsGroups + if object_id(N'dbo.Settings', N'U') is not null drop table dbo.Settings + if object_id(N'dbo.SettingsTypes', N'U') is not null drop table dbo.SettingsTypes + +end +go + +if object_id(N'dbo.settings_tables_create', N'P') is not null drop procedure dbo.settings_tables_create +go +create procedure dbo.settings_tables_create as begin set nocount on + + if object_id(N'dbo.SettingsTypes', N'U') is null create table dbo.SettingsTypes( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [name] varchar(32) not null, + [description] varchar(512) not null, + date_in datetime not null constraint df_settings_types_date_in default getdate(), + date_out datetime, + history_in datetime2 generated always as row start hidden not null constraint df_settings_types_history_in default sysutcdatetime(), + history_out datetime2 generated always as row end hidden not null constraint df_settings_types_history_out default convert(datetime2, '9999-12-31 23:59:59.9999999'), + constraint pk_settings_types primary key clustered(id), + constraint fk_settings_types_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_settings_types_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint uq_settings_types_name unique([name]) with(fillfactor = 90), + constraint ck_settings_types_name check([name] != '' and [name] not like '%[^a-zA-Z0-9_]%' and [name] not like '[^a-zA-Z_]%') + ) + + if object_id(N'dbo.Settings', N'U') is null create table dbo.Settings( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [type] integer not null, + [name] varchar(64) not null, + [value] varchar(max), + [default] varchar(max), + [description] varchar(512) not null, + date_in datetime not null constraint df_settings_date_in default getdate(), + date_out datetime, + history_in datetime2 generated always as row start hidden not null constraint df_settings_history_in default sysutcdatetime(), + history_out datetime2 generated always as row end hidden not null constraint df_settings_history_out default convert(datetime2, '9999-12-31 23:59:59.9999999'), + constraint pk_settings primary key clustered(id), + constraint fk_settings_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_settings_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk_settings_type foreign key([type]) references dbo.SettingsTypes(id) + on update no action + on delete no action, + constraint uq_settings_name unique([name]) with(fillfactor = 90), + constraint ck_settings_name check([name] != '' and [name] not like '%[^a-zA-Z0-9_]%' and [name] not like '[^a-zA-Z_]%') + ) + + if object_id(N'dbo.SettingsGroups', N'U') is null create table dbo.SettingsGroups( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [settings] integer not null, + [group] integer not null, + belongs bit not null constraint df_settings_groups_belongs default 1, + date_in datetime not null constraint df_settings_groups_date_in default getdate(), + date_out datetime, + history_in datetime2 generated always as row start hidden not null constraint df_settings_groups_history_in default sysutcdatetime(), + history_out datetime2 generated always as row end hidden not null constraint df_settings_groups_history_out default convert(datetime2, '9999-12-31 23:59:59.9999999'), + constraint pk_settings_groups primary key clustered(id), + constraint fk_settings_groups_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_settings_groups_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk_settings_groups_settings foreign key([settings]) references dbo.Settings(id) + on update no action + on delete no action, + constraint fk_settings_groups_group foreign key([group]) references dbo.Users(id) + on update no action + on delete no action, + constraint uq_settings_groups unique([settings], [group]) with(fillfactor = 90) + ) + + if object_id(N'dbo._SettingsTypes', N'U') is null create table dbo._SettingsTypes( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [name] varchar(32) not null, + [description] varchar(512) not null, + date_in datetime not null constraint df__settings_types_date_in default getdate(), + date_out datetime, + history_date datetime2 not null constraint df__settings_types_history_date default sysutcdatetime(), + constraint pk__settings_types primary key clustered(id), + constraint fk__settings_types_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__settings_types_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + ) + + if object_id(N'dbo._Settings', N'U') is null create table dbo._Settings( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [type] integer not null, + [name] varchar(64) not null, + [value] varchar(max), + [default] varchar(max), + [description] varchar(512) not null, + date_in datetime not null constraint df_settings_date_in default getdate(), + date_out datetime, + history_date datetime2 generated always as row start hidden not null constraint df__settings_history_date default sysutcdatetime(), + constraint pk__settings primary key clustered(id), + constraint fk__settings_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__settings_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk__settings_type foreign key([type]) references dbo.SettingsTypes(id) + on update no action + on delete no action, + constraint uq__settings_name unique([name]) with(fillfactor = 90), + constraint ck__settings_name check([name] != '' and [name] not like '%[^a-zA-Z0-9_]%' and [name] not like '[^a-zA-Z_]%') + ) + + if object_id(N'dbo.SettingsGroups', N'U') is null create table dbo._SettingsGroups( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [settings] integer not null, + [group] integer not null, + belongs bit not null, + date_in datetime not null, + date_out datetime, + history_date datetime2 not null constraint df__settings_groups_history_date default sysutcdatetime(), + constraint pk__settings_groups primary key clustered(id), + constraint fk__settings_groups_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk__settings_groups_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk__settings_groups_settings foreign key([settings]) references dbo.Settings(id) + on update no action + on delete no action, + constraint fk__settings_groups_group foreign key([group]) references dbo.Users(id) + on update no action + on delete no action, + constraint uq__settings_groups unique([settings], [group]) with(fillfactor = 90) + ) + +end +go + +execute dbo.settings_tables_create + +if object_id(N'dbo.settings_types_trigger', N'TR') is not null drop trigger dbo.settings_types_trigger +go +create trigger dbo.settings_types_trigger on dbo.SettingsTypes for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._SettingsTypes(mode, entity, [procedure], [session], [name], [description], date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[name], inserted.[description], inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[name] != deleted.[name] or + inserted.[description] != deleted.[description] or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._SettingsTypes(mode, entity, [procedure], [session], [name], [description], date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[name], inserted.[description], inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._SettingsTypes(mode, entity, [procedure], [session], [name], [description], date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[name], deleted.[description], deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go + +if object_id(N'dbo.settings_trigger', N'TR') is not null drop trigger dbo.settings_trigger +go +create trigger dbo.settings_trigger on dbo.Settings for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._Settings(mode, entity, [procedure], [session], [type], [name], [value], [default], [description], date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[type], inserted.[name], inserted.[value], inserted.[default], inserted.[description], inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[type] != deleted.[type] or + inserted.[name] != deleted.[name] or + inserted.[value] != deleted.[value] or + inserted.[default] != deleted.[default] or + inserted.[description] != deleted.[description] or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._Settings(mode, entity, [procedure], [session], [type], [name], [value], [default], [description], date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[type], inserted.[name], inserted.[value], inserted.[default], inserted.[description], inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._Settings(mode, entity, [procedure], [session], [type], [name], [value], [default], [description], date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[type], deleted.[name], deleted.[value], deleted.[default], deleted.[description], deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go + +if object_id(N'dbo.settings_groups_trigger', N'TR') is not null drop trigger dbo.settings_groups_trigger +go +create trigger dbo.settings_groups_trigger on dbo.SettingsGroups for insert, update, delete as begin set nocount on + + declare @insert integer, @update integer, @delete integer, @unknown integer + + execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output + + -- update. + insert into dbo._SettingsGroups(mode, entity, [procedure], [session], [settings], [group], [value], date_in, date_out) + select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.[settings], inserted.[group], inserted.[value], inserted.date_in, inserted.date_out + from inserted inserted + join deleted deleted on inserted.id = deleted.id + where + inserted.[procedure] != deleted.[procedure] or + inserted.[session] != deleted.[session] or + inserted.[settings] != deleted.[settings] or + inserted.[group] != deleted.[group] or + inserted.[value] != deleted.[value] or + inserted.date_in != deleted.date_in or + isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') + + -- Insert. + insert into dbo._SettingsGroups(mode, entity, [procedure], [session], [session], [settings], [group], [value], date_in, date_out) + select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.[settings], inserted.[group], inserted.[value], inserted.date_in, inserted.date_out + from inserted inserted + left join deleted deleted on inserted.id = deleted.id + where deleted.id is null + + -- deleted. + insert into dbo._SettingsGroups(mode, entity, [procedure], [session], [session], [settings], [group], [value], date_in, date_out) + select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.[settings], deleted.[group], deleted.[value], deleted.date_in, deleted.date_out + from deleted deleted + left join inserted inserted on deleted.id = inserted.id + where inserted.id is null + +end +go + +if object_id(N'dbo.settings_get', N'FN') is not null drop function dbo.settings_get +go +create function dbo.settings_get( + @name varchar(64), + @group varchar(64) = null, + @default varchar(max) = null +) returns varchar(max) as begin + if @group is not null begin + + declare @group_id integer = cast(@group as integer) + declare @value varchar(max) = ( + select top 1 isnull(isnull(isnull(settings_groups.[value], settings.[value]), settings.[default]), @default) + from dbo.SettingsGroups settings_groups + join dbo.Groups groups on groups.id = settings_groups.[group] + join dbo.Settings settings on settings.id = settings_groups.[settings] + where + settings_groups.date_out is null and + groups.date_out is null and + settings.date_out is null and + settings.[name] = @name and + (groups.id = @group_id or groups.[name] = @group) + ) + + if @value is not null + return @value + end + return isnull((select top 1 isnull([value], [default]) from dbo.Settings where + date_out is null and + [name] = @name + ), @default) +end +go + +if object_id(N'dbo.settings_get_int', N'FN') is not null drop function dbo.settings_get_int +go +create function dbo.settings_get_int( + @name varchar(64), + @group varchar(64) = null, + @default integer = null +) returns integer as begin + + declare @value varchar(max) = dbo.settings_get(@name, @group, null) + + if @value is null + return @default + return cast(@value as integer) +end +go + +if object_id(N'dbo.settings_get_bool', N'FN') is not null drop function dbo.settings_get_bool +go +create function dbo.settings_get_bool( + @name varchar(64), + @group varchar(64) = null, + @default bit = null +) returns bit as begin + + declare @value varchar(max) = dbo.settings_get(@name, @group, null) + + if @value is null + return @default + return cast(@value as bit) +end +go \ No newline at end of file diff --git a/SQLServer/AnP.08.permissions.server.sql b/SQLServer/AnP.08.permissions.server.sql new file mode 100644 index 0000000..52840c5 --- /dev/null +++ b/SQLServer/AnP.08.permissions.server.sql @@ -0,0 +1,113 @@ +use AnP + +if object_id(N'dbo.permissions_tables_remove', N'P') is not null drop procedure dbo.permissions_tables_remove +go +create procedure dbo.permissions_tables_remove as begin set nocount on + + if object_id(N'dbo.PermissionsGroups', N'U') is not null execute sp_executesql N'alter table dbo.PermissionsGroups set (system_versioning = off)' + if object_id(N'dbo.Permissions', N'U') is not null execute sp_executesql N'alter table dbo.Permissions set (system_versioning = off)' + + if object_id(N'dbo._PermissionsGroups', N'U') is not null drop table dbo._PermissionsGroups + if object_id(N'dbo._Permissions', N'U') is not null drop table dbo._Permissions + + if object_id(N'dbo.PermissionsGroups', N'U') is not null drop table dbo.PermissionsGroups + if object_id(N'dbo.Permissions', N'U') is not null drop table dbo.Permissions + +end +go + +if object_id(N'dbo.permissions_tables_create', N'P') is not null drop procedure dbo.permissions_tables_create +go +create procedure dbo.permissions_tables_create as begin set nocount on + + if object_id(N'dbo._Permissions', N'U') is null create table dbo._Permissions( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [session] integer not null, + [name] varchar(64) not null, + [description] varchar(512) not null, + date_in datetime not null, + date_out datetime, + history_in datetime2 not null, + history_out datetime2 not null, + constraint pk__permissions primary key clustered(id), + index ix__permissions_history nonclustered(entity, history_out, history_in) + ) + + if object_id(N'dbo._PermissionsGroups', N'U') is null create table dbo._PermissionsGroups( + id integer not null identity(1, 1), + entity integer not null, + [procedure] integer not null, + [session] integer not null, + permission integer not null, + [group] integer not null, + belongs bit not null, + date_in datetime not null, + date_out datetime, + history_in datetime2 not null, + history_out datetime2 not null, + constraint pk_permissions_groups primary key clustered(id), + index ix__permissions_groups_history nonclustered(entity, history_out, history_in) + ) + + if object_id(N'dbo.Permissions', N'U') is null begin + create table dbo.Permissions( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + [name] varchar(64) not null, + [description] varchar(512) not null, + date_in datetime not null constraint df_permissions_date_in default getdate(), + date_out datetime, + history_in datetime2 generated always as row start hidden not null constraint df_permissions_history_in default sysutcdatetime(), + history_out datetime2 generated always as row end hidden not null constraint df_permissions_history_out default convert(datetime2, '9999-12-31 23:59:59.9999999'), + constraint pk_permissions primary key clustered(id), + constraint fk_permissions_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_permissions_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint uq_permissions_name unique([name]) with(fillfactor = 90), + constraint ck_permissions_name check([name] != '' and [name] not like '%[^a-zA-Z0-9_]%' and [name] not like '[^a-zA-Z_]%'), + period for system_time(history_in, history_out) + ) + execute sp_executesql N'alter table dbo.Permissions set (system_versioning = on (history_table = dbo._Permissions, data_consistency_check = on))' + end + + if object_id(N'dbo.PermissionsGroups', N'U') is null begin + create table dbo._PermissionsGroups( + id integer not null identity(1, 1), + [procedure] integer not null, + [session] integer not null, + permission integer not null, + [group] integer not null, + belongs bit not null constraint df_permissions_groups_belongs default 1, + date_in datetime not null constraint df_permissions_groups_date_in default getdate(), + date_out datetime, + history_in datetime2 generated always as row start hidden not null constraint df_permissions_groups_history_in default sysutcdatetime(), + history_out datetime2 generated always as row end hidden not null constraint df_permissions_groups_history_out default convert(datetime2, '9999-12-31 23:59:59.9999999'), + constraint pk_permissions_groups primary key clustered(id), + constraint fk_permissions_groups_procedure foreign key([procedure]) references dbo.Procedures(id) + on update no action + on delete no action, + constraint fk_permissions_groups_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action, + constraint fk_permissions_groups_permission foreign key(permission) references dbo.Permissions(id) + on update no action + on delete no action, + constraint fk_permissions_groups_group foreign key([group]) references dbo.Users(id) + on update no action + on delete no action, + constraint uq_permissions_groups unique(permission, [group]) with(fillfactor = 90), + period for system_time(history_in, history_out) + ) + execute sp_executesql N'alter table dbo.PermissionsGroups set (system_versioning = on (history_table = dbo._PermissionsGroups, data_consistency_check = on))' + end + +end +go + +execute dbo.permissions_tables_create \ No newline at end of file diff --git a/SQLServer/AnP.09.fill.server.sql b/SQLServer/AnP.09.fill.server.sql new file mode 100644 index 0000000..44d9c08 --- /dev/null +++ b/SQLServer/AnP.09.fill.server.sql @@ -0,0 +1,143 @@ +use AnP + +if object_id(N'dbo.common_tables_fill', N'P') is not null drop procedure dbo.common_tables_fill +go +create procedure dbo.common_tables_fill as begin set nocount on + + declare @database varchar(64) = dbname() + declare @machine integer = dbo.machine_session_get() + declare @procedure integer + declare @machine_user_id integer = (select top 1 id from dbo.Users where nick = @machine_user) + declare @machine_ip_id integer = (select top 1 id from dbo.Ips where ip = @machine_ip) + declare @guest_user_id integer = (select top 1 id from dbo.Users where nick = 'guest') + declare @guest_group_id integer = (select top 1 id from dbo.Groups where [name] = 'guest' and date_out is null) + declare @root_group_id integer = (select top 1 id from dbo.Groups where [name] = 'root' and date_out is null) + declare @guest_permissions_id integer = (select top 1 id from dbo.Permissions where [name] = 'guest' and date_out is null) + declare @administrator_permissions_id integer = (select top 1 id from dbo.Permissions where [name] = 'administrator' and date_out is null) + declare @user_group_id integer = (select top 1 id from dbo.Groups where [name] = 'users' and date_out is null) + + execute dbo.procedure_get_id @database, 'common_tables_fill', @procedure output + + if @machine is null begin + + declare @machine_user varchar(32) = 'machine' + declare @machine_ip varchar(39) = '::1' + + set @machine = 1 + + if @machine_user_id is null begin + + declare @group integer + + insert into dbo.Users([procedure], [session], nick, [password], accessible) values + (@procedure, @machine, @machine_user, hashbytes('SHA2_512', ''), 0) + set @machine_user_id = scope_identity() + + insert into dbo.Groups([procedure], [session], [name], owner) values + (@procedure, @machine, @machine_user, 1) + set @group = scope_identity() + insert into dbo.GroupsUsers([procedure], [session], [group], [user]) values + (@procedure, @machine, @group, @machine_user_id) + + end + + if @machine_ip_id is null begin + + declare @group integer + + insert into dbo.Ips ([procedure], [session], ip) values + (@procedure, @machine, @machine_ip) + set @machine_ip_id = scope_identity() + + insert into dbo.Groups([procedure], [session], [name], owner) values + (@procedure, @machine, @machine_user, 1) + set @group = scope_identity() + insert into dbo.GroupsIps([procedure], [session], [group], [ip]) values + (@procedure, @machine, @group, @machine_ip_id) + + end + + set @machine = (select top 1 id from dbo.Sessions where [user] = @machine_user_id and [ip] = @machine_ip_id and date_out is null) + + if @machine is null begin + insert into dbo.Sessions([procedure], [user], [ip]) values + (@procedure, @machine_user_id, @machine_ip_id) + set @machine = scope_identity() + end + + if (select top 1 0 from dbo.Users where id = @user_id and [session] = @session) is null begin + update dbo.Users set [session] = @machine where id = @machine_user_id + delete from dbo._Users where [session] != @machine + end + if (select top 1 0 from dbo.Ips where id = @ip_id and [session] = @session) is null begin + update dbo.Ips set [session] = @machine where id = @machine_ip_id + delete from dbo._Ips where [session] != @machine + end + + execute dbo.users_tables_upgrade + execute dbo.ips_tables_upgrade + + end + + if object_id(N'tempdb..#Settings') is not null drop table #Settings + create table #Settings( + [type] varchar(32) not null, + [name] varchar(64) not null, + [value] varchar(max) not null + ) + + insert into #Settings([type], [name], [value]) values + ('data', 'data_hash_algorithm', 'SHA2_512') + + if @guest_user_id is null begin + insert into dbo.Users([procedure], [session], nick, [password], accessible) values + (@procedure, @machine, 'guest', hashbytes('SHA2_512', ''), 0) + set @guest_user_id = scope_identity() + end + if @guest_group_id is null begin + insert into dbo.Groups([procedure], [session], [name], owner) values + (@procedure, @machine, 'guest', 1) + set @guest_group_id = scope_identity() + end + if @guest_permissions_id is null begin + insert into dbo.Permissions([procedure], [session], [name], [description]) values + (@procedure, @machine, 'guest', 'Guest permissions') + set @guest_permissions_id = scope_identity() + end + if (select top 1 0 from dbo.GroupsUsers where [group] = @guest_group_id and [user] = @guest_user_id) is null + insert into dbo.GroupsUsers([procedure], [session], [group], [user]) values + (@procedure, @machine, @guest_group_id, @guest_user_id) + if (select top 1 0 from dbo.PermissionsGroups where permission = @guest_permissions_id and [group] = @guest_group_id) is null + insert into dbo.PermissionsGroups([procedure], [session], permission, [group]) values + (@procedure, @machine, @guest_permissions_id, @guest_group_id) + + if @root_group_id is null begin + insert into dbo.Groups([procedure], [session], [name], owner) values + (@procedure, @machine, 'root', 1) + set @root_group_id = scope_identity() + end + if @administrator_permissions_id is null begin + insert into dbo.Permissions([procedure], [session], [name], [description]) values + (@procedure, @machine, 'administrator', 'Administrator permissions') + set @administrator_permissions_id = scope_identity() + end + if (select top 1 0 from dbo.PermissionsGroups where permission = @administrator_permissions_id and [group] = @root_group_id) is null + insert into dbo.PermissionsGroups([procedure], [session], permission, [group]) values + (@procedure, @machine, @administrator_permissions_id, @root_group_id) + if (select top 1 0 from dbo.GroupsUsers where [group] = @root_group_id and [user] = @machine_user_id) is null + insert into dbo.GroupsUsers([procedure], [session], [group], [user]) values + (@procedure, @machine, @root_group_id, @machine_user_id) + + if @user_group_id is null begin + insert into dbo.Groups([procedure], [session], [name], owner) values + (@procedure, @machine, 'users', 1) + set @user_group_id = scope_identity() + end + if (select top 1 0 from dbo.PermissionsGroups where permission = @guest_permissions_id and [group] = @user_group_id) is null + insert into dbo.PermissionsGroups([procedure], [session], permission, [group]) values + (@procedure, @machine, @guest_permissions_id, @user_group_id) + + drop table #Settings + +end +go \ No newline at end of file diff --git a/SQLServer/AnP.10.common.server.sql b/SQLServer/AnP.10.common.server.sql new file mode 100644 index 0000000..9df84e7 --- /dev/null +++ b/SQLServer/AnP.10.common.server.sql @@ -0,0 +1,58 @@ +use AnP + +if object_id(N'dbo.where_set', N'FN') is not null drop function dbo.where_set +go +create function dbo.where_set( + @new_where varchar(max), + @old_where varchar(max) +) returns varchar(max) begin + return (case when isnull(@new_where, '') = '' then isnull(@old_where, '') else (case when isnull(@old_where, '') = '' then @new_where else '(' + @new_where + ') and (' + @old_where + ')' end) end) +end +go + +if object_id(N'dbo.tables_list', N'P') is not null drop procedure dbo.tables_list +go +create procedure tables_list( + @view varchar(max), + @page integer, + @items_per_page integer, + @where varchar(max), + @order_by varchar(max), + @has_errors bit, + @pages integer output, + @items integer output, + @results integer output +) as begin + + declare @item_from integer + declare @query nvarchar(max) + declare @where_string varchar(max) + + set nocount on + + if @has_errors = 1 + set @where = dbo.where_set('0 = 1', @where) + set @where_string = (case when isnull(@where, '') = '' then '' else ' where ' + @where end) + + set @query = N'select top 1 @subitems = count(1) from ' + @view + @where_string + + execute sp_executesql @query, N'@subitems integer output', @subitems = @items output + + set @pages = ceiling(@items / cast(@items_per_page as float)) + + if @page < 1 + set @page = 1 + else if @pages > 0 and @page > @pages + set @page = @pages + + set @query = ( + N'select * from ' + @view + @where_string + + ' order by ' + (case when isnull(@order_by, '') = '' then 'id asc' else @order_by end) + + ' offset ' + convert(varchar(14), (@page - 1) * @items_per_page) + ' rows fetch next ' + convert(varchar(14), @items_per_page) + ' rows only' + ) + + execute sp_executesql @query + set @results = @@rowcount + +end +go \ No newline at end of file diff --git a/Tools/sqlserver.install.bat b/Tools/sqlserver.install.bat new file mode 100644 index 0000000..eb4ea4f --- /dev/null +++ b/Tools/sqlserver.install.bat @@ -0,0 +1,22 @@ +@echo off + +set "transact_sql_host=127.0.0.1" +set "transact_sql_port=1433" +set "transact_sql_user=sa" +set "transact_sql_password=" + +if exist Secrets.cmd ( + call Secrets.cmd +) + +where sqlcmd > NUL +if %errorlevel% neq 0 ( + echo "Please, install 'sqlcmd' for use the Scripts via CMD." +) else ( + for /D %%d in (%cd%\..\SQLServer\AnP.*) do ( + for %%f in (%%d\*.sql) do ( + echo %%f + sqlcmd -S %transact_sql_host%,%transact_sql_port% -U %transact_sql_user% -P %transact_sql_password% -i %%f + ) + ) +) \ No newline at end of file diff --git a/Tools/sqlserver.install.sh b/Tools/sqlserver.install.sh new file mode 100644 index 0000000..a5dbdd6 --- /dev/null +++ b/Tools/sqlserver.install.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +directory=`dirname $(readlink -f "$0")` + +if command -v sqlcmd &> /dev/null; then + + transact_sql_host="127.0.0.1" + transact_sql_port="1433" + transact_sql_user="sa" + transact_sql_password="" + + [[ -f Secrets.sh ]] && source Secrets.sh + + for i in $(find $directory/../SQLServer -type f|grep .sql|sort|cat); do + echo $i + sqlcmd -S $transact_sql_host,$transact_sql_port -U $transact_sql_user -P $transact_sql_password -i $i -C + done + +else + echo "Please, install 'sqlcmd'." +fi \ No newline at end of file