【问题标题】:Trigger referring to another subelement table引用另一个子元素表的触发器
【发布时间】:2015-07-02 20:41:18
【问题描述】:

在 SQL Server 中有两个表:Invoices (InvoiceId, Number, Date, Customer, TotalValue) 和 InvoicesElements (InvoiceId, Good, Qty, Value)。

每个事务在Invoices 中插入一行,在InvoicesElements 中插入一行/多行。

我需要在Invoices 表上设置一个触发器,当InvoicesElements 表中的Good 为“Bike”且客户为“ABC”时,该触发器将引发错误并回滚事务。

非常感谢任何帮助。

普热梅克

【问题讨论】:

  • 有什么理由需要触发器而不是检查约束?
  • 不,约束也可以。但是如何...

标签: sql sql-server triggers


【解决方案1】:
ALTER TABLE
        InvoicesElements
ADD CONSTRAINT
        CHK_GOOD
CHECK   (good <> 'Bike' OR good IS NULL)

更新:

CREATE TRIGGER
        TR_InvoicesElements_AIU
ON      InvoicesElements
AFTER   INSERT, UPDATE
AS
        IF EXISTS
                (
                SELECT  NULL
                FROM    INSERTED ie
                JOIN    Invoices inv
                ON      inv.id = ie.invoiceId
                WHERE   ie.good = 'bike'
                        AND inv.customer = 'ABC'
                )
                THROW 50000, 'Not sure why but you cannot sell bikes to ABC', 0
GO

CREATE TRIGGER
        TR_Invoices_AIU
ON      Invoices
AFTER   INSERT, UPDATE
AS
        IF EXISTS
                (
                SELECT  NULL
                FROM    InvoiceElements ie
                JOIN    INSERTED inv
                ON      inv.id = ie.invoiceId
                WHERE   ie.good = 'bike'
                        AND inv.customer = 'ABC'
                )
                THROW 50000, 'Not sure why but you cannot sell bikes to ABC', 0
GO

【讨论】:

  • 谢谢。我知道有些东西 - 必须在两张桌子上设置条件:Good 'Bike' 而且 Customer'ABC'。所以...
猜你喜欢
  • 1970-01-01
  • 2019-11-02
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多