Использование After Insert Trigger для вставки только определенных значений и определенного набора строк - PullRequest
0 голосов
/ 03 октября 2019

У меня есть триггер, который я работаю, чтобы вставить значения, в основном присутствующие. Минус 2, что я статически помещаю в сам триггер. Триггер работает нормально, но повторяет много вставок, и я не могу понять, почему. В этом конкретном случае я хочу, чтобы он вставлял значения, основанные на вещах, еще не вставленных в таблицу на основе триггера.

Я выбираю два значения из одной таблицы и 3 из таблицы триггеров. Я хочу вставить новый GUID и номер 0 в столбце «выбранные» для всех значений, НЕ найденных в таблице триггеров. В этом случае можно выбрать только 10 .. (10 строк в таблице [CIF_SublineType]). Поэтому, если вставить 2 строки, я пытаюсь вставить только остальные 8. Но эта текущая установка вставляет более 100 или около того. с одинаковыми значениями

Я пробовал несколько вариантов этого триггера, и некоторые ничего не делают. Другие дают мне кратные одного и того же ряда.

ALTER TRIGGER [dbo].[UpdateUniqSubLineType]
ON  [GTU_Apps].[dbo].[TestTableCIF] 
AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO GTU_Apps.dbo.TestTableCIF (UniqSublineID, UniqSublineType, UniqLineType, UniqLine, UniqPolicy, Selected, LineName)
        SELECT DISTINCT
            NEWID(), SLT.UniqSublineType, TT.UniqLineType, TT.UniqLine, 
            TT.UniqPolicy, 0, SLT.SubLine_Name 
        FROM 
            [GTU_Apps].[dbo].[CIF_SublineType] AS SLT 
        LEFT OUTER JOIN
            GTU_Apps.dbo.TestTableCIF AS TT ON SLT.UniqLineType = TT.UniqLineType 
        WHERE
            SLT.SubLine_Name <> TT.LineName 
            AND LT.UniqLineType = TT.UniqLineType
END

Я хотел бы показать снимок экрана с таблицей [CIF.SublineType], чтобы вы могли видеть, что я только пытаюсь вставить значения, которые НЕ уже есть в таблице триггеров. В этом случае TestTableCIF, но я не могу понять, как загрузить изображение. Любая помощь будет принята с благодарностью

РЕДАКТИРОВАТЬ. Используя вставленную таблицу:

ON  [GTU_Apps].[dbo].[TestTableCIF] 
   AFTER INSERT
AS 
BEGIN

INSERT INTO GTU_Apps.dbo.TestTableCIF 
(UniqSublineID, UniqSublineType, UniqLineType, UniqLine, UniqPolicy, Selected, LineName)

SELECT distinct
NEWID(), SLT.UniqSublineType, i.UniqLineType, i.UniqLine, i.UniqPolicy, 0, SLT.SubLine_Name 

FROM 
inserted as i 
join [GTU_Apps].[dbo].[CIF_SublineType] AS SLT ON
i.LineName = SLT.SubLine_Name AND i.UniqLineType = SLT.UniqLineType
where i.UniqSublineType <> SLT.UniqSublineType

END

Редактируем это для комментариев ниже. UniqLineType - это ключ, используемый для извлечения всех UniqSublineTypes. Здесь хранятся 10 направляющих, и в зависимости от того, что не вставлено, триггер сравнивает их и вставляет их из таблицы CIF_SublineType.

  /* MCAL subline GUIDs */
    public string mcalBIPD = "151743CE-4750-44C1-A950-613057C1D892";
    public string mcalHired = "F4916ABE-8FFB-4DC4-A546-32603647781B";
    public string mcalNonOwned = "8FA5A75E-71D1-44BD-91EA-0B14F7D08FF6";
    public string mcalPIP = "4F5AC1A8-0BC9-437C-B16A-4DA64B7FE28B";
    public string mcalAddPIP = "6FE73B23-D437-4FC4-83DE-2751B0966A80";
    public string mcalMedPayments = "BB9307AD-EE95-4703-BF45-C482E09537E6";
    public string mcalUMPD = "E23DAAE0-3E4F-4A52-8A2F-C01501CD0295";
    public string mcalUMCSL = "1228C123-32CF-483E-8F8B-3F7B01ABF53A";
    public string mcalUIMCSL = "04096A7A-E42A-4D6A-B0AE-49B832005C41";
    public string mcalTerror = "7EF66420-060C-49E7-AC81-06C5ECB6CC2F";
    var MCAL = '5cc3cb18-5b52-454d-88c7-2670501946b4';

они найдены с использованием переменной MCAL выше из таблицы CIF_Subline.

1 Ответ

0 голосов
/ 04 октября 2019

Я хочу вставить новый GUID и число 0 в столбце «выбранные» для всех значений, НЕ найденных в таблице триггеров.

Попробуйте это:

INSERT INTO GTU_Apps.dbo.TestTableCIF 
(UniqSublineID, UniqSublineType, UniqLineType, UniqLine, UniqPolicy, Selected, LineName)

SELECT distinct
NEWID(), SLT.UniqSublineType, i.UniqLineType, i.UniqLine, i.UniqPolicy, 0, SLT.SubLine_Name 

FROM 
[GTU_Apps].[dbo].[CIF_SublineType] AS SLT 
left join inserted i on i.UniqLineType = SLT.UniqLineType 
where i.UniqLineType is null
and SLT.UniqLineType is not null
and SLT.UniqSublineType is not null
and SLT.UniqLineType is not null
and SLT.UniqLine is not null
and SLT.UniqPolicy is not null

Оператор выбора получит все записи, которые не соответствуют таблице inserted.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...