-1

以下のトリガーを作成しました。基本的な考え方は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
4

1 に答える 1

0

元の質問に関連情報を追加しました( トリガー定義内の DELETE ステートメントの問題)これを教訓として(そして私の-1ポイント)、うまくいけばそれを殺すために投稿に答えます。元の質問を表示するには、リンクをクリックしてください。

于 2012-08-02T15:19:04.890 に答える