挿入されるデータに基づいて別のテーブルの情報を更新するように設計された挿入/更新トリガーを作成しました。トリガーが最後に実行する (または実行することになっている) ことは、トリガーの挿入部分で変更された可能性のある条件を持つターゲット テーブルからすべてのデータを削除することです。
DELETE
最終ステートメントを除いて、すべてがトリガーで機能しているように見えます。ステートメントを実行してDELETE
いますが、where 句のどの条件にも従っていません。テーブル内のすべてを削除するだけです。
NOT IN
where 句の を に変更してみましたがIN
、それでも同じです。ステートメントを分離しDELETE
、トリガーの外側でテストしたところ、正常に動作しました (同じ変数とサブクエリを使用)。
トリガーの動作で何か不足していますか?
コードは次のとおりです。
ALTER TRIGGER [dbo].[cust_trgr_profile_attribute]
ON [dbo].[port_module_instance_setting]
AFTER INSERT, UPDATE
AS
DECLARE @ModuleId INT=449,
@MatchGroupModSetting VARCHAR(50) = 'AttributeGroup',
@FilterGroupModSetting VARCHAR(50) = 'FilterAttributeGroup',
@MatchAttributes TABLE (attribute_id INT),
@FilterAttributes TABLE (attribute_id INT)
INSERT INTO @MatchAttributes
SELECT DISTINCT camatch.attribute_id
FROM inserted I
JOIN core_attribute camatch ON I.value = CONVERT(VARCHAR(10), camatch.attribute_group_id)
JOIN port_module_instance pmi ON I.module_instance_id = pmi.module_instance_id
AND pmi.module_id=@ModuleId
WHERE I.name like @MatchGroupModSetting+'_'
INSERT INTO @FilterAttributes
SELECT DISTINCT cafilter.attribute_id
FROM inserted I
JOIN core_attribute cafilter ON I.value = CONVERT(VARCHAR(10), cafilter.attribute_group_id)
JOIN port_module_instance pmi ON I.module_instance_id = pmi.module_instance_id
AND pmi.module_id=@ModuleId
WHERE I.name=@FilterGroupModSetting
IF ((SELECT COUNT(*) FROM @MatchAttributes) > 0 OR (SELECT COUNT(*) FROM @FilterAttributes) > 0)
BEGIN
IF (SELECT COUNT(*) FROM @MatchAttributes) > 0
BEGIN
UPDATE cpa
SET cpa.[required]=0
FROM cust_profile_attribute cpa
JOIN @MatchAttributes ma ON cpa.attribute_id = ma.attribute_id
END
IF (SELECT COUNT(*) FROM @FilterAttributes) > 0
BEGIN
UPDATE cpa
SET cpa.[required]=0
FROM cust_profile_attribute cpa
JOIN @FilterAttributes fa ON cpa.attribute_id=fa.attribute_id
END
DELETE FROM cust_profile_attribute
WHERE attribute_id NOT IN (SELECT distinct ca.attribute_id
FROM core_attribute ca
JOIN port_module_instance_setting inst ON CONVERT(VARCHAR(10),ca.attribute_group_id) = inst.value
JOIN port_module_instance modinst ON inst.module_instance_id = modinst.module_instance_id
AND modinst.module_id = @ModuleId
WHERE inst.name like @MatchGroupModSetting + '_'
OR inst.name like @FilterGroupModSetting)
END