以下のトリガーを作成しました。基本的な考え方はport_module_instance_setting
、設定を表す文字列をテーブルに格納することです (この特定のケースでは、value
フィールドが常に数値になるように条件が設定されています)。私が達成しようとしているのはvalue
、これらの特定の「設定」のいずれかでフィールドが更新さ cust_profile_attribute
れると、古いものによって参照されるテーブル内のすべてvalue
が削除されることです。このコンテキストでは、value
フィールド ofport_module_instance_setting
は、 of を直接参照する数値の varchar 値attribute_group_id
ですcore_attribute
。実際のテーブル構造を制御できないため、異なるデータ型を使用したテーブルの参照に関するベスト プラクティスについてコメントしないでください :) トリガー内のすべてが適切に機能します。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 IN(SELECT ISNULL(attribute_id,-1) FROM deleted d
JOIN core_attribute ca ON ca.attribute_group_id= CONVERT(INT,d.value))
END