Исключение данных на вставку
От: peer  
Дата: 03.01.17 07:34
Оценка:
Есть таблица в базе.
В нее вставляются некоторые данные внешним приложением или процедурой.
Задача: Нужно некоторые данные не вставлять.

Таблицу менять нельзя, внешние приложения тоже нельзя менять и все их я не знаю.
Однако можно создать триггер на эту таблицу.
Пока смог придумать только instead of trigger.
Но тут засада. стал писать тесты с помощью EF пошли баги типа "Store update, insert, or delete statement affected an unexpected number of rows"
то есть EF ожидает вставленного айди новой записи, а мне же надо некоторые не вставлять. Получается если внедрю триггер, то внешнее приложение может поламаться.

Что еще можно?
Re: Исключение данных на вставку
От: Olaf Россия  
Дата: 03.01.17 12:55
Оценка:
Здравствуйте, peer, Вы писали:

P>Есть таблица в базе.

P>В нее вставляются некоторые данные внешним приложением или процедурой.
P>Задача: Нужно некоторые данные не вставлять.

Возможно EF ожидает результат вставки через @@rowcount или scope_identity(), а в итоге получает 0. В любом случае нужно быть осведомленным на все 100% в том, что происходит дальше после вставки в эту таблицу. Даже если предположить, что удалось вставить данные и EF нормально отработал эту ситуацию, дальнейшая логика приложения может быть построена таким образом, что полученный идентификатор (запись) после вставки используется в других таблицах как FK.
Если рассмотреть идеальный случай, т.е. таблица не имеет связей с другими таблицами и логика приложения заключается лишь в том, что данные вставляются только в нее одну, то можно рассмотреть вариант с AFTER триггером на вставку через удаление. Вариант конечно сомнительный, т.к. для того чтобы проигнорировать вставку, нужно сначала вставить, а потом удалить, но если очень нужно...

  Скрипт для MS SQL
CREATE TABLE dbo.T1
(
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Value1] [varchar](50) NULL
)
GO

CREATE TRIGGER [dbo].[trg_T1_I]
   ON  [dbo].[T1]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    delete t1
    from inserted i
    join dbo.T1 t1 on i.Id = t1.Id    
    where t1.Value1 like 'A%'

END

GO

insert into dbo.T1(Value1)
select 'A' union all select 'FG'

select SCOPE_IDENTITY(), @@ROWCOUNT

Другой вариант — вставлять все подряд, а потом ненужные данные удалять по расписанию, но здесь многое зависит от вашего бизнес-процесса, насколько это критично.
Re[2]: Исключение данных на вставку
От: peer  
Дата: 03.01.17 15:22
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, peer, Вы писали:


всё усложняется что в данной таблице нет поля id и ключа уникального.
искусственно вводил для тестов.
но пожалуй проще с бизнесом договориться про удаление по расписанию — лучше чем поломать работающую внешнюю программу, вставляющую данные.
Re[3]: Исключение данных на вставку
От: r.kamenskiy Россия  
Дата: 04.01.17 16:11
Оценка:
Здравствуйте, peer, Вы писали:

P>всё усложняется что в данной таблице нет поля id и ключа уникального.


Если в этой таблице нет primary key, как с ней работает EF?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.