table Addresses
にはID (PK), EmpID (int), Address (nvarchar(100), IsDefault (bit)
の列があります。 同じEmpIDを持つレコードが1つだけIsDefaultが1に設定されていることを確認しなければなりません。 私は今トリガーで続けています。 最初は挿入トリガーです。まず、IsDefault
に値1が入力されているかどうかを確認します。 1に設定された同じEmpID
とIsDefault
値を持つより、その後のレコードがある場合にも真であるならば、はい、それはチェックしている場合、それは同じEmpID
0にするために、他のすべてのIsDefault
の値を設定します。1つのレコードに1を、他のすべてに0を設定する方法
create trigger [dbo].[TRG_dbo_Addresses_IsDefault_OnlyOneRecord_insert]
on [dbo].[lAddressesOrganisations]
after insert
as
begin
set nocount on;
begin try
if exists (
select *
from inserted as i
where i.IsDefault = 1)
begin
if (
select count(*)
from dbo.Addresses as lao
inner join inserted as i on i.ID=lao.ID
where lao.IsDefault = 1
and lao.EmpID = i.EmpID
) > 1
begin
update lao
set lao.IsDefault = 0
from dbo.Addresses as lao
where (
select row_number() over (partition by EmpID order by ID desc) as rn
from dbo.Addresses as lao
) > 1
end
end
end try
begin catch
if @@trancount > 0
rollback tran;
end catch
end
このもう1つは更新トリガーであり、私はそれを書く方法を知らない。最初に挿入トリガーと同じことを行い、値が0であれば挿入された値を1にチェックします。値が0の場合は1であり、一致する場合はEmpID
およびIsDefault
が1に設定されています。他のすべてのレコードは同じEmpID
の場合は0に設定されますが、更新中のレコードは1のままです。
create trigger [dbo].[TRG_dbo_Addresses_IsDefault_OnlyOneRecord_update]
on [dbo].[Addresses]
after update
as
begin
set nocount on;
begin try
if exists (
select *
from inserted as i
inner join deleted as d on d.ID=i.ID
where i.IsDefault = 1
and d.IsDefault = 0)
begin
if (
select count(*)
from dbo.Addresses as lao
inner join inserted as i on i.ID=lao.ID
where lao.IsDefault = 1
and lao.EmpID = i.EmpID
) > 1
begin
update lao
set lao.IsDefault = 0
from dbo.Addresses as lao
inner join inserted as i on i.ID=lao.ID
where (I don't have an idea what to put here)
and lao.OrganisationID = i.OrganisationID
end
end
end try
begin catch
if @@trancount > 0
rollback tran;
end catch
end
私はあなたがここで解決しようとしている問題は、トリガなしで解決できるかどうかを検討するかもしれないのMS SQL 2016
ここで希望する動作は何ですか?現在実装しているように、「他のデフォルトは0に設定されていますか」、または「empidごとに最大1つの行を1に設定できますか?後者の場合は、他のデータを変更する代わりにエラーを生成することもできますが、フィルタリングされたインデックスを使用して実装できます。 –
@ damien-the-unbeliever:EmpIDごとに1つのレコード。私はテーブル内に複数のEmpIDを持つことができますが、1つだけにIsDefaultを設定することができます。他はすべて0でなければなりません。同じEmpIDのデフォルトアドレスを変更することは可能です。だから私は同じEmpIDのためにいくつかの他のアドレスでIsDefaultの値を変更できるようにするためにインデックスを使用することはできません。 – IvanVC
「他の行を魔法のように変更する」動作をしたいのですか? (現在のデフォルト値を最初に設定解除してから新しいデフォルト値を設定すると、明らかにインデックスが正常に機能するため) –