在具有聚集列存储索引的表上创建触发器 - 错误

Posted

技术标签:

【中文标题】在具有聚集列存储索引的表上创建触发器 - 错误【英文标题】:Create Trigger on a table with clustered columnstore index - Error 【发布时间】:2020-05-19 22:00:13 【问题描述】:

我正在尝试在具有列存储聚集索引的表上创建触发器。每当有人更新时,它就会将记录记录在审计模式表中。 当我执行Create Trigger SQL 时,出现此错误

在表“dbo.report”上创建触发器失败,因为您无法在具有聚集列存储索引的表上创建触发器。考虑以其他方式强制执行触发器的逻辑,或者如果您必须使用触发器,请改用堆或 B 树索引。

任何帮助将不胜感激。

CREATE TRIGGER trg_report 
ON dbo.[Report] 
after UPDATE, DELETE 
AS 
  BEGIN 
          INSERT INTO [Audit].[Report] 
                      (userid, 
                       department, 
                       modifydate)
           SELECT [UserId] = CURRENT_USER,
           D.* FROM   deleted D 
           WHERE  CURRENT_USER NOT IN (SELECT accountname 
                                      FROM 
                 dbo.[account]) 
      END 

【问题讨论】:

您需要什么帮助?错误很明显不是吗? 【参考方案1】:

如果您真的需要触发器,则必须将表设为聚集索引或堆。然后可以添加非聚集列存储索引,但行数据将被存储两次。

【讨论】:

该表没有任何唯一列,我可以在其中创建集群的 PK,在这种情况下需要做什么? 添加标识列? 或者在所有列上做Clustered PK,或者做一个堆。 @DaleK,我必须检查这个选项是否可行。 @DavidBrowne-Microsoft - 表中的每一列都有重复的值,你认为可以在上面添加 PK 吗?【参考方案2】:

你应该可以

    将表格重命名为 创建一个除了简单的 SELECT FROM 之外什么都不做的视图,并且具有原始表名(因此您不必更改代码)。请勿使用 SELECT *,这可能会导致您稍后添加/删除/更改表列时出现奇怪且难以发现的问题。 在此 VIEW (!) 上创建一个 INSTEAD OF 触发器,该触发器执行您的审计工作并将 UPDATE / DELETE“委托”到重命名的表

【讨论】:

以上是关于在具有聚集列存储索引的表上创建触发器 - 错误的主要内容,如果未能解决你的问题,请参考以下文章

在现有的大型表上创建列存储索引的最有效方法?

在 SQL Server 2014 中使用聚集列存储索引时,具有大量列的表是不是仍然是反模式?

在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引

在过程中动态添加的表上创建触发器

第2章聚集索引的表和索引

mysql在具有1亿行的表上创建索引