From 8eec9ca69463fcf91d46122aac2b259c5a640f6f Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Mon, 22 Jan 2024 20:06:17 +0300 Subject: [PATCH 1/7] Separated sql creation script on multiple files --- sql/1_create_user.sql | 25 +++ sql/2_create_tag.sql | 20 +++ sql/3_create_event.sql | 17 ++ sql/4_create_event_view.sql | 14 ++ sql/5_create_operating_cycle.sql | 57 +++++++ sql/6_create_operating_metric.sql | 79 +++++++++ sql/7_create_report.sql | 12 ++ sql/create_postgres_database.sql | 270 ++++-------------------------- 8 files changed, 256 insertions(+), 238 deletions(-) create mode 100644 sql/1_create_user.sql create mode 100644 sql/2_create_tag.sql create mode 100644 sql/3_create_event.sql create mode 100644 sql/4_create_event_view.sql create mode 100644 sql/5_create_operating_cycle.sql create mode 100644 sql/6_create_operating_metric.sql create mode 100644 sql/7_create_report.sql diff --git a/sql/1_create_user.sql b/sql/1_create_user.sql new file mode 100644 index 00000000..898ab633 --- /dev/null +++ b/sql/1_create_user.sql @@ -0,0 +1,25 @@ +drop table if exists "app_user"; +drop type if exists "user_role_enum" CASCADE; +/* + USER +*/ +do $$ +begin +if not exists (SELECT 1 FROM pg_type WHERE typname = 'user_role_enum') THEN + create type user_role_enum AS ENUM ('admin','operator'); +end if; +end +$$; +create table if not exists app_user ( + id bigserial not null, + role user_role_enum not null, + name varchar(255) not null, --COMMENT 'ФИО Потльзователя', + login varchar(255) not null unique, --COMMENT ' Логин', + pass varchar(2584) not null, --COMMENT 'Пароль', + created timestamp not null default CURRENT_TIMESTAMP, + updated timestamp not null default CURRENT_TIMESTAMP, + deleted timestamp default null, + PRIMARY KEY (id, login) +); +comment on table app_user is 'Потльзователи'; +comment on column app_user.role is 'Признак группировки'; \ No newline at end of file diff --git a/sql/2_create_tag.sql b/sql/2_create_tag.sql new file mode 100644 index 00000000..0bcc11ba --- /dev/null +++ b/sql/2_create_tag.sql @@ -0,0 +1,20 @@ +drop table if exists "tags" CASCADE; +drop type if exists "tag_type_enum" CASCADE; +/* + PROCESS TAG +*/ +do $$ +begin +if not exists (SELECT 1 FROM pg_type WHERE typname = 'tag_type_enum') THEN + create type tag_type_enum as enum('Bool','Int','UInt','DInt','Word','LInt','Real','Time','Date_And_Time'); +end if; +end +$$; +create table if not exists tags ( + id serial not null, + type tag_type_enum not null, --COMMENT 'S7DataType(bool, int, uInt, dInt, word, lInt, real, time, dateAndTime)', + name varchar(255) not null unique, --COMMENT 'Имя тэга в системе', + description varchar(255) not null DEFAULT '', --COMMENT 'Дополнительная информация о тэге', + PRIMARY KEY (id) +); +comment on table tags is 'Справочник тэгов проекта.'; \ No newline at end of file diff --git a/sql/3_create_event.sql b/sql/3_create_event.sql new file mode 100644 index 00000000..aa208b66 --- /dev/null +++ b/sql/3_create_event.sql @@ -0,0 +1,17 @@ +drop table if exists "event" CASCADE; +drop sequence if exists "event_uid_seq" CASCADE; +drop index if exists "fk_timestamp_idx1"; +/* + PROCESS EVENT +*/ +CREATE SEQUENCE event_uid_seq; +CREATE TABLE IF NOT EXISTS event ( + uid decimal(24,12) not null default nextval('event_uid_seq'), --'1.000000000000', --COMMENT 'Идентификатор записи', + timestamp timestamp not null, + pid int2 not null, --COMMENT 'Идентификатор тэга.', + value int2 not null, --COMMENT 'Значение тэга 0..255, аварийно если >0.', + status int2 not null, --COMMENT 'DsStatus as 0..255', + primary key (uid) +); +comment on table event is 'События. Только тэги дискретных значений, регистрируется 0 - как норма, > 0 - как авария.'; +create index fk_timestamp_idx1 on event (timestamp asc); \ No newline at end of file diff --git a/sql/4_create_event_view.sql b/sql/4_create_event_view.sql new file mode 100644 index 00000000..11b8f6ef --- /dev/null +++ b/sql/4_create_event_view.sql @@ -0,0 +1,14 @@ +create or replace view event_view as + select + e.uid AS uid, + e.pid AS pid, + e.value AS value, + e.status AS status, + e.timestamp AS timestamp, + t.type AS type, + t.name AS name, + t.description AS description + from + (event e + left join tags t on + (e.pid = t.id)); \ No newline at end of file diff --git a/sql/5_create_operating_cycle.sql b/sql/5_create_operating_cycle.sql new file mode 100644 index 00000000..cf6260dc --- /dev/null +++ b/sql/5_create_operating_cycle.sql @@ -0,0 +1,57 @@ +/* + PROCESS OPERATING CYCLE +*/ +drop table if exists operating_cycle; +drop table if exists operating_cycle_metric CASCADE; +drop table if exists operating_cycle_metric_value CASCADE; +drop view if exists operating_cycle_metric_value_view; +do $$ +begin +if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN + create type metric_data_type_enum as enum('bool','int','real','time','date','timestamp','string'); +end if; +end +$$; +create table operating_cycle ( + id bigserial NOT NULL, -- 'Идентификатор записи рабочего цикла', + timestamp_start timestamp NOT NULL, --COMMENT 'Дата и время начала рабочего цикла', + timestamp_stop timestamp NOT NULL, --COMMENT 'Дата и время окончания рабочего цикла', + alarm_class char(2) NOT NULL, -- COMMENT 'Point alarm class as 0..15, 0 - no alarm', + PRIMARY KEY (id) +); +create table operating_cycle_metric ( + id char(6) NOT NULL, --COMMENT 'Идентификатор метрики статистических значений рабочего цикла', + name varchar(255) NOT NULL, --COMMENT 'Имя метрики статистических значений рабочего цикла', + description varchar(255) NOT NULL, --COMMENT 'Имя метрики статистических значений рабочего цикла', + PRIMARY KEY (id) + --KEY name_idx1 (name) +); +insert into operating_cycle_metric (id, name, description) values + (1, 'average', 'Среднее арифметическое'), + (2, 'max', 'Максимальное'), + (3, 'min', 'Минимальное'), + (4, 'trip_count', 'Количество срабатываний'), + (5, 'diviation_max', 'Максимальное отклонение'); +create table operating_cycle_metric_value ( + operating_cycle_id int8 NOT NULL, --COMMENT 'Идентификатор записи рабочего цикла, к которрй относится данная хапись', + pid int4 NOT NULL, --COMMENT 'ID тэга', + metric_id char(6) NOT NULL, --COMMENT 'Идентификатор метрики рабочего цикла, к которрй относится данная хапись', + value decimal(16,8) NOT NULL, --COMMENT 'Значеник метрики', + PRIMARY KEY (operating_cycle_id, pid, metric_id) +); +create or replace view operating_cycle_metric_value_view as + select + ocmv.operating_cycle_id AS operating_cycle_id, + ocmv.pid AS "point_id", + tag.name AS point_name, + ocmv.metric_id AS "metric_id", + ocm."name" as metric_name, + ocmv.value AS value +-- tag.type AS type, +-- tag.description AS description + from + (operating_cycle_metric_value ocmv + left join tags tag on + (ocmv.pid = tag.id) + left join operating_cycle_metric ocm on + (ocmv.metric_id = ocm.id)); \ No newline at end of file diff --git a/sql/6_create_operating_metric.sql b/sql/6_create_operating_metric.sql new file mode 100644 index 00000000..b038ad40 --- /dev/null +++ b/sql/6_create_operating_metric.sql @@ -0,0 +1,79 @@ +/* + PROCESS OPERATING METRIC +*/ +drop table if exists operating_metric; +do $$ +begin +if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN + create type metric_data_type_enum as enum('bool','int','real','time','date','timestamp','string'); +end if; +end +$$; +create table operating_metric ( + id char(6) NOT NULL unique, --COMMENT 'Идентификатор метрики', + type metric_data_type_enum not null, --COMMENT 'enum('bool','int','real','time','date','timestamp','string')', + name varchar(255) NOT NULL, --COMMENT 'Имя метрики', + description varchar(255) NOT NULL, --COMMENT 'Описание метрики', + value text NOT NULL, --COMMENT 'Значение метрики', + PRIMARY KEY (name) +); +comment on table operating_metric is 'Общие метрики'; +insert into operating_metric (id, type, name, description, value) values + ('1.1', 'string', 'crane-type', 'тип крана', 'unknown'), + ('1.2', 'string', 'crane-index', 'индекс крана', 'unknown'), + ('1.3', 'string', 'crane-vendor', 'наименование предприятия - изготовителя крана', 'ООО "ТКЗ"'), + ('1.4', 'string', 'crane-serial-number', 'заводской номер крана', '000-000'), + ('1.5', 'date', 'crane-manufacturing-date', 'год изготовления крана', '2023-03-03'), + ('1.6', 'real', 'crane-capacity', 'грузоподъемность крана, тонны', '0.0'), + ('1.7', 'string', 'crane-classification-group', 'группа классификации (режима) крана', 'M8'), + ('1.7.1', 'string', 'winch1-classification-group', 'группа классификации (режима) лебедки 1 крана', 'M8'), + ('1.7.2', 'string', 'winch2-classification-group', 'группа классификации (режима) лебедки 2 крана', 'M8'), + ('1.7.3', 'string', 'winch3-classification-group', 'группа классификации (режима) лебедки 3 крана', 'M8'), + ('1.8', 'real', 'crane-nominal-characteristic-number', 'нор­мативное характеристическое число крана', '0.0'), + ('1.8.1', 'real', 'winch1-nominal-characteristic-number', 'нор­мативное характеристическое число лебедки 1 крана', '0.0'), + ('1.8.2', 'real', 'winch2-nominal-characteristic-number', 'нор­мативное характеристическое число лебедки 2 крана', '0.0'), + ('1.8.3', 'real', 'winch3-nominal-characteristic-number', 'нор­мативное характеристическое число лебедки 3 крана', '0.0'), + ('1.9', 'date', 'crane-commissioning-date', 'дата ввода крана в эксплуатацию', '2023-03-03'), + ('1.10', 'int', 'crane-standard-service-life ', 'нормативный срок службы крана', '0'), + ('2.1', 'string', 'fault-recorder-type', 'тип Регистратора параметров', 'Fault Recorder'), + ('2.2', 'string', 'fault-recorder-model', 'модификация Регистратора параметров', 'v0.0.1'), + ('2.3', 'string', 'fault-recorder-vendor', 'наименование предприятия - изготовителя Регистратора параметров', 'ООО "ТКЗ"'), + ('2.4', 'string', 'fault-recorder-serial-number', 'заводской номер Регистратора параметров', '000-000'), + ('2.5', 'date', 'fault-recorder-manufacturing-date', 'год изготовления Регистратора параметров', '2023-03-03'), + ('2.6', 'date', 'fault-recorder-installation-date', 'дата установки РП на кран', '2023-03-03'), + ('2.7', 'string', 'fault-recorder-installation-company', 'наименование организации, установившей Регистратора параметров на кран', 'ООО "ТКЗ"'), + ('3.1', 'real', 'crane-total-operating-hours', 'общее количество часов работы крана', '0.0'), + ('3.2.0', 'real', 'pump-total-operating-hours', 'общее количество часов работы насосной станции (моточасы)', '0.0'), + ('3.2.1', 'real', 'winch1-total-operating-hours', 'общее количество часов работы лебедки 1 (моточасы)', '0.0'), + ('3.2.2', 'real', 'winch2-total-operating-hours', 'общее количество часов работы лебедки 2 (моточасы)', '0.0'), + ('3.2.3', 'real', 'winch3-total-operating-hours', 'общее количество часов работы лебедки 3 (моточасы)', '0.0'), + ('3.3', 'int', 'total-operating-cycles-count', 'суммарное число рабочих циклов', '0'), + ('3.4', 'real', 'cycles-distribution-by-load-ranges', 'распределение циклов по диапазонам нагрузки', '0.0'), + ('3.4.1', 'real', 'cycles-0_05-0_15-load-range', 'циклов в диапазоне загрузки 0,05 - 0,15', '0.0'), + ('3.4.2', 'real', 'cycles-0_15-0_25_load-range', 'циклов в диапазоне загрузки 0,15 - 0,25', '0.0'), + ('3.4.3', 'real', 'cycles-0_25-0_35_load-range', 'циклов в диапазоне загрузки 0,25 - 0,35', '0.0'), + ('3.4.4', 'real', 'cycles-0_35-0_45_load-range', 'циклов в диапазоне загрузки 0,35 - 0,45', '0.0'), + ('3.4.5', 'real', 'cycles-0_45-0_55_load-range', 'циклов в диапазоне загрузки 0,45 - 0,55', '0.0'), + ('3.4.6', 'real', 'cycles-0_55-0_65_load-range', 'циклов в диапазоне загрузки 0,55 - 0,65', '0.0'), + ('3.4.7', 'real', 'cycles-0_65-0_75_load-range', 'циклов в диапазоне загрузки 0,65 - 0,75', '0.0'), + ('3.4.8', 'real', 'cycles-0_75-0_85_load-range', 'циклов в диапазоне загрузки 0,75 - 0,85', '0.0'), + ('3.4.9', 'real', 'cycles-0_85-0_95_load-range', 'циклов в диапазоне загрузки 0,85 - 0,95', '0.0'), + ('3.4.10', 'real', 'cycles-0_95-1_05_load-range', 'циклов в диапазоне загрузки 0,95 - 1,05', '0.0'), + ('3.4.11', 'real', 'cycles-1_05-1_15_load-range', 'циклов в диапазоне загрузки 1,05 - 1,15', '0.0'), + ('3.4.12', 'real', 'cycles-1_15-1_25_load-range', 'циклов в диапазоне загрузки 1,15 - 1,25', '0.0'), + ('3.4.13', 'real', 'cycles-1_15-_load-range', 'циклов в диапазоне загрузки 1,25 -', '0.0'), + ('3.5', 'real', 'crane-total-lifted-mass', 'суммарная масса поднятых грузов. тонн', '0.0'), + ('3.5.1', 'real', 'winch1-total-lifted-mass', 'суммарная масса поднятых грузов лебедка 1', '0.0'), + ('3.5.2', 'real', 'winch2-total-lifted-mass', 'суммарная масса поднятых грузов лебедка 2', '0.0'), + ('3.5.3', 'real', 'winch3-total-lifted-mass', 'суммарная масса поднятых грузов лебедка 3', '0.0'), + ('3.6.1', 'int', 'winch1-load-limiter-trip-count', 'количество срабатываний ограничителя грузоподъемности лебедка 1', '0'), + ('3.6.2', 'int', 'winch2-load-limiter-trip-count', 'количество срабатываний ограничителя грузоподъемности лебедка 2', '0'), + ('3.6.3', 'int', 'winch3-load-limiter-trip-count', 'количество срабатываний ограничителя грузоподъемности лебедка 3', '0'), + ('3.7', 'real', 'crane-characteristic-number', 'текущее характеристическое число для крана', '0.0'), + ('3.7.1', 'real', 'winch1-characteristic-number', 'текущее характеристическое число лебедка 1', '0.0'), + ('3.7.2', 'real', 'winch2-characteristic-number', 'текущее характеристическое число лебедка 2', '0.0'), + ('3.7.3', 'real', 'winch3-characteristic-number', 'текущее характеристическое число лебедка 3', '0.0'), + ('3.8', 'real', 'crane-load-spectrum-factor', 'коэффициент распределения нагрузок для крана', '0.0'), + ('3.8.1', 'real', 'winch1-load-spectrum-factor', 'коэффициент распределения нагрузок лебедка 1', '0.0'), + ('3.8.2', 'real', 'winch2-load-spectrum-factor', 'коэффициент распределения нагрузок лебедка 2', '0.0'), + ('3.8.3', 'real', 'winch3-load-spectrum-factor', 'коэффициент распределения нагрузок лебедка 3', '0.0'); diff --git a/sql/7_create_report.sql b/sql/7_create_report.sql new file mode 100644 index 00000000..a21599eb --- /dev/null +++ b/sql/7_create_report.sql @@ -0,0 +1,12 @@ +/* + ERROR REPORTING +*/ +drop table if exists "report"; +create table if not exists report ( + timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + code smallint NOT NULL, + message varchar(50) NOT NULL, + stack text NOT NULL, + PRIMARY KEY (timestamp) +); +comment on table report is 'Отчеты об ошибках в работе приложений.'; \ No newline at end of file diff --git a/sql/create_postgres_database.sql b/sql/create_postgres_database.sql index ad62eaf3..deda2adf 100644 --- a/sql/create_postgres_database.sql +++ b/sql/create_postgres_database.sql @@ -1,238 +1,32 @@ -do $$ -begin - - drop view if exists operating_cycle_metric_value_view; - drop view if exists operating_cycle_metric_value_view_test; - drop table if exists "app_user"; - drop table if exists "app_user_test"; - drop view if exists "event_view"; - drop view if exists "event_view_test"; - drop table if exists "tags"; - drop table if exists "tags_test"; - drop type if exists "tag_type_enum"; - drop type if exists "tag_type_enum_test"; - drop table if exists "event"; - drop table if exists "event_test"; - drop sequence if exists "event_uid_seq"; - drop sequence if exists "event_uid_seq_test"; - drop index if exists "fk_timestamp_idx1"; - drop index if exists "fk_timestamp_idx1_test"; - drop table if exists "report"; - drop table if exists "report_test"; - drop type if exists "user_role_enum"; - drop type if exists "user_role_enum_test"; - - /* - USER - */ - if not exists (SELECT 1 FROM pg_type WHERE typname = 'user_role_enum') THEN - create type user_role_enum AS ENUM ('admin','operator'); - end if; - create table if not exists app_user ( - id bigserial not null, - role user_role_enum not null, - name varchar(255) not null, --COMMENT 'ФИО Потльзователя', - login varchar(255) not null unique, --COMMENT ' Логин', - pass varchar(2584) not null, --COMMENT 'Пароль', - created timestamp not null default CURRENT_TIMESTAMP, - updated timestamp not null default CURRENT_TIMESTAMP, - deleted timestamp default null, - PRIMARY KEY (id, login) - ); - comment on table app_user is 'Потльзователи'; - comment on column app_user.role is 'Признак группировки'; - - - - /* - PROCESS TAG - */ - if not exists (SELECT 1 FROM pg_type WHERE typname = 'tag_type_enum') THEN - create type tag_type_enum as enum('Bool','Int','UInt','DInt','Word','LInt','Real','Time','Date_And_Time'); - end if; - create table if not exists tags ( - id serial not null, - type tag_type_enum not null, --COMMENT 'S7DataType(bool, int, uInt, dInt, word, lInt, real, time, dateAndTime)', - name varchar(255) not null unique, --COMMENT 'Имя тэга в системе', - description varchar(255) not null DEFAULT '', --COMMENT 'Дополнительная информация о тэге', - PRIMARY KEY (id) - ); - comment on table tags is 'Справочник тэгов проекта.'; - - - /* - PROCESS EVENT - */ - CREATE SEQUENCE event_uid_seq; - create table if not exists event ( - uid decimal(24,12) not null default nextval('event_uid_seq'), --'1.000000000000', --COMMENT 'Идентификатор записи', - timestamp timestamp not null, - pid int2 not null, --COMMENT 'Идентификатор тэга.', - value int2 not null, --COMMENT 'Значение тэга 0..255, аварийно если >0.', - status int2 not null, --COMMENT 'DsStatus as 0..255', - primary key (uid) - ); - comment on table event is 'События. Только тэги дискретных значений, регистрируется 0 - как норма, > 0 - как авария.'; - create index fk_timestamp_idx1 on event (timestamp asc); - - create or replace view event_view as - select - e.uid AS uid, - e.pid AS pid, - e.value AS value, - e.status AS status, - e.timestamp AS timestamp, - t.type AS type, - t.name AS name, - t.description AS description - from - (event e - left join tags t on - (e.pid = t.id)); - - - /* - PROCESS OPERATING CYCLE - */ - drop table if exists operating_cycle; - drop table if exists operating_cycle_metric; - drop table if exists operating_cycle_metric_value; - if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN - create type metric_data_type_enum as enum('bool','int','real','time','date','timestamp','string'); - end if; - - create table operating_cycle ( - id bigserial NOT NULL, -- 'Идентификатор записи рабочего цикла', - timestamp_start timestamp NOT NULL, --COMMENT 'Дата и время начала рабочего цикла', - timestamp_stop timestamp NOT NULL, --COMMENT 'Дата и время окончания рабочего цикла', - alarm_class char(2) NOT NULL, -- COMMENT 'Point alarm class as 0..15, 0 - no alarm', - PRIMARY KEY (id) - ); - create table operating_cycle_metric ( - id char(6) NOT NULL, --COMMENT 'Идентификатор метрики статистических значений рабочего цикла', - name varchar(255) NOT NULL, --COMMENT 'Имя метрики статистических значений рабочего цикла', - description varchar(255) NOT NULL, --COMMENT 'Имя метрики статистических значений рабочего цикла', - PRIMARY KEY (id) - --KEY name_idx1 (name) - ); - insert into operating_cycle_metric (id, name, description) values - (1, 'average', 'Среднее арифметическое'), - (2, 'max', 'Максимальное'), - (3, 'min', 'Минимальное'), - (4, 'trip_count', 'Количество срабатываний'), - (5, 'diviation_max', 'Максимальное отклонение'); - create table operating_cycle_metric_value ( - operating_cycle_id int8 NOT NULL, --COMMENT 'Идентификатор записи рабочего цикла, к которрй относится данная хапись', - pid int4 NOT NULL, --COMMENT 'ID тэга', - metric_id char(6) NOT NULL, --COMMENT 'Идентификатор метрики рабочего цикла, к которрй относится данная хапись', - value decimal(16,8) NOT NULL, --COMMENT 'Значеник метрики', - PRIMARY KEY (operating_cycle_id, pid, metric_id) - ); - create or replace view operating_cycle_metric_value_view as - select - ocmv.operating_cycle_id AS operating_cycle_id, - ocmv.pid AS "point_id", - tag.name AS point_name, - ocmv.metric_id AS "metric_id", - ocm."name" as metric_name, - ocmv.value AS value --- tag.type AS type, --- tag.description AS description - from - (operating_cycle_metric_value ocmv - left join tags tag on - (ocmv.pid = tag.id) - left join operating_cycle_metric ocm on - (ocmv.metric_id = ocm.id)); - - - /* - PROCESS OPERATING METRIC - */ - drop table if exists operating_metric; - if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN - create type metric_data_type_enum as enum('bool','int','real','time','date','timestamp','string'); - end if; - create table operating_metric ( - id char(6) NOT NULL unique, --COMMENT 'Идентификатор метрики', - type metric_data_type_enum not null, --COMMENT 'enum('bool','int','real','time','date','timestamp','string')', - name varchar(255) NOT NULL, --COMMENT 'Имя метрики', - description varchar(255) NOT NULL, --COMMENT 'Описание метрики', - value text NOT NULL, --COMMENT 'Значение метрики', - PRIMARY KEY (name) - ); - comment on table operating_metric is 'Общие метрики'; - insert into operating_metric (id, type, name, description, value) values - ('1.1', 'string', 'crane-type', 'тип крана', 'unknown'), - ('1.2', 'string', 'crane-index', 'индекс крана', 'unknown'), - ('1.3', 'string', 'crane-vendor', 'наименование предприятия - изготовителя крана', 'ООО "ТКЗ"'), - ('1.4', 'string', 'crane-serial-number', 'заводской номер крана', '000-000'), - ('1.5', 'date', 'crane-manufacturing-date', 'год изготовления крана', '2023-03-03'), - ('1.6', 'real', 'crane-capacity', 'грузоподъемность крана, тонны', '0.0'), - ('1.7', 'string', 'crane-classification-group', 'группа классификации (режима) крана', 'M8'), - ('1.7.1', 'string', 'winch1-classification-group', 'группа классификации (режима) лебедки 1 крана', 'M8'), - ('1.7.2', 'string', 'winch2-classification-group', 'группа классификации (режима) лебедки 2 крана', 'M8'), - ('1.7.3', 'string', 'winch3-classification-group', 'группа классификации (режима) лебедки 3 крана', 'M8'), - ('1.8', 'real', 'crane-nominal-characteristic-number', 'нор­мативное характеристическое число крана', '0.0'), - ('1.8.1', 'real', 'winch1-nominal-characteristic-number', 'нор­мативное характеристическое число лебедки 1 крана', '0.0'), - ('1.8.2', 'real', 'winch2-nominal-characteristic-number', 'нор­мативное характеристическое число лебедки 2 крана', '0.0'), - ('1.8.3', 'real', 'winch3-nominal-characteristic-number', 'нор­мативное характеристическое число лебедки 3 крана', '0.0'), - ('1.9', 'date', 'crane-commissioning-date', 'дата ввода крана в эксплуатацию', '2023-03-03'), - ('1.10', 'int', 'crane-standard-service-life ', 'нормативный срок службы крана', '0'), - ('2.1', 'string', 'fault-recorder-type', 'тип Регистратора параметров', 'Fault Recorder'), - ('2.2', 'string', 'fault-recorder-model', 'модификация Регистратора параметров', 'v0.0.1'), - ('2.3', 'string', 'fault-recorder-vendor', 'наименование предприятия - изготовителя Регистратора параметров', 'ООО "ТКЗ"'), - ('2.4', 'string', 'fault-recorder-serial-number', 'заводской номер Регистратора параметров', '000-000'), - ('2.5', 'date', 'fault-recorder-manufacturing-date', 'год изготовления Регистратора параметров', '2023-03-03'), - ('2.6', 'date', 'fault-recorder-installation-date', 'дата установки РП на кран', '2023-03-03'), - ('2.7', 'string', 'fault-recorder-installation-company', 'наименование организации, установившей Регистратора параметров на кран', 'ООО "ТКЗ"'), - ('3.1', 'real', 'crane-total-operating-hours', 'общее количество часов работы крана', '0.0'), - ('3.2.0', 'real', 'pump-total-operating-hours', 'общее количество часов работы насосной станции (моточасы)', '0.0'), - ('3.2.1', 'real', 'winch1-total-operating-hours', 'общее количество часов работы лебедки 1 (моточасы)', '0.0'), - ('3.2.2', 'real', 'winch2-total-operating-hours', 'общее количество часов работы лебедки 2 (моточасы)', '0.0'), - ('3.2.3', 'real', 'winch3-total-operating-hours', 'общее количество часов работы лебедки 3 (моточасы)', '0.0'), - ('3.3', 'int', 'total-operating-cycles-count', 'суммарное число рабочих циклов', '0'), - ('3.4', 'real', 'cycles-distribution-by-load-ranges', 'распределение циклов по диапазонам нагрузки', '0.0'), - ('3.4.1', 'real', 'cycles-0_05-0_15-load-range', 'циклов в диапазоне загрузки 0,05 - 0,15', '0.0'), - ('3.4.2', 'real', 'cycles-0_15-0_25_load-range', 'циклов в диапазоне загрузки 0,15 - 0,25', '0.0'), - ('3.4.3', 'real', 'cycles-0_25-0_35_load-range', 'циклов в диапазоне загрузки 0,25 - 0,35', '0.0'), - ('3.4.4', 'real', 'cycles-0_35-0_45_load-range', 'циклов в диапазоне загрузки 0,35 - 0,45', '0.0'), - ('3.4.5', 'real', 'cycles-0_45-0_55_load-range', 'циклов в диапазоне загрузки 0,45 - 0,55', '0.0'), - ('3.4.6', 'real', 'cycles-0_55-0_65_load-range', 'циклов в диапазоне загрузки 0,55 - 0,65', '0.0'), - ('3.4.7', 'real', 'cycles-0_65-0_75_load-range', 'циклов в диапазоне загрузки 0,65 - 0,75', '0.0'), - ('3.4.8', 'real', 'cycles-0_75-0_85_load-range', 'циклов в диапазоне загрузки 0,75 - 0,85', '0.0'), - ('3.4.9', 'real', 'cycles-0_85-0_95_load-range', 'циклов в диапазоне загрузки 0,85 - 0,95', '0.0'), - ('3.4.10', 'real', 'cycles-0_95-1_05_load-range', 'циклов в диапазоне загрузки 0,95 - 1,05', '0.0'), - ('3.4.11', 'real', 'cycles-1_05-1_15_load-range', 'циклов в диапазоне загрузки 1,05 - 1,15', '0.0'), - ('3.4.12', 'real', 'cycles-1_15-1_25_load-range', 'циклов в диапазоне загрузки 1,15 - 1,25', '0.0'), - ('3.4.13', 'real', 'cycles-1_15-_load-range', 'циклов в диапазоне загрузки 1,25 -', '0.0'), - ('3.5', 'real', 'crane-total-lifted-mass', 'суммарная масса поднятых грузов. тонн', '0.0'), - ('3.5.1', 'real', 'winch1-total-lifted-mass', 'суммарная масса поднятых грузов лебедка 1', '0.0'), - ('3.5.2', 'real', 'winch2-total-lifted-mass', 'суммарная масса поднятых грузов лебедка 2', '0.0'), - ('3.5.3', 'real', 'winch3-total-lifted-mass', 'суммарная масса поднятых грузов лебедка 3', '0.0'), - ('3.6.1', 'int', 'winch1-load-limiter-trip-count', 'количество срабатываний ограничителя грузоподъемности лебедка 1', '0'), - ('3.6.2', 'int', 'winch2-load-limiter-trip-count', 'количество срабатываний ограничителя грузоподъемности лебедка 2', '0'), - ('3.6.3', 'int', 'winch3-load-limiter-trip-count', 'количество срабатываний ограничителя грузоподъемности лебедка 3', '0'), - ('3.7', 'real', 'crane-characteristic-number', 'текущее характеристическое число для крана', '0.0'), - ('3.7.1', 'real', 'winch1-characteristic-number', 'текущее характеристическое число лебедка 1', '0.0'), - ('3.7.2', 'real', 'winch2-characteristic-number', 'текущее характеристическое число лебедка 2', '0.0'), - ('3.7.3', 'real', 'winch3-characteristic-number', 'текущее характеристическое число лебедка 3', '0.0'), - ('3.8', 'real', 'crane-load-spectrum-factor', 'коэффициент распределения нагрузок для крана', '0.0'), - ('3.8.1', 'real', 'winch1-load-spectrum-factor', 'коэффициент распределения нагрузок лебедка 1', '0.0'), - ('3.8.2', 'real', 'winch2-load-spectrum-factor', 'коэффициент распределения нагрузок лебедка 2', '0.0'), - ('3.8.3', 'real', 'winch3-load-spectrum-factor', 'коэффициент распределения нагрузок лебедка 3', '0.0'); - - - /* - ERROR REPORTING - */ - create table if not exists report ( - timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - code smallint NOT NULL, - message varchar(50) NOT NULL, - stack text NOT NULL, - PRIMARY KEY (timestamp) - ); - comment on table report is 'Отчеты об ошибках в работе приложений.'; - -end$$; +/* + USER +*/ +\i 1_create_user.sql + +/* + PROCESS TAG +*/ +\i 2_create_tag.sql + +/* + PROCESS EVENT +*/ +\i 3_create_event.sql +\i 4_create_event_view.sql + +/* + PROCESS OPERATING CYCLE +*/ +\i 5_create_operating_cycle.sql + + +/* + PROCESS OPERATING METRIC +*/ +\i 6_create_operating_metric.sql + + +/* + ERROR REPORTING +*/ +\i 7_create_report.sql \ No newline at end of file From b593119bd66f8b948c0fd44c8f60c37081e84f13 Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Tue, 23 Jan 2024 14:49:37 +0300 Subject: [PATCH 2/7] Added clean up triggers for event table --- sql/3_create_event.sql | 133 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 10 deletions(-) diff --git a/sql/3_create_event.sql b/sql/3_create_event.sql index aa208b66..db5feb6a 100644 --- a/sql/3_create_event.sql +++ b/sql/3_create_event.sql @@ -1,17 +1,130 @@ drop table if exists "event" CASCADE; -drop sequence if exists "event_uid_seq" CASCADE; -drop index if exists "fk_timestamp_idx1"; +drop index if exists "idx_event_timestamp"; /* PROCESS EVENT */ -CREATE SEQUENCE event_uid_seq; CREATE TABLE IF NOT EXISTS event ( - uid decimal(24,12) not null default nextval('event_uid_seq'), --'1.000000000000', --COMMENT 'Идентификатор записи', - timestamp timestamp not null, - pid int2 not null, --COMMENT 'Идентификатор тэга.', - value int2 not null, --COMMENT 'Значение тэга 0..255, аварийно если >0.', - status int2 not null, --COMMENT 'DsStatus as 0..255', - primary key (uid) + uid BIGSERIAL PRIMARY KEY, --'1.000000000000', --COMMENT 'Идентификатор записи', + timestamp TIMESTAMP NOT NULL, + pid int2 NOT NULL, --COMMENT 'Идентификатор тэга.', + value int2 NOT NULL, --COMMENT 'Значение тэга 0..255, аварийно если >0.', + status int2 NOT NULL --COMMENT 'DsStatus as 0..255', ); comment on table event is 'События. Только тэги дискретных значений, регистрируется 0 - как норма, > 0 - как авария.'; -create index fk_timestamp_idx1 on event (timestamp asc); \ No newline at end of file +CREATE INDEX idx_event_timestamp ON event (timestamp ASC); + +CREATE TABLE + IF NOT EXISTS event_utils ( + id SERIAL PRIMARY KEY, + row_count BIGINT, + row_limit BIGINT, + purge_batch_size INT, + purge_shift_size INT, + is_purge_running BOOLEAN + ); + +INSERT INTO + event_utils ( + row_count, + row_limit, + purge_batch_size, + purge_shift_size, + is_purge_running + ) +VALUES + (0, 6000000, 1000, 1000, 'f'); + +CREATE OR REPLACE FUNCTION event_purge_records() +RETURNS void +LANGUAGE plpgsql AS $$ +DECLARE + deleted INT; + to_delete INT; + batch_size INT; + is_purge_possible BOOLEAN; +BEGIN + SELECT (row_count - row_limit + purge_shift_size), purge_batch_size + FROM event_utils INTO to_delete, batch_size; + + WITH upd_result AS ( + UPDATE event_utils SET is_purge_running = true WHERE id = 1 AND is_purge_running = false + RETURNING * + ) SELECT count(*) = 1 FROM upd_result INTO is_purge_possible; + + IF is_purge_possible THEN + deleted := 0; + + WHILE (to_delete - deleted) > batch_size LOOP + WITH del_result AS ( + DELETE FROM event + WHERE ctid IN ( + SELECT ctid FROM event + ORDER BY timestamp, uid ASC + LIMIT batch_size + ) RETURNING * + ) SELECT (count(*) + deleted) FROM del_result into deleted; + END LOOP; + + DELETE FROM event WHERE ctid IN ( + SELECT ctid FROM event + ORDER BY timestamp, uid ASC + LIMIT (to_delete - deleted) + ); + + UPDATE event_utils SET is_purge_running = false WHERE id = 1; + END IF; +END; +$$; + +CREATE OR REPLACE FUNCTION event_check_for_purge() +RETURNS void +LANGUAGE plpgsql +AS $$ +DECLARE + is_purge_needed BOOLEAN; +BEGIN + SELECT row_count > row_limit FROM event_utils WHERE id = 1 INTO is_purge_needed; + IF is_purge_needed THEN + PERFORM event_purge_records(); + END IF; +END; +$$; + +CREATE OR REPLACE FUNCTION event_counter_inc() +RETURNS trigger +LANGUAGE plpgsql +AS $$ +DECLARE +add_count INT; +BEGIN + SELECT count(*) FROM new_tbl INTO add_count; + UPDATE event_utils SET row_count = COALESCE(row_count, 0) + add_count WHERE id = 1; + PERFORM event_check_for_purge(); + RETURN new; +END; +$$; + +CREATE OR REPLACE TRIGGER event_insert_trigger +AFTER INSERT ON event +REFERENCING NEW TABLE AS new_tbl +FOR EACH STATEMENT +EXECUTE PROCEDURE event_counter_inc(); + +CREATE OR REPLACE FUNCTION event_counter_dec() +RETURNS trigger +LANGUAGE plpgsql +AS $$ +DECLAREz + del_count INT; +BEGIN + SELECT count(*) FROM old_tbl INTO del_count; + UPDATE event_utils SET row_count = COALESCE(row_count, 0) - del_count WHERE id = 1; + RETURN new; +END; +$$; + +CREATE OR REPLACE TRIGGER event_delete_trigger +AFTER DELETE ON event +REFERENCING OLD TABLE AS old_tbl +FOR EACH STATEMENT +EXECUTE PROCEDURE event_counter_dec(); \ No newline at end of file From 8b5d4bb3e35d6ba598085b024ecef7051e03f3ff Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Tue, 23 Jan 2024 14:50:37 +0300 Subject: [PATCH 3/7] Fixed typo --- sql/1_create_user.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/1_create_user.sql b/sql/1_create_user.sql index 898ab633..e974923e 100644 --- a/sql/1_create_user.sql +++ b/sql/1_create_user.sql @@ -21,5 +21,5 @@ create table if not exists app_user ( deleted timestamp default null, PRIMARY KEY (id, login) ); -comment on table app_user is 'Потльзователи'; +comment on table app_user is 'Пользователи'; comment on column app_user.role is 'Признак группировки'; \ No newline at end of file From 2c24d9825d6d46f207a8282bf0edaf3a629eac47 Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Wed, 24 Jan 2024 08:49:19 +0300 Subject: [PATCH 4/7] Dropping the entire database instead of manually dropping each component --- sql/1_create_user.sql | 2 -- sql/2_create_tag.sql | 2 -- sql/3_create_event.sql | 4 +--- sql/5_create_operating_cycle.sql | 4 ---- sql/6_create_operating_metric.sql | 1 - sql/7_create_report.sql | 1 - sql/create_postgres_database.sql | 5 +++++ 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/sql/1_create_user.sql b/sql/1_create_user.sql index e974923e..bc32757b 100644 --- a/sql/1_create_user.sql +++ b/sql/1_create_user.sql @@ -1,5 +1,3 @@ -drop table if exists "app_user"; -drop type if exists "user_role_enum" CASCADE; /* USER */ diff --git a/sql/2_create_tag.sql b/sql/2_create_tag.sql index 0bcc11ba..37778c63 100644 --- a/sql/2_create_tag.sql +++ b/sql/2_create_tag.sql @@ -1,5 +1,3 @@ -drop table if exists "tags" CASCADE; -drop type if exists "tag_type_enum" CASCADE; /* PROCESS TAG */ diff --git a/sql/3_create_event.sql b/sql/3_create_event.sql index db5feb6a..cc25c8f0 100644 --- a/sql/3_create_event.sql +++ b/sql/3_create_event.sql @@ -1,5 +1,3 @@ -drop table if exists "event" CASCADE; -drop index if exists "idx_event_timestamp"; /* PROCESS EVENT */ @@ -114,7 +112,7 @@ CREATE OR REPLACE FUNCTION event_counter_dec() RETURNS trigger LANGUAGE plpgsql AS $$ -DECLAREz +DECLARE del_count INT; BEGIN SELECT count(*) FROM old_tbl INTO del_count; diff --git a/sql/5_create_operating_cycle.sql b/sql/5_create_operating_cycle.sql index cf6260dc..a39ad3f6 100644 --- a/sql/5_create_operating_cycle.sql +++ b/sql/5_create_operating_cycle.sql @@ -1,10 +1,6 @@ /* PROCESS OPERATING CYCLE */ -drop table if exists operating_cycle; -drop table if exists operating_cycle_metric CASCADE; -drop table if exists operating_cycle_metric_value CASCADE; -drop view if exists operating_cycle_metric_value_view; do $$ begin if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN diff --git a/sql/6_create_operating_metric.sql b/sql/6_create_operating_metric.sql index b038ad40..f2509c59 100644 --- a/sql/6_create_operating_metric.sql +++ b/sql/6_create_operating_metric.sql @@ -1,7 +1,6 @@ /* PROCESS OPERATING METRIC */ -drop table if exists operating_metric; do $$ begin if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN diff --git a/sql/7_create_report.sql b/sql/7_create_report.sql index a21599eb..47a93c66 100644 --- a/sql/7_create_report.sql +++ b/sql/7_create_report.sql @@ -1,7 +1,6 @@ /* ERROR REPORTING */ -drop table if exists "report"; create table if not exists report ( timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, code smallint NOT NULL, diff --git a/sql/create_postgres_database.sql b/sql/create_postgres_database.sql index deda2adf..489fb068 100644 --- a/sql/create_postgres_database.sql +++ b/sql/create_postgres_database.sql @@ -1,3 +1,8 @@ +\c postgres +DROP DATABASE IF EXISTS crane_data_server; +CREATE DATABASE crane_data_server WITH ENCODING 'UTF8'; +\c crane_data_server + /* USER */ From dc7317ddc047d95d5e11453600a97da476ca5d07 Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Thu, 25 Jan 2024 20:12:14 +0300 Subject: [PATCH 5/7] Added fault table --- sql/8_create_fault.sql | 8 ++++++++ sql/create_postgres_database.sql | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 sql/8_create_fault.sql diff --git a/sql/8_create_fault.sql b/sql/8_create_fault.sql new file mode 100644 index 00000000..9dfa7096 --- /dev/null +++ b/sql/8_create_fault.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS fault ( + timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + pid int2 NOT NULL, + value decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT 'Нагрузка лебедки 1 (тонны)', --COMMENT 'Значение тэга 0..255, аварийно если >0.', + PRIMARY KEY (timestamp, pid) +); +COMMENT ON TABLE event IS 'Записи регистратора. Только тэги аналоговых значений, регистрируемые по изменению.'; +CREATE INDEX idx_fault_timestamp ON event (timestamp ASC); \ No newline at end of file diff --git a/sql/create_postgres_database.sql b/sql/create_postgres_database.sql index 489fb068..4ed96d60 100644 --- a/sql/create_postgres_database.sql +++ b/sql/create_postgres_database.sql @@ -34,4 +34,9 @@ CREATE DATABASE crane_data_server WITH ENCODING 'UTF8'; /* ERROR REPORTING */ -\i 7_create_report.sql \ No newline at end of file +\i 7_create_report.sql + +/* + FAULTS +*/ +\i 8_create_fault.sql \ No newline at end of file From 3589b7695a5f67a33188a9d6c69abe0ae67047bb Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Wed, 31 Jan 2024 18:12:58 +0300 Subject: [PATCH 6/7] Added drops of all entities to each separate sql script --- sql/1_create_user.sql | 4 ++++ sql/2_create_tag.sql | 4 ++++ sql/3_create_event.sql | 11 +++++++++++ sql/4_create_event_view.sql | 3 +++ sql/5_create_operating_cycle.sql | 7 +++++++ sql/6_create_operating_metric.sql | 4 ++++ sql/7_create_report.sql | 3 +++ sql/8_create_fault.sql | 6 +++++- 8 files changed, 41 insertions(+), 1 deletion(-) diff --git a/sql/1_create_user.sql b/sql/1_create_user.sql index bc32757b..263c742b 100644 --- a/sql/1_create_user.sql +++ b/sql/1_create_user.sql @@ -1,6 +1,10 @@ /* USER */ +-- Cleanup +DROP TABLE IF EXISTS app_user; +DROP TYPE IF EXISTS user_role_enum CASCADE; +-- Creation do $$ begin if not exists (SELECT 1 FROM pg_type WHERE typname = 'user_role_enum') THEN diff --git a/sql/2_create_tag.sql b/sql/2_create_tag.sql index 37778c63..dc0a580d 100644 --- a/sql/2_create_tag.sql +++ b/sql/2_create_tag.sql @@ -1,6 +1,10 @@ /* PROCESS TAG */ +-- Cleanup +DROP TABLE IF EXISTS tags; +DROP TYPE IF EXISTS tag_type_enum CASCADE; +-- Creation do $$ begin if not exists (SELECT 1 FROM pg_type WHERE typname = 'tag_type_enum') THEN diff --git a/sql/3_create_event.sql b/sql/3_create_event.sql index cc25c8f0..4bb3c3a1 100644 --- a/sql/3_create_event.sql +++ b/sql/3_create_event.sql @@ -1,6 +1,17 @@ /* PROCESS EVENT */ +-- Cleanup +DROP TRIGGER IF EXISTS event_insert_trigger ON event; +DROP TRIGGER IF EXISTS event_delete_trigger ON event; +DROP FUNCTION IF EXISTS event_purge_records(); +DROP FUNCTION IF EXISTS event_check_for_purge(); +DROP FUNCTION IF EXISTS event_counter_inc(); +DROP FUNCTION IF EXISTS event_counter_dec(); +DROP INDEX IF EXISTS idx_event_timestamp; +DROP TABLE IF EXISTS event; +DROP TABLE IF EXISTS event_utils; +-- Creation CREATE TABLE IF NOT EXISTS event ( uid BIGSERIAL PRIMARY KEY, --'1.000000000000', --COMMENT 'Идентификатор записи', timestamp TIMESTAMP NOT NULL, diff --git a/sql/4_create_event_view.sql b/sql/4_create_event_view.sql index 11b8f6ef..4bdfaaae 100644 --- a/sql/4_create_event_view.sql +++ b/sql/4_create_event_view.sql @@ -1,3 +1,6 @@ +-- Cleanup +DROP VIEW IF EXISTS event_view; +-- Creation create or replace view event_view as select e.uid AS uid, diff --git a/sql/5_create_operating_cycle.sql b/sql/5_create_operating_cycle.sql index a39ad3f6..8099458f 100644 --- a/sql/5_create_operating_cycle.sql +++ b/sql/5_create_operating_cycle.sql @@ -1,6 +1,13 @@ /* PROCESS OPERATING CYCLE */ +-- Cleanup +DROP VIEW IF EXISTS operating_cycle_metric_value_view; +DROP TABLE IF EXISTS operating_cycle; +DROP TABLE IF EXISTS operating_cycle_metric; +DROP TABLE IF EXISTS operating_cycle_metric_value; +DROP TYPE IF EXISTS metric_data_type_enum CASCADE; +-- Creation do $$ begin if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN diff --git a/sql/6_create_operating_metric.sql b/sql/6_create_operating_metric.sql index f2509c59..e08ff049 100644 --- a/sql/6_create_operating_metric.sql +++ b/sql/6_create_operating_metric.sql @@ -1,6 +1,10 @@ /* PROCESS OPERATING METRIC */ +-- Cleanup +DROP TABLE IF EXISTS operating_metric; +DROP TYPE IF EXISTS metric_data_type_enum CASCADE; +-- Creation do $$ begin if not exists (SELECT 1 FROM pg_type WHERE typname = 'metric_data_type_enum') THEN diff --git a/sql/7_create_report.sql b/sql/7_create_report.sql index 47a93c66..f48db446 100644 --- a/sql/7_create_report.sql +++ b/sql/7_create_report.sql @@ -1,6 +1,9 @@ /* ERROR REPORTING */ +-- Cleanup +DROP TABLE IF EXISTS report; +-- Creation create table if not exists report ( timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, code smallint NOT NULL, diff --git a/sql/8_create_fault.sql b/sql/8_create_fault.sql index 9dfa7096..5e692e37 100644 --- a/sql/8_create_fault.sql +++ b/sql/8_create_fault.sql @@ -1,7 +1,11 @@ +-- Cleanup +DROP INDEX IF EXISTS idx_fault_timestamp; +DROP TABLE IF EXISTS report; +-- Creation CREATE TABLE IF NOT EXISTS fault ( timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, pid int2 NOT NULL, - value decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT 'Нагрузка лебедки 1 (тонны)', --COMMENT 'Значение тэга 0..255, аварийно если >0.', + value decimal(8,2) NOT NULL DEFAULT '0.00', --COMMENT 'Нагрузка лебедки 1 (тонны)', --COMMENT 'Значение тэга 0..255, аварийно если >0.', PRIMARY KEY (timestamp, pid) ); COMMENT ON TABLE event IS 'Записи регистратора. Только тэги аналоговых значений, регистрируемые по изменению.'; From ce5efc14b560bef119af048714fc5399060b6623 Mon Sep 17 00:00:00 2001 From: Anton Lobanov Date: Tue, 26 Mar 2024 13:17:48 +0300 Subject: [PATCH 7/7] Update 3_create_event.sql --- sql/3_create_event.sql | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/sql/3_create_event.sql b/sql/3_create_event.sql index 4bb3c3a1..e45d3b27 100644 --- a/sql/3_create_event.sql +++ b/sql/3_create_event.sql @@ -9,6 +9,7 @@ DROP FUNCTION IF EXISTS event_check_for_purge(); DROP FUNCTION IF EXISTS event_counter_inc(); DROP FUNCTION IF EXISTS event_counter_dec(); DROP INDEX IF EXISTS idx_event_timestamp; +DROP VIEW IF EXISTS event_view; DROP TABLE IF EXISTS event; DROP TABLE IF EXISTS event_utils; -- Creation @@ -113,12 +114,6 @@ BEGIN END; $$; -CREATE OR REPLACE TRIGGER event_insert_trigger -AFTER INSERT ON event -REFERENCING NEW TABLE AS new_tbl -FOR EACH STATEMENT -EXECUTE PROCEDURE event_counter_inc(); - CREATE OR REPLACE FUNCTION event_counter_dec() RETURNS trigger LANGUAGE plpgsql @@ -132,8 +127,14 @@ BEGIN END; $$; -CREATE OR REPLACE TRIGGER event_delete_trigger -AFTER DELETE ON event -REFERENCING OLD TABLE AS old_tbl -FOR EACH STATEMENT -EXECUTE PROCEDURE event_counter_dec(); \ No newline at end of file +create trigger event_insert_trigger + AFTER INSERT ON public."event" + REFERENCING NEW TABLE AS new_tbl + FOR EACH STATEMENT + EXECUTE PROCEDURE public.event_counter_inc(); + +create trigger event_delete_trigger + AFTER DELETE ON event + REFERENCING OLD TABLE AS old_tbl + FOR EACH STATEMENT + EXECUTE PROCEDURE public.event_counter_dec();