我正在使用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表中一行的插入/更新/删除绝不会超过一个(没有批处理作业)