Вопрос

При обновлении фото у контакта возникает ошибка в базе.

Добрый день!

При попытке сделать вот так:

photo.Save();

contact.PhotoId = photo.Id;

contact.Save();

Начинает работать триггер:

ALTER TRIGGER [dbo].[TRILE9Mk5tdkf4ii5Xu52IJW7JlAIU] ON [dbo].[Contact]

AFTER INSERT, UPDATE

AS

BEGIN

        SET NOCOUNT ON

    IF (EXISTS(SELECT * FROM [DELETED]))

    BEGIN

        DELETE FROM [dbo].[SysImage]

        FROM [dbo].[SysImage]

            INNER JOIN [DELETED] ON [DELETED].[PhotoId] = [dbo].[SysImage].[Id]

            INNER JOIN [INSERTED] ON [INSERTED].[Id] = [DELETED].[Id]

        WHERE [INSERTED].[PhotoId] <> [DELETED].[PhotoId] 

            OR [INSERTED].[PhotoId] IS NULL

    END

    UPDATE [dbo].[SysImage]

    SET [HasRef] = 1

    FROM [dbo].[SysImage]

        INNER JOIN [INSERTED] ON [INSERTED].[PhotoId] = [dbo].[SysImage].[Id]

END

, который удаляет картинку, и возникает вот такая ошибка:

The DELETE statement conflicted with the REFERENCE constraint "FKamtHXQyIMFbLDoNyWpPJjYmE". The conflict occurred in database "sddhelp", table "dbo.Contact", column 'PhotoId'.

Если пытаться апдейтить картинку на null то же самое.

 

Нравится

3 комментария
Лучший ответ

Добрый день, довольно распространённая ошибка.

Немного отступления, дело в том что у сущности (фото которой вы пытаетесь изменить) текущее фото используется ещё какой-то сущностью.



Т.е. если Контакт1 имеет Фото1 и Контакт2 имеет Фото2, то при обновлении/удалении такого фото у любого из двух контактов возникнет исключение. Если не ошибаюсь то механика такова, что при попытке обновления фото, данное фото пытается удалиться из SysImage.



Как вариант могу предложить на время отключить данный constraint дабы почистить дубли фото во всей таблице, заранее выявив все такие дубли. Затем после очистки можно вернуть данный constraint обратно, вернуть его можно просто опубликовав объект таблицы (в конфигураторе) ещё раз, чтобы структура таблицы в БД обновилась согласно объекту.

Добрый день, довольно распространённая ошибка.

Немного отступления, дело в том что у сущности (фото которой вы пытаетесь изменить) текущее фото используется ещё какой-то сущностью.



Т.е. если Контакт1 имеет Фото1 и Контакт2 имеет Фото2, то при обновлении/удалении такого фото у любого из двух контактов возникнет исключение. Если не ошибаюсь то механика такова, что при попытке обновления фото, данное фото пытается удалиться из SysImage.



Как вариант могу предложить на время отключить данный constraint дабы почистить дубли фото во всей таблице, заранее выявив все такие дубли. Затем после очистки можно вернуть данный constraint обратно, вернуть его можно просто опубликовав объект таблицы (в конфигураторе) ещё раз, чтобы структура таблицы в БД обновилась согласно объекту.

Кисловский Михаил Андреевич,

Так это нормально, что на одну картинку две контакта ссылаются. такое вполне может произойти.

Разве?

Ведь нету никакого механизма выбора из уже существующих фотографий в системе (имею ввиду из клиента).



Либо тогда предлагаю насовсем избавиться от такого constraint ибо он будет жизнь портить всегда.

Показать все комментарии