科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道解析:INSTEAD OF触发器的表达式和计算列

解析:INSTEAD OF触发器的表达式和计算列

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

视图上的 INSTEAD OF 触发器必须具有相应的逻辑,能够正确地确定 INSERT 和 UPDATE 触发器上指定的值中哪些值必须设置到基表中的列。

作者:赛迪网 xiaoqiao 来源:天新网 2008年3月27日

关键字: Mssql SQL SQL Server 数据库

  • 评论
  • 分享微博
  • 分享邮件

ConcatView 中的表达式 CombinedName 包含由 FirstName 和 LastName 值串联起来的值。如果在 ConcatView 上定义 INSTEAD OF INSERT 触发器,则对 INSERT 语句如何提供 CombinedName 列值必须有相应的规则,让触发器确定字符串的哪部分应放在 FirstName 列中,哪部分应放在 LastName 列中。如果选择的规则是让 INSERT 语句使用 'first_name;last_name' 规则指定 CombinedName 的值,则该触发器可成功地处理 INSERT:

CREATE TRIGGER InsteadSample on ConcatView
INSTEAD OF INSERT
AS
BEGIN

   INSERT INTO SampleTable
      SELECT PriKey,
         -- Pull out the first name string.
         SUBSTRING(
            CombinedName,
            1,
            (CHARINDEX(';', CombinedName) - 1)
            ),
         -- Pull out the last name string.
         SUBSTRING(
            CombinedName,
            (CHARINDEX(';', CombinedName) + 1),
            DATALENGTH(CombinedName)
            )
      FROM inserted
END

需要类似的逻辑来处理本身是简单表达式,但引用的计算列中包含复杂表达式的视图列。

一些视图表达式可转换基表列的值,例如通过执行数学运算或使用列作为函数的参数。在这种情况下,INSTEAD OF INSERT 触发器中的逻辑可采用两种方法:

◆规则可以是:所有 INSERT 语句提供要放在基表中的原始值,而触发器逻辑将该值从 inserted 表移到基表。

◆规则可以是:所有 INSERT 语句提供预期得到的由视图上的 SELECT 返回的值,在这种情况下触发器中的逻辑必须反转此操作。例如:

CREATE TABLE BaseTable
  (
PrimaryKey   int PRIMARY KEY,
ColumnB      int,
ColumnC      decimal(19,3)
  )
CREATE VIEW SquareView AS
SELECT PrimaryKey, ColumnB,
-- Square the value of ColumnC
SQUARE(ColumnC) AS SquareC
FROM BaseTable

CREATE TRIGGER SquareTrigger ON SquareView
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO BaseTable
SELECT PrimaryKey, ColumnB,
-- Perform logical inverse of function in view.
SQRT(SquareC)
FROM inserted
END

对于某些表达式(如使用加法和减法等数学运算的复杂表达式),用户也许不可能提供特定的值供触发器明确地生成目的基表列的值。例如,如果视图选择列表包含表达式 IntColA + IntColB AS AddedColumns,那么 inserted.AddedColumns 中的值 10 表示什么?10 是3 + 7、2 + 8 还是 5 + 5 的结果?仅从 inserted.AddedColumns 值没有办法得知什么值应放置在 IntColA 和 IntColB 中。

在这些情况下,可对触发器进行编码以使用备用信息源确定基表列中要设置的值。对于具有 INSTEAD OF 触发器的视图,视图选择列表必须包含足够的信息,以生成由触发器修改的基表中所有非空列的值。并不是所有的数据都必须直接来自 inserted 表。在一些情况下,inserted 表中的值可以是触发器用于检索其它基表中相关数据的键值。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章