【问题标题】: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 

【问题讨论】:

  • 您需要什么帮助?错误很明显不是吗?

标签: sql sql-server triggers columnstore


【解决方案1】:

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

【讨论】:

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

你应该可以

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

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2020-09-15
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多