Sql server 触发器与原始表一起插入的内部联接

Sql server 触发器与原始表一起插入的内部联接,sql-server,tsql,database-trigger,Sql Server,Tsql,Database Trigger,我正在回顾如何在SQL文档中的SQL Server中创建DML触发器: 有一个示例可以执行以下操作: 下面的示例创建一个DML触发器。当尝试将新采购订单插入PurchaseOrderHeader表时,此触发器将检查以确保供应商的信用评级良好。要获得与刚插入的采购订单对应的供应商的信用评级,必须引用供应商表并将其与插入的表联接。如果信用评级过低,将显示一条消息,并且不会执行插入 请注意,此示例不允许修改多行数据 我想知道为什么示例内部将inserted表与PurchaseOrderHeader表连

我正在回顾如何在SQL文档中的SQL Server中创建DML触发器:

有一个示例可以执行以下操作:

下面的示例创建一个DML触发器。当尝试将新采购订单插入PurchaseOrderHeader表时,此触发器将检查以确保供应商的信用评级良好。要获得与刚插入的采购订单对应的供应商的信用评级,必须引用供应商表并将其与插入的表联接。如果信用评级过低,将显示一条消息,并且不会执行插入

请注意,此示例不允许修改多行数据

我想知道为什么示例内部将
inserted
表与
PurchaseOrderHeader
表连接,然后连接
vendor


我可以只使用插入的
表直接连接供应商表而不使用
采购.PurchaseOrderHeader
表来获得相同的结果吗?

我不仅相信你是正确的,而且我认为在这个文档页面上还有更多的不准确之处-我必须承认,这在我的经验中是非常罕见的

以这一部分为例:

请注意,此示例不允许修改多行数据

这是一个错误的说法。触发器代码示例将处理多行插入和单行插入

请注意,根据记录的(和观察到的)行为,插入的表将包含插入(或更新)到触发器目标表的所有行:

插入的表在INSERT和UPDATE语句期间存储受影响行的副本。在insert或update事务期间,新行同时添加到插入表和触发器表中。插入表中的行是触发器表中新行的副本

因此,在这种情况下,
inserted
的连接应该足以强制执行所讨论的业务规则


尽管如此,使用触发器强制执行业务规则可能会很困难,甚至有问题——请注意,此触发器只覆盖插入的行,而不覆盖更新的行。这意味着新行可能插入有效值,然后更新为无效值

我相信你是对的。。。
USE AdventureWorks2012;
GO

IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
   DROP TRIGGER Purchasing.LowCredit;
GO

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).

CREATE TRIGGER Purchasing.LowCredit 
ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
    IF EXISTS (SELECT *
               FROM Purchasing.PurchaseOrderHeader p 
               JOIN inserted AS i ON p.PurchaseOrderID = i.PurchaseOrderID 
               JOIN Purchasing.Vendor AS v ON v.BusinessEntityID = p.VendorID
               WHERE v.CreditRating = 5)
    BEGIN
        RAISERROR ('A vendor''s credit rating is too low to accept new purchase orders.', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN 
    END;
GO