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

5f0d552i  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(387)

我试图在一个表上创建一个触发器,该表有一个columnstore聚集索引。每当有人更新时,它都会将记录记录记录在audit schema表中。当我执行 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
ma8fv8wu

ma8fv8wu1#

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

myss37ts

myss37ts2#

你应该能够
将表重命名为
创建一个视图,该视图除了简单的select<all\u columns>之外什么都不做,并且具有原始的表名(这样就不必更改代码)。不要使用select*,这可能会导致以后添加/删除/更改表列时出现奇怪和难以发现的问题。
在此视图上创建一个instead of触发器(!)你的审计工作和“委托”更新/删除重命名的表

相关问题