DML触发器,在插入/更新/删除

时间:2020-03-16 12:53:24

标签: sql-server tsql database-trigger

我正在使用SQL Server 2017。

我要实现的目标:该数据库包含客户,优惠券代码和供应商的表格。顾客就是公司。客户可能是独立公司,也可能属于另一个公司,并且可能有“子公司”(子公司和母公司之间的联系是通过客户表中的ParentID列建立的。)

优惠券代码与客户有关。当“母公司”激活访问优惠券代码时,该代码应可用于所有母公司的子公司。同样,如果母公司停用对优惠券代码的访问,则子公司也应失去访问权限。从今天起,必须手动修复此问题。我正在编写一个触发器来接管此手动任务。

CompanyCodes 存储公司与优惠券代码之间的关系。 “客户”列存储公司ID号,“供应商”列存储优惠券代码的供应商ID,“代码”列存储优惠券代码。

每当在CompanyCodes表中插入,更新或删除一行时,触发器都会首先检查相关客户是否有任何子公司。如果确实如此,则该触发器应该为该公司的每个子公司插入/更新/删除一行,以便所有更改都反映在其中。

例如客户1是客户2和客户3的父级。客户1激活对供应商X的新优惠券代码的访问,并将新行与相关信息插入到公司代码中。在这种情况下,触发器应该在表中插入两个新行,一个用于客户2,另一个用于客户3,其中所有信息(公司ID除外)与为客户1插入的信息相同。

我的位置:如果客户有几个子公司,我该如何做?

这是我当前查询的相关部分(所有内容都在触发触发操作为“ INSERTED”时执行的IF语句中)

DECLARE @insertedSupplier AS INT
DECLARE @insertedCode AS VARCHAR(50)

SET @insertedSupplier = (SELECT Supplier FROM inserted)
SET @insertedCode = (SELECT Code FROM inserted)


    INSERT INTO dbo.CompanyCodes (Customer, Supplier, Code)
    VALUES ((SELECT id FROM Customers WHERE Customers.ParentID = (SELECT Customer FROM inserted))
            ,@insertedSupplier, @insertedCode)

如果最多可能有一个子公司,则上面的方法应该起作用。但是,当有多个行时,“((从客户那里的SELECT ID从客户那里.ParentID =(已插入选择的客户SELECT)”)将返回几行。

做我想在这里做的最简单的方法(最好是最佳实践?)?

编辑带有示例并显示所需输出的示例:

客户表

| Customer | ID | ParentID |
|----------|----|----------|
|Customer1 |  1 | NULL     | 
|Customer2 |  2 |   1      |
|Customer3 |  3 |   1      | 

然后,Customer1继续激活对新优惠券代码的访问,并且CompanyCodes表更改为以下内容:

| Customer | Supplier |   Code   |
|----------|----------|----------|
|Customer1 |  123456  | abcdefgh | 

然后触发该触发器,并为Customer1的两个子公司中的每个子公司添加一行(其中,除Customer名称之外,所有信息都与Customer1相同)

| Customer | Supplier |   Code   |
|----------|----------|----------|
|Customer1 |  123456  | abcdefgh | 
|Customer2 |  123456  | abcdefgh |
|Customer3 |  123456  | abcdefgh |

编辑2:此外,在我们的系统工作方式下,CompanyCodes表中一行的插入/更新/删除绝不会超过一个(没有批处理作业)

0 个答案:

没有答案