【问题标题】:Create a trigger to update a new table from an existing view创建触发器以从现有视图更新新表
【发布时间】:2019-04-23 16:20:19
【问题描述】:

我正在尝试为从现有视图 (Y) 中提取数据的新表 (X) 创建触发器。 (表 Y 是视图 X 的副本)

我知道创建触发器以将数据从视图中提取到它自己的基表中。

到目前为止,我使用 insert into 语句将数据从 Y 插入到 X。我需要在 Y 上设置一个触发器,这样 Y 上的更新/插入也会反映在 X 上。

这就是我想要做的:

在 X 上创建触发器 TableUpdate

而不是插入,更新 作为

开始

插入Y

从插入中选择 *

结束

这看起来只更新其基表而不是外部表。

【问题讨论】:

  • 这个问题太模糊了。你是什​​么意思它只更新基表而不是外部表?您的而不是触发器会将数据插入 X 并且不会向 Y 插入任何内容(这看起来有点傻)。我认为您在这里真正想要的是查看复制而不是使用触发器来执行此操作。
  • “最好”的方法就是不复制数据 - 期间。这闻起来像XY problem。你想在这里完成什么?您是否正在尝试拍摄某种快照,以便随着时间的推移进行比较?
  • 由于视图需要一段时间来执行,我试图将这些数据拉到一个表中以便更快地执行。
  • 你为什么不能写你所拥有的触发器的反面?在插入到 X 的 Y 上放置一个触发器。目前还不清楚您实际上在问什么,因为您似乎已经知道如何做您想做的事情。 “基表”和“外部表”对您来说意味着什么?
  • 现在很明显 真正的 问题是视图很慢,您应该专注于修复视图,以免它变慢。为什么你的视图很慢?

标签: sql-server triggers sql-server-2017


【解决方案1】:

当底层(基础)表数据发生变化时,您无法使用触发器检测视图中的数据变化。您需要向构成此视图的表(例如表 A)添加触发器以捕获数据更改。

总结:

  • 假设视图 Y 从表 A 中获取数据。
  • 假设视图 Y 有 INSTEAD OF 触发器。
  • 当表 A 中的数据发生更改时,视图 Y 中的触发器将 NOT 触发。它只会在您直接插入/更新视图 Y 时触发。

结论

正如@SeanLange 所说,您需要考虑优化您的视图和/或寻找不使用它的方法。

我建议你看看Materialised Views 作为优化视图性能的可能方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2015-02-10
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多