Предотвращение дубликатов с помощью триггера SQL

Самое гибкое решение - создать пакет SSIS, который использует компонент сценария в качестве источника данных.

Вы можете прочитать файл по одной строке за раз и применить определенное логическое определение для каждого столбца, который вы хотите для отправки в поток данных.

0
задан marc_s 19 January 2019 в 06:54
поделиться

2 ответа

Вы должны действительно использовать ограничение. Триггер «после вставки» фактически помещает вторую строку в таблице. , , и, надеюсь, никто не использует NOLOCK для чтения.

В любом случае, вам нужно посчитать строки и найти несколько вхождений. Это будет примерно так:

Create trigger tr_Duplicate on Utentes after INSERT as
begin    
    if exists (select 1
               from utentes u join
                    inserted i
                    on u.nic = i.nic
               group by u.nic
               having count(*) > 1
              )
    begin
        print 'NIC already in database';
        rollback;
    end;
end;

С триггером instead of вы не добавите новые строки в таблицу, если она уже существует:

create trigger tr_Duplicate on Utentes after INSERT as
begin    
    if exists (select 1
               from utentes u join
                    inserted i
                    on u.nic = i.nic
              )
    begin
        print 'NIC already in database';
        rollback;
    end;
    else
    begin
        insert into utentes
            select i.*
            from inserted i;
    end;
end;
0
ответ дан Gordon Linoff 19 January 2019 в 06:54
поделиться

Я бы поддержал мнение против использования триггеров, а также предложил бы использовать УНИКАЛЬНЫЕ ограничения. По моему скромному мнению, я бы предпочел искать решение на уровне ETL, группируя записи по мере их вставки. С помощью триггеров вы получите вышеупомянутые проблемы параллелизма и непротиворечивости, а также потенциальное увеличение базы данных tempdb или T-log, если таблица когда-либо станет достаточно большой, чтобы обработать ее некоторое время.

0
ответ дан Gleb 19 January 2019 в 06:54
поделиться