Здравствуйте, помогите исправить триггер. Есть таблица UploadsEmailSettings
[dbo].[UploadsEmailSettings](
[SupplierId] [bigint] NOT NULL,
[EmailSender] [varchar](50) NULL,
[EmailFrom] [varchar](50) NULL,
[Subject] [varchar](100) NULL,
[Body] [varchar](500) NULL,
[Encoding] [varchar](15) NULL,
[ArchiveName] [varchar](150) NULL,
[FileName] [varchar](150) NULL
)
в триггере нужны две проверки - первое, чтоб одновременно поля [EmailSender] и [EmailFrom] не были нулл, и эта проверка работает.
а второе - при обновлении и вставке нужно соблюсти уникальность трех полей: [SupplierId] ,[EmailSender] , [EmailFrom]... вот тут то и возникла загвоздка. так как каждое из полей в этой табл само по себе не уникально да еще и два из них могут быть нулевыми.
сейчас у меня не дает вставить вообще ничего!
ALTER TRIGGER [dbo].[tr_UploadsEmailSettings_Insert_Update]
ON [dbo].[UploadsEmailSettings]
INSTEAD OF Insert, Update
AS
BEGIN
---проверяем чтобы во вставляемом значении не было одновременно NULL в EmailFrom и EmailSender
IF exists (
select *
from inserted i
where (i.EmailFrom is null and i.EmailSender is null)
)
BEGIN
RAISERROR ('EmailFrom и EmailSender не могут одновременно быть null.', 16, 1)
return
END
ELSE
--проверка на уникальность
BEGIN
--- 1. обновление
if exists(select * from deleted)
BEGIN
SELECT i.*
into updated
from deleted d
join inserted i on i.SupplierId = d.SupplierId AND
ISNULL(i.EmailFrom, 'null') = ISNULL(d.EmailFrom, 'null') AND
ISNULL(i.EmailSender, 'null') = ISNULL(d.EmailSender, 'null')
IF exists (
select *
from UploadsEmailSettings u
inner join updated on ( u.SupplierId = updated.SupplierId AND
ISNULL(u.EmailFrom, 'null') = updated.EmailFrom AND
ISNULL(u.EmailSender, 'null') = updated.EmailSender)
)
BEGIN
RAISERROR ('Попытка вставить значение с повторяющимися SupplierId, EmailFrom,EmailSender', 16, 1)
rollback tran
return
END
--тут бред? вдруг сравниваемые поля тоже обновились?
UPDATE UploadsEmailSettings
SET
UploadsEmailSettings.[SupplierId] =updated.SupplierId,
UploadsEmailSettings.[EmailSender] = updated.[EmailSender],
UploadsEmailSettings.[EmailFrom] = updated.[EmailFrom],
UploadsEmailSettings.[Subject] = updated.[Subject],
UploadsEmailSettings.[Body] = updated.[Body],
UploadsEmailSettings.[Encoding] = updated.[Encoding],
UploadsEmailSettings.[ArchiveName] = updated.[ArchiveName],
UploadsEmailSettings.[FileName] = updated.[FileName]
from UploadsEmailSettings u
inner join updated on ( u.SupplierId = updated.SupplierId AND
ISNULL(u.EmailFrom, 'null') = updated.EmailFrom AND
ISNULL(u.EmailSender, 'null') = updated.EmailSender)
END
--2. вставка
else
BEGIN
IF exists (
select *
from UploadsEmailSettings u
inner join inserted i on ( u.SupplierId = i.SupplierId AND
ISNULL(u.EmailFrom, 'null') = ISNULL(i.EmailFrom, 'null') AND
ISNULL(u.EmailSender, 'null') = ISNULL(i.EmailSender, 'null'))
)
BEGIN
RAISERROR ('Попытка вставить значение с повторяющимися SupplierId, EmailFrom,EmailSender', 16, 1)
return
END
insert into UploadsEmailSettings
select * from inserted
END
END
END