.. _check_adapter_config: Конфигурация Агента проверок (application.yml) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл ``application.yml`` – основной конфигурационный файл Агента проверок, в котором задана логика и порядок работы модуля: .. _check_application.yml: Пример файла application.yml ################################### В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач. .. code-block:: yaml management: endpoint: health: show-details: always prometheus: metrics: export: enabled: true endpoints: web: exposure: include: health, prometheus, configprops, env metrics: tags: application: check-adapter-dqf namespace: ${POD_NAMESPACE:local} pod: ${POD_NAME:local} node_name: ${NODE_NAME:local} spring: task: scheduling: pool: size: 5 profiles: # В профилях указывается какой функционал необходим (dqf- проверки качества, std - стандартизация) active: ${PROFILES_ACTIVE:dqf} liquibase: enabled: true analytics-enabled: false contexts: ${spring.profiles.active} change-log: classpath:/liquibase-changes/changelog.xml driver-class-name: ru.datamart.prostore.jdbc.Driver url: ${adapter.prostore.jdbc.prostoreUrl} liquibase-schema: ${dqf.schema} default-schema: ${dqf.schema} database-change-log-table: check_adapter_changelog database-change-log-lock-table: check_adapter_changeloglock server: port: ${HTTP_PORT:3010} logging: include-application-name: false pattern: level: "%5p [%mdc]" adapter: # Отправку в мониторинг можно выключить useMonitoring: ${USE_MONITORING:false} adapterNg: http: url: http://10.81.7.90:28358/ useAdapter: ${USE_NG_ADAPTER:true} podd: http: url: http://158.160.13.119:8172/ prostore: jdbc: prostoreUrl: ${PROSTORE_JDBC_URL:jdbc:prostore://localhost:9191/} driverClassName: ${PROSTORE_JDBC_DRIVER_CLASS:ru.datamart.prostore.jdbc.Driver} http: prostoreUrl: ${PROSTORE_HTTP_URL:http://localhost:9191/} maxConnections: ${PROSTORE_MAX_CONNECTIONS:1000} maxConnectionsPerHost: ${PROSTORE_MAX_CONNECTIONS_PER_HOST:1000} # Количество записей получаемых для отправки в топик input fetchSize: ${PROSTORE_FETCH_SIZE:10000} # Буферизация данных в памяти для кодеков webclient maxInMemorySize: ${PROSTORE_MAX_IN_MEMORY_SIZE:16777216} # Количество потоков трансфорирующих данные до покладки в input топик concurrency: ${PROSTORE_THREAD_COUNT:16} webclient: input: connProvider: # Максимальное число одновременно открытых соединений в пуле. maxConnections: ${ADAPTER_QUALITY_RECORD_INPUT_MAX_CONNECTIONS:1000} retry: initialDelayMs: ${ADAPTER_QUALITY_RECORD_INPUT_INITIAL_DELAY_MS:1000} maxDelayMs: ${ADAPTER_QUALITY_RECORD_INPUT_MAX_DELAY_MS:5000} output: connProvider: # Максимальное число одновременно открытых соединений в пуле. maxConnections: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_CONNECTIONS:1000} # Максимальное время ожидания без активности для одного соединения maxIdleTime: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_IDLE_TIME:60} # Общее время жизни соединения от момента его создания maxLifeTime: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_LIFE_TIME:120} # Интервал, с каким фоновой задачей будет выполняться проверка и удаления "протухших" (idle/expired) соединений evictInBackground: ${ADAPTER_QUALITY_RECORD_OUTPUT_EVICT_IN_BACKGROUND:30} retry: initialDelayMs: ${ADAPTER_QUALITY_RECORD_OUTPUT_INITIAL_DELAY_MS:1000} maxDelayMs: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_DELAY_MS:5000} execAlg: connProvider: # Максимальное число одновременно открытых соединений в пуле. maxConnections: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_CONNECTIONS:1000} # Максимальное время ожидания без активности для одного соединения maxIdleTime: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_IDLE_TIME:60} # Общее время жизни соединения от момента его создания maxLifeTime: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_LIFE_TIME:120} # Интервал, с каким фоновой задачей будет выполняться проверка и удаления "протухших" (idle/expired) соединений evictInBackground: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_EVICT_IN_BACKGROUND:30} retry: initialDelayMs: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_INITIAL_DELAY_MS:1000} maxDelayMs: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_DELAY_MS:5000} prostore-rest-client: host: localhost port: 9191 dqf: quality: bufferSize: 1000 capacity: incomeQueue: ${DQF_QUALITY_CAPACITY_INCOME_QUEUE:1000} outcomeQueue: ${DQF_QUALITY_CAPACITY_INCOME_QUEUE:1000} threads: recordThreads: ${DQF_QUALITY_RECORD_THREAD_COUNT:1} checkThreads: ${DQF_QUALITY_CHECK_THREAD_COUNT:1} consumerAsyncThreads: ${DQF_QUALITY_CONSUMER_ASYNC_THREADS:1} retry: initialDelayMs: ${DQF_QUALITY_INITIAL_DELAY_MS:1000} maxDelayMs: ${DQF_QUALITY_MAX_DELAY_MS:5000} # Явное указание схемы для dqf schema: ${DQF_SCHEMA:reg_datamart_dqf} # Список datasource простора, в которых необходимо создавать snapshot таблицы data-sources: ${DQF_DATA_SOURCES:} deleteOldErrorsCron: '0 0 1 * * *' retry: times: 0 initialDelay: 1s maxDelay: 5s nsud: # Задача получения от нсуд списка проверок nsudCron: '0 */5 * * * *' nsudUrlList: ${NSUD_URL_LIST:http://10.81.7.90:24013/api/dqf/api/v3/dqf_check_versions} nsudUrlAck: ${NSUD_URL_ACK:http://10.81.7.90:24013/api/dqf/api/v3/dqf_check_versions/activations} requestTimeout: 1m useHash: ${NSUD_USE_HASH:true} pebble: interval: ${NSUD_PEBBLE_INTERVAL:PT30s} idleDelay: ${NSUD_PEBBLE_IDLE_DELAY:PT1m} pebbleRefresh: ${NSUD_PEBBLE_REFRESH:PT5m} # Необходимо указать список датамартов по которым требуется получать список проверок datamarts: - eduejd01 agg: # Задача по агрегации данных сохранение в таблицу aggregation и последующая отправка по rest aggCron: '0 0 0 31 2 *' aggArmDsCron: '0 0 0 31 2 *' aggUrl: ${AGGREGATION_URL:http://10.81.7.90:24013/api/dqf/pkch/api/v3/dqf_check_reports} aggArmDsStatUrl: http://10.81.7.90:12114/MNSV17/pmd/api/v3/data_mart_check_adapter_stats/ entriesLimit: 100 incident: # Лимит на количество отправленных данных за время определенное в limitCron limitCount: ${INC_RATE_LIMITER_COUNT:1000} # Время в течении которого сохраняется количество отправленных данных limitCron: 0 0 * * * * Параметры конфигурации ^^^^^^^^^^^^^^^^^^^^^^ Настройка конфигурации сервиса генерации уникального номера осуществляется путем редактирования параметров настроек в файле ``application.yml``, где настраиваются секции: - ``management`` – настройка внутренних эндпоинтов и метрик; - ``spring`` – настройка Spring Boot и профиля работы приложения; - ``server`` – настройка использования альтернативного значения серверного порта; - ``adapter`` – настройка параметров вызова внешних сервисов; - ``prostore-rest-client`` - настройки подключения к REST-клиенту Prostore; - ``dqf`` – настройка параметров передачи данных аудита ГосТех; - ``nsud`` – настройка взаимодействия с ЕИП НСУД; - ``agg`` – настройка плана выполнения агрегаций; - ``incident`` – настройка отправки единичных инцидентов качества. Секция management ################### В секции ``management`` хранятся настройки внутренних эндпоинтов и метрик. Например: .. code-block:: yaml management: endpoint: health: show-details: always prometheus: metrics: export: enabled: true endpoints: web: exposure: include: health, prometheus, configprops, env metrics: tags: application: check-adapter-dqf namespace: ${POD_NAMESPACE:local} pod: ${POD_NAME:local} node_name: ${NODE_NAME:local} **Параметры настроек** - ``endpoint.health.show-details`` - детализация статуса health; - ``prometheus.metrics.export.enabled`` - экспорт метрик Prometheus; - ``endpoints.web.exposure.include`` - список доступных HTTP-эндпоинтов; - ``metrics.tags.*`` - метки, добавляемые к метрикам. Секция spring ################### В секции ``spring`` хранятся настройки Spring Boot и профиля работы приложения. Например: .. code-block:: yaml spring: task: scheduling: pool: size: 5 profiles: # В профилях указывается какой функционал необходим (dqf- проверки качества, std - стандартизация) active: ${PROFILES_ACTIVE:dqf} liquibase: enabled: true analytics-enabled: false contexts: ${spring.profiles.active} change-log: classpath:/liquibase-changes/changelog.xml driver-class-name: ru.datamart.prostore.jdbc.Driver url: ${adapter.prostore.jdbc.prostoreUrl} liquibase-schema: ${dqf.schema} default-schema: ${dqf.schema} database-change-log-table: check_adapter_changelog database-change-log-lock-table: check_adapter_changeloglock **Параметры настроек** - ``task.scheduling.pool.size`` - размер пула планировщика задач Spring; - ``profiles.active`` - активные профили приложения. Для задачи проверки качества данных используется профиль ``dqf``, для задач по стандартизации - ``std``; - ``enabled`` - признак включения/отключения миграций; - ``analytics-enabled`` - флаг подключения статистики; - ``contexts`` - наименование профилей запуска чек адаптера. Допустимые значения: ``std``, ``dqf``. При использовании нескольких профилей, перечисление осуществляется через запятую; - ``change-log`` - путь к файлам миграций, которые находятся внутри jar; - ``driver-class-name`` - имя JDBC-драйвера Prostore. Константа, без переопределения. - ``url`` - адрес подключения к простору в формате JDBC. Переопределять не потребуется, конструируется из параметров подключения к Prostore; - ``liquibase-schema`` - имя датамарта, в котором будут созданы служебные таблицы liquibase; - ``database-change-log-table`` - имя таблицы хранения истории выполненных миграций; - ``database-change-log-lock-table`` - имя таблицы для блокировок, константа. Секция server ################### В секции ``server`` хранятся настройки использования альтернативного значения серверного порта. Существует два варианта изменения дефолтного значения номера порта: 1. Значение может быть передано через переменную окружения ``SERVER_PORT``. В случае запуска приложения с помощью **systemd** переменную необходимо передать через указание ``Environment="HTTP_PORT=3010"`` в ``.service-файле``. В случае прямого запуска, переменная должна быть задана на уровне ОС на момент запуска приложения. 2. Возможно указать в конфигурационном файле следующую настройку: .. code-block:: yaml server: port: ${HTTP_PORT:3010} **Параметры настроек** - ``port`` - порт сервера, значение может быть изменено на нужное. Секция logging ################### В секции ``logging`` хранятся настройки параметров логирования. Например: .. code-block:: yaml logging: include-application-name: false pattern: level: "%5p [%mdc]" **Параметры настроек** - ``include-application-name`` - флаг отключения вывода в лог в каждой строке имени приложения (консоль); - ``level`` - шаблон для уровня логирования: уровень (TRACE / DEBUG / INFO /WARN / ERROR). Секция adapter ################### В секции ``adapter`` хранятся настройки параметров вызова внешних сервисов. Например: .. code-block:: yaml adapter: # Отправку в мониторинг можно выключить useMonitoring: ${USE_MONITORING:false} adapterNg: http: url: http://10.81.7.90:28358/ useAdapter: ${USE_NG_ADAPTER:true} podd: http: url: http://158.160.13.119:8172/ prostore: jdbc: prostoreUrl: ${PROSTORE_JDBC_URL:jdbc:prostore://localhost:9191/} driverClassName: ${PROSTORE_JDBC_DRIVER_CLASS:ru.datamart.prostore.jdbc.Driver} http: prostoreUrl: ${PROSTORE_HTTP_URL:http://localhost:9191/} maxConnections: ${PROSTORE_MAX_CONNECTIONS:1000} maxConnectionsPerHost: ${PROSTORE_MAX_CONNECTIONS_PER_HOST:1000} # Количество записей получаемых для отправки в топик input fetchSize: ${PROSTORE_FETCH_SIZE:10000} # Буферизация данных в памяти для кодеков webclient maxInMemorySize: ${PROSTORE_MAX_IN_MEMORY_SIZE:16777216} # Количество потоков трансфорирующих данные до покладки в input топик concurrency: ${PROSTORE_THREAD_COUNT:16} webclient: input: connProvider: # Максимальное число одновременно открытых соединений в пуле. maxConnections: ${ADAPTER_QUALITY_RECORD_INPUT_MAX_CONNECTIONS:1000} retry: initialDelayMs: ${ADAPTER_QUALITY_RECORD_INPUT_INITIAL_DELAY_MS:1000} maxDelayMs: ${ADAPTER_QUALITY_RECORD_INPUT_MAX_DELAY_MS:5000} output: connProvider: # Максимальное число одновременно открытых соединений в пуле. maxConnections: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_CONNECTIONS:1000} # Максимальное время ожидания без активности для одного соединения maxIdleTime: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_IDLE_TIME:60} # Общее время жизни соединения от момента его создания maxLifeTime: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_LIFE_TIME:120} # Интервал, с каким фоновой задачей будет выполняться проверка и удаления "протухших" (idle/expired) соединений evictInBackground: ${ADAPTER_QUALITY_RECORD_OUTPUT_EVICT_IN_BACKGROUND:30} retry: initialDelayMs: ${ADAPTER_QUALITY_RECORD_OUTPUT_INITIAL_DELAY_MS:1000} maxDelayMs: ${ADAPTER_QUALITY_RECORD_OUTPUT_MAX_DELAY_MS:5000} execAlg: connProvider: # Максимальное число одновременно открытых соединений в пуле. maxConnections: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_CONNECTIONS:1000} # Максимальное время ожидания без активности для одного соединения maxIdleTime: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_IDLE_TIME:60} # Общее время жизни соединения от момента его создания maxLifeTime: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_LIFE_TIME:120} # Интервал, с каким фоновой задачей будет выполняться проверка и удаления "протухших" (idle/expired) соединений evictInBackground: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_EVICT_IN_BACKGROUND:30} retry: initialDelayMs: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_INITIAL_DELAY_MS:1000} maxDelayMs: ${ADAPTER_QUALITY_RECORD_EXEC_ALG_MAX_DELAY_MS:5000} **Параметры настроек** - ``adapter.useMonitoring`` - подключение мониторинга; - ``adapterNg.http.url`` - URL сервиса ИУА; - ``adapterNg.http.useAdapter`` - используется ли ИУА для взаимодействия со СМЭВ 3; - ``podd.http.url`` - URL сервиса Агент СМЭВ 4, необходимо указывать порт для взаимодействия именно через Rest-api (по умолчанию в Агенте СМЭВ 4 8172); - ``prostore.jdbc.*`` - JDBC-параметры подключения к Prostore; - ``prostore.http.*`` - HTTP-параметры подключения к Prostore; - ``fetchSize`` - количество записей, получаемых при поточной выборке из компонента Prostore; - ``pormaxInMemorySizet`` - буферизация данных в памяти для кодеков webclient; - ``concurrency`` - количество потоков трансформирующих данные, после извлечения; - ``webclient.input.connProvider.maxConnections`` - максимальное число одновременно открытых соединений в пуле; - ``webclient.input.retry.initialDelayMs`` - начальное время паузы перед выполнением новой попытки вызова при получении ошибки; - ``webclient.input.retry.maxDelayMs`` - конечное время паузы перед выполнением новой попытки вызова при получении ошибки; - ``webclient.output.connProvider.maxIdleTime`` - максимальное время ожидания без активности для одного соединения; - ``webclient.output.connProvider.maxLifeTime`` - общее время жизни соединения от момента его создания; - ``webclient.output.connProvider.evictInBackground`` - интервал, с которым фоновой задачей будет выполняться проверка и удаления истекших (idle/expired) соединений; - ``webclient.output.retry.initialDelayMs`` - начальное время паузы перед выполнением новой попытки вызова при получении ошибки; - ``webclient.output.retry.maxDelayMs`` - конечное время паузы перед выполнением новой попытки вызова при получении ошибки; - ``webclient.execAlg.connProvider.maxConnections`` - максимальное число одновременно открытых соединений в пуле; - ``webclient.execAlg.connProvider. maxIdleTime`` - максимальное время ожидания без активности для одного соединения; - ``webclient.execAlg.connProvider.maxLifeTime`` - общее время жизни соединения от момента его создания; - ``webclient.execAlg.connProvider.evictInBackground`` - интервал, с которым фоновой задачей будет выполняться проверка и удаления истекших (idle/expired) соединений; - ``powebclient. execAlg.retry.initialDelayMsrt`` - начальное время паузы перед выполнением новой попытки вызова при получении ошибки; - ``webclient.execAlg.retry.maxDelayMs`` - конечное время паузы перед выполнением новой попытки вызова при получении ошибки. Секция prostore-rest-client ############################### В секции ``prostore-rest-client`` хранятся настройки подключения к REST-клиенту Prostore. Например: .. code-block:: yaml prostore-rest-client: host: localhost port: 9191 **Параметры настроек** - ``host`` - адрес хоста подключения; - ``port`` - порт подключения. Секция dqf ################### В секции ``dqf`` хранятся настройки параметров передачи данных аудита ГосТех. Например: .. code-block:: yaml dqf: quality: bufferSize: 1000 capacity: incomeQueue: ${DQF_QUALITY_CAPACITY_INCOME_QUEUE:1000} outcomeQueue: ${DQF_QUALITY_CAPACITY_INCOME_QUEUE:1000} threads: recordThreads: ${DQF_QUALITY_RECORD_THREAD_COUNT:1} checkThreads: ${DQF_QUALITY_CHECK_THREAD_COUNT:1} consumerAsyncThreads: ${DQF_QUALITY_CONSUMER_ASYNC_THREADS:1} retry: initialDelayMs: ${DQF_QUALITY_INITIAL_DELAY_MS:1000} maxDelayMs: ${DQF_QUALITY_MAX_DELAY_MS:5000} # Явное указание схемы для dqf schema: ${DQF_SCHEMA:reg_datamart_dqf} # Список datasource простора, в которых необходимо создавать snapshot таблицы data-sources: ${DQF_DATA_SOURCES:} deleteOldErrorsCron: '0 0 1 * * *' **Параметры настроек** - ``bufferSize`` - размер внутреннего пакета обработки; - ``incomeQueue`` - размер внутренней очереди извлечения данных; - ``outcomeQueue`` - размер очереди на отправку в ПО Prostore; - ``recordThreads`` - количество тредов на получение списка идентификаторов; - ``checkThreads`` - количество тредов на проверку полученых данных; - ``consumerAsyncThreads`` - количество тредов на извлечение данных из внутренней очереди; - ``schema`` - наименование служебной схемы (формируется по шаблону: ``{имя_основной_схемы}_dqf``); - ``data-sources`` - Список датасорсов Prostore, в которых необходимо создавать snapshot таблицы; - ``deleteOldErrorsCron`` - периодичность удаления старых ошибок. Секция nsud ################### В секции ``nsud`` хранятся настройки взаимодействия с ЕИП НСУД. Например: .. code-block:: yaml nsud: # Задача получения от нсуд списка проверок nsudCron: '0 */5 * * * *' nsudUrlList: ${NSUD_URL_LIST:http://10.81.7.90:24013/api/dqf/api/v3/dqf_check_versions} nsudUrlAck: ${NSUD_URL_ACK:http://10.81.7.90:24013/api/dqf/api/v3/dqf_check_versions/activations} requestTimeout: 1m useHash: ${NSUD_USE_HASH:true} pebble: interval: ${NSUD_PEBBLE_INTERVAL:PT30s} idleDelay: ${NSUD_PEBBLE_IDLE_DELAY:PT1m} pebbleRefresh: ${NSUD_PEBBLE_REFRESH:PT5m} datamarts: - eduejd01 **Параметры настроек** - ``nsudCron`` - периодичность получения списка проверок; - ``nsudUrlList`` - адрес для получения списка проверок качества данных (необходимо указывать порт для взаимодействия именно через REST API (по умолчанию в Агенте СМЭВ 4 8172)); - ``nsudUrlAck`` - адрес подтверждения применения проверок качества данных (необходимо указывать порт для взаимодействия именно через REST API (по умолчанию в Агенте СМЭВ 4 8172)); - ``useHash`` - порт веб-сервера, например: ``HTTP_PORT:9000``; - ``datamarts`` - список датамартов по которым требуется получать список проверок. Секция agg ################### В секции ``agg`` хранятся настройки плана выполнения агрегаций. Например: .. code-block:: yaml agg: # Задача по агрегации данных сохранение в таблицу aggregation и последующая отправка по rest aggCron: '0 0 0 31 2 *' aggArmDsCron: '0 0 0 31 2 *' aggUrl: ${AGGREGATION_URL:http://10.81.7.90:24013/api/dqf/pkch/api/v3/dqf_check_reports} aggArmDsStatUrl: http://10.81.7.90:12114/MNSV17/pmd/api/v3/data_mart_check_adapter_stats/ **Параметры настроек** - ``aggCron`` - периодичность запуска подсчета агрегированной статистики для передачи в ЕИП НСУД (рекомендуется устанавливать 1 раз в день); - ``aggArmDsCron`` - периодичность запуска подсчета агрегированной статистики для отображений виджета ТПО УД (рекомендуется устанавливать 1 раз в день); - ``aggUrl`` - адрес отправки агрегированной статистики в ЕИП НСУД (необходимо указывать порт для взаимодействия именно через REST API (по умолчанию в Агенте СМЭВ 4 8172)); - ``aggArmDsStatUrl`` - адрес отправки агрегированной статистики в разрезе таблиц в ЕИП НСУД (необходимо указывать порт для взаимодействия именно через Rest-api (по умолчанию в Агенте СМЭВ 4 8172)). Секция incident ################### В секции ``incident`` хранятся настройки отправки единичных инцидентов качества. Например: .. code-block:: yaml incident: limitCount: ${INC_RATE_LIMITER_COUNT:1000} limitCron: 0 0 * * * * **Параметры настроек** - ``limitCount`` - лимит на количество отправленных данных за время определенное в limitCron; - ``limitCron`` - время в течении которого сохраняется количество отправленных данных; .. _check_adapter_schema_config: Конфигурационный файл с описанием проверяемой схемы ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Агенту проверок, для построения внутренней модели со связями таблиц, необходим файл с описанием проверяемой схемы и связей таблиц внутри этой схемы в формате приведенном ниже: .. code-block:: sql CREATE TABLE vehicle.owners ( id UUID NOT NULL, name VARCHAR(255) NOT NULL, birthdate DATE NULL, PRIMARY KEY (id) ); CREATE TABLE vehicle.cars ( id UUID NOT NULL, owner_id UUID NOT NULL, model VARCHAR(255) NOT NULL, manufacture_year INTEGER NULL, PRIMARY KEY (id) ); CREATE TABLE vehicle.repairs ( id UUID NOT NULL, car_id UUID NOT NULL, owner_id UUID NOT NULL, repair_date DATE NOT NULL, description TEXT NULL, PRIMARY KEY (id) ); -- Foreign key constraints ALTER TABLE vehicle.cars ADD CONSTRAINT fk_cars_owner FOREIGN KEY (owner_id) REFERENCES vehicle.owners(id); ALTER TABLE vehicle.repairs ADD CONSTRAINT fk_repairs_car FOREIGN KEY (car_id) REFERENCES vehicle.cars(id); ALTER TABLE vehicle.repairs ADD CONSTRAINT fk_repairs_owner FOREIGN KEY (owner_id) REFERENCES vehicle.owners(id); Имя файла необходимо формировать по формату ``{имя проверяемой схемы}.sql`` в данном случае ``vehicle.sql``.