【问题标题】:Can't get DELETE statement to work within my SQL Trigger无法让 DELETE 语句在我的 SQL 触发器中工作
【发布时间】:2012-08-02 14:42:35
【问题描述】:

我在下面创建了触发器。基本思想是port_module_instance_setting 表在表中存储一个字符串,该字符串表示一个设置(在这种特定情况下,设置条件以使value 字段始终是一个数字)。我想要完成的是,当value 字段在这些特定“设置”之一中更新时,旧value 引用的cust_profile_attribute 表中的所有内容都会被删除。在此上下文中,port_module_instance_settingvalue 字段是直接引用 core_attributeattribute_group_id 的数字 varchar 值。请不要评论有关使用不同数据类型引用表的最佳实践,因为我无法控制实际的表结构:) 除了末尾的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

【问题讨论】:

  • 重复,17 小时前问过同样的问题 stackoverflow.com/questions/11767725/…
  • @Yaroslav:您接近正确(而且速度非常快)。我最初确实在您提供的链接上提出了这个问题,但是有重要的发现,如果试图在原始问题中编辑/解释,那将是一场噩梦。我决定(不是说这是最好的决定)重新发布我现在理解的问题,然后用指向这个问题的链接回答原始问题。这是一个非常快速的判断,甚至没有给我解释的机会。
  • 好吧,我不知道其他(不是说年长的)用户同意什么。但我认为,由于您之前的问题有很多 cmets,您可以对其进行编辑并添加新的发现。这样,任何人都可以使用 cmets 并添加自己的新答案/cmets。正如你所说,它超快,因为在你的第一个问题上,我试图解开代码,看看有什么问题,并一直困扰着我。
  • @Yaroslav:就代码而言,现在唯一改变的是 DELETE 语句是从 UPDATE 触发事件中引用实际删除的数据信息。我还在问题中添加了一些信息,希望有助于了解数据的相关性,以帮助解开这些东西。至于论坛实践,你会推荐什么?我以为论坛对一长串的cmets皱眉,所以我很担心。我是否应该返回并通过大量编辑彻底修改原始问题?

标签: sql sql-server-2008 triggers sql-update


【解决方案1】:

在原始问题中添加了相关信息( DELETE statement issues within a trigger definition) 以此为经验教训(和我的 -1 分)并回答帖子希望能杀死它。请点击链接查看原文。

【讨论】:

  • 你有,在另一个问题上+1 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2019-10-19
相关资源
最近更新 更多