在具有聚集列存储索引的表上创建触发器 - 错误
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 中使用聚集列存储索引时,具有大量列的表是不是仍然是反模式?