首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server触发器"For Each Row“等效项

SQL Server触发器"For Each Row“等效项
EN

Stack Overflow用户
提问于 2009-08-09 20:10:03
回答 4查看 13.5K关注 0票数 1

当另一个表中的字段发生更改时,我需要更新零件表中的多个行,并且我想使用触发器。触发的原因是许多现有的应用程序正在使用和修改数据,而我没有访问所有这些数据的权限。我知道一些数据库支持触发器语句中的For Each Row,但我不认为Microsoft支持。

具体地说,我有两个表,Part和Categories。

Parts有Part#,Category_ID,Part_Name,Original和许多其他的东西

类别有Category_ID和Category_name。

原始是由':‘分隔的Category_Name和Part_Name的串联

例如手环:BB129090

如果有人更改了Category_Name (例如,从手环更改为手环),则必须在Parts表的每一行中更新原始字段。虽然这是一个不常见的事件,但它的发生足以造成麻烦。

任何Web和桌面应用程序都不使用原始版本

所有会计应用程序仅使用原件

保持会计和其他应用程序同步是我的任务。

数据库不是我设计的,写会计程序的公司也不会改变它。

EN

回答 4

Stack Overflow用户

发布于 2009-08-12 04:49:04

或者另一种选择:为什么不在这两个表上为您的会计部门创建一个视图,其中包含以下连接的列:

代码语言:javascript
复制
CREATE VIEW dbo.AccountingView
AS
  SELECT
    p.PartNo, p.Part_Name, p.Category_ID,
    c.Category_Name + ':' + p.PartName as 'Original'
  FROM
    Parts p
  INNER JOIN
    Category c ON p.Category_ID = c.Category_ID

现在,您的会计人员可以使用此视图进行报告,它总是新鲜的,总是最新的,并且您不必担心更新和插入触发器以及所有那些棘手的事情……

Marc

票数 2
EN

Stack Overflow用户

发布于 2009-08-09 20:25:31

我猜在您的情况下,不需要行级触发器。

你可以这样做

代码语言:javascript
复制
IF UPDATE(Category_Name)
    UPDATE Parts
    SET Original = inserted.Category_Name + ':' + Part_Name
    FROM Parts
    INNER JOIN inserted ON Parts.Category_ID = inserted.Category_ID

作为Category表上的更新触发器。

如果确实需要逐行处理(例如,存储过程),则需要在插入时使用游标或WHILE循环。

票数 1
EN

Stack Overflow用户

发布于 2009-08-09 21:51:52

原始专栏违反了1NF,这是一个非常糟糕的想法。您可以选择

  1. 完全跳过该列,并在每个查询中连接它(可能不是最好的解决方案,但我认为它可能比在表上创建视图并将原始列放在视图中(可能我会这样做)更好,或者
  2. 使原始列成为计算列,如果您想在其上创建索引,这是最好的方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1252145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档