Триггер не может перехватить при вставке данных в таблицу при использовании файла

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Вот таблица

 CREATE TABLE Users
(
    Id INT PRIMARY KEY IDENTITY(0,1),
    Name NVARCHAR(20) NOT NULL,
    Surname NVARCHAR(25) NOT NULL,
    Email NVARCHAR(30), 
    Facebook NVARCHAR(30),

    CHECK(Email IS NOT NULL OR Facebook IS NOT NULL)
);
  

Это данные, которые я должен вставить в Users таблицу.

 1, N'Alex', Mituchin, qwe@gmail.com, NULL
  

Это BULK INSERT

 BULK INSERT Users
FROM 'C:UsersSAMIRDownloadsTelegram Desktopusers.txt'
WITH (
      FIELDTERMINATOR = 't',
      ROWTERMINATOR = 'n',
     --FIRSTROW = 0,
     --UTF-8
     CODEPAGE = '65001',
     DATAFILETYPE = 'widechar'
);
  

И, наконец, это триггер, который должен фильтровать данные при вставке данных в Users таблицу

 CREATE TRIGGER InsertedUsersTB
ON Users
AFTER INSERT
AS
    UPDATE Users
    SET NAME = (CASE 
                   WHEN NAME LIKE 'N''%'''
                      THEN SUBSTRING(Name, 3, LEN(Name) - 3)
                      ELSE NAME
                END)
    FROM Users
  

Проблема в том, что при массовой вставке в мою Users таблицу триггер не может это перехватить. Как я могу заставить этот триггер начать работу?

Комментарии:

1. Основываясь на ваших 2 сообщениях за день, я могу сказать вам прямо сейчас, что вы создаете для себя огромный беспорядок. Сделайте шаг назад и начните этот процесс с самого начала, теперь, когда вы понимаете подводные камни. Не используйте триггеры для очистки данных.

2. @JacobH что я должен использовать вместо триггера?

3. Не могли бы вы, возможно, загрузить данные в таблицу «промежуточный пост», а затем выполнить очистку там (после завершения массовой вставки) перед заполнением вашей рабочей таблицы? Полностью согласен с @JacobH, что вы чрезмерно усложняете это.

4. Также: очень странно, что ваш AFTER INSERT триггер вообще не обращается к Inserted псевдотаблице. Это псевдотаблица, доступная только внутри триггера, которая содержит все строки, которые были вставлены последним оператором — обычно эту псевдотаблицу используют для определения, с какими строками что-то делать, а не только со всей таблицей!

Ответ №1:

Если вы прочитаете документацию для МАССОВОЙ ВСТАВКИ, вы можете узнать, что по умолчанию триггеры не запускаются. Вам нужно добавить опцию в свой оператор. Опция просто FIRE_TRIGGERS

Комментарии:

1. @SamirHemzeyev Я думаю, что это, возможно, ответило на вопрос, но я не уверен, что это действительно решило проблему.

2. Я должен согласиться с Шоном. Это было бы намного эффективнее с решением, которое я предложил по другому вопросу, опубликованному Samir.