SQL Server: использование триггера для заполнения 2 таблиц, связанных между собой внешним ключом - PullRequest
0 голосов
/ 13 мая 2018

Триггер используется для заполнения 2 таблиц main.country и main.person из одной таблицы main.jsontable. Однако main.person включает countryId в качестве внешнего ключа. Как я могу получить countryId и вставить его в main.person в триггере? Это мой текущий код, однако он возвращает ошибку

Невозможно вставить значение NULL в столбец 'countryId', таблица 'assignment2.main.person'; столбец не допускает пустых значений. Вставить не удается.

Спасибо

create or alter trigger main.afterParsing 
on main.jsontable 
after insert
as
begin
    set nocount on;

    insert into main.country(countryName)
        select country
        from inserted
        where country is not null

    declare @countryId uniqueidentifier = (Select countryId from main.country);     

    insert into main.person ([name], surname, email, birthYear, balance, registered, countryId)
        select 
            [name], surname, email, age, balance, registered, @countryId
        from 
            inserted
        where 
            name is not null 
            and surname is not null 
            and email is not null 
            and age is not null 
            and balance is not null 
            and registered is not null
end

1 Ответ

0 голосов
/ 14 мая 2018

Некоторые моменты:

  • Более подробная информация о структуре таблицы и оригинальном операторе вставки поможет решить проблему быстрее.
  • Ваш триггер не учитывает массовую вставку.Я полагаю, вы знаете об этом.
  • В строке, где вы объявляете @countryid, вы не отфильтровали свой оператор select, чтобы найти правильный countryid из таблицы стран.Также вы ставите топ 1 или похожее предложение, чтобы избежать ошибок, таких как Subquery returned more than 1 value.

Наиболее вероятная причина ошибки, которую вы получаете, заключается в коде, из которого вы пытаетесь вставить файл main.jsontable, который вы передаете NULL страна.

Вот код обновления вашего триггера, который выдаст лучшее сообщение об ошибке, если произойдет сбой из-за упомянутого выше случая.

alter trigger main.afterParsing 
on main.jsontable 
after insert
as
begin
    set nocount on;


    insert into main.country(countryName)
        select country
        from inserted
        where country is not null

    declare @countryName nvarchar(50) = (Select country from inserted);     
    declare @countryId uniqueidentifier = (Select top 1 countryId from main.country where countryName = @countryName);  

    if(@countryId is null)
    begin
        RAISERROR ('country not matching', 16, 1)   
    end
    else
    begin
        insert into main.person ([name], surname, email, birthYear, balance, registered, countryId)
        select 
            [name], surname, email, age, balance, registered, @countryId
        from 
            inserted
        where 
            name is not null 
            and surname is not null 
            and email is not null 
            and age is not null 
            and balance is not null 
            and registered is not null
    end
end
GO

@ matthew-pavia - Проверьте и дайте мне знать, если это поможет.

...