После добавления нового ЛПУ с кодом ЛПУ, который уже есть у какого-то другого ЛПУ в базе данных и если у этого ЛПУ есть настройки (запись в LPU_SETTINGS), то при попытке перезапуска службы она уже не запустится и в системном логе событий появится ошибка:
Ошибка старта службы. Error: Host can't invoke Start method System.Exception: Ошибка загрузки холдера: LpuSettingsHolder, Stopped. ---> System.Exception: Добавление дублирующего ключа для холдера 5586e4e399fd41f39205071d6e04717f.d828adbcfe2e45809930537f295aecaa, ключ: 6528 в 4078d44118e74847987677923dc82078.458cea823e4643e78b971c99308aa2cc`2.82dae2784f6b47d19a37f69daa51b5e8(1bee916d99c64ec48998ce3890efffc5 , 1bee916d99c64ec48998ce3890efffc5 , 09f45c58359e4d52afd49bd1a16d71c8 ) в 4078d44118e74847987677923dc82078.458cea823e4643e78b971c99308aa2cc`2.5d44d4c912064f7f874013760d0dcca7() в 901dcc8a300f4b87925979f732b1c213.bc34964987eb4568a46468085abd0e56.5d44d4c912064f7f874013760d0dcca7() в 3bfc40a4e3734b228714a82efc48c204.9025335bb3894bd8afea7dff63c35be2.65363d0d4eae4fb7a9fe382b9332f016() --- Конец трассировки внутреннего стека исключений --- в 3bfc40a4e3734b228714a82efc48c204.9025335bb3894bd8afea7dff63c35be2.65363d0d4eae4fb7a9fe382b9332f016() в 8254f6df12fe427d95519bd430e3dc8f.b9bf6490011d4731bc8a49da6fed4f70.112d3fba43134a6c8a34419651829ecd(9025335bb3894bd8afea7dff63c35be2 , Dictionary`2 ) в 8254f6df12fe427d95519bd430e3dc8f.b9bf6490011d4731bc8a49da6fed4f70.1ab322adf6a54d35bee216e0fe4f3d74() в ServerApp._App.Start() в ServerApp.Service.OnStart(String[] args)
Решением проблемы будет, только исправление этого кода напрямую в БД.
К счастью, можно эту проблему предусмотреть и не допустить. В программе «Витакарта» есть возможность добавить своеобразный триггер (действия при изменении объектов), который будет срабатывать каждый раз при изменении, добавлении или удалении объекта сущности. Этот триггер в свою очередь будет запускать хранимую процедуру, которая будет проверять есть ли в базе данных уже ЛПУ с таким кодом и если ЛПУ с таким кодом есть, то пользователю отобразится ошибка и запись в базу данных произведена не будет.
Скрипт для добавления хранимой процедуры с именем spx_ExistLPUWithThisCode в БД AKUZDB:
USE [AKUZDB] GO /****** Object: StoredProcedure [dbo].[spx_ExistLPUWithThisCode] Script Date: 03.02.2018 19:33:03 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Description: Запрет ввода ЛПУ с одинаковым кодом (если это ЛПУ есть в LPU_SETTINGS). -- ============================================= CREATE PROCEDURE [dbo].[spx_ExistLPUWithThisCode] @Code varchar(6), @LpuID uniqueidentifier WITH EXECUTE AS CALLER AS BEGIN if exists ( select * from akuz.T_LPU_MAIN lm where Code = @Code and LpuID <> @LpuID and EXISTS ( SELECT * FROM AKUZ.T_LPU_SETTINGS ls WHERE lm.LpuID = ls.LpuMain ) ) begin declare @errormessage varchar(max) = 'В таблице T_LPU_SETTINGS уже существует ЛПУ с кодом: '+@Code raiserror(@errormessage, 16, 10) end END
Для того, чтобы добавить новое действие при изменении объектов нужно зайти в «Администрирование» и щелкнуть два раза по папке «Действия при изменении объектов». Затем щелкнуть правой кнопкой по пустому месту и выбрать «Новый»-«Действие при изменении текущего объекта». Дальше нужно заполнить всё, как на скриншотах.
Затем сохраняем созданное нами действие при изменении объектов и проверяем. Всё должно работать.