我在创建触发器时遇到问题。数据库模型如下所示:
CREATE TABLE Unit (
SerialNO VARCHAR(3)
PRIMARY KEY (serialNO)
);
CREATE TABLE PackageConfig (
PartNO VARCHAR(15),
SomeValue VARCHAR(20),
PRIMARY KEY (PartNO)
);
CREATE TABLE Package (
ID INT IDENTITY(1,1),
Config VARCHAR(15),
PRIMARY KEY (ID),
FOREIGN KEY (Config) REFERENCES PackageConfig(PartNO)
);
CREATE TABLE UnitInPackage (
Package INT,
Unit VARCHAR(3),
PRIMARY KEY (Package,Unit),
FOREIGN KEY (Package) REFERENCES Package(ID),
FOREIGN KEY (Unit) REFERENCES Unit(SerialNO)
);
有Units
,PackageConfigurations
和Packages
. 一个包恰好有一个PackageConfiguration
和之间的关系,Package
并且Unit
是多(单元)到最多一个(包)。
我想要完成的是一个视图触发器,它可以让我执行以下操作(假设PackageConfig
andUnits
存在):
INSERT INTO v_MultiUnitPackage (PackageConfig, Unit1, Unit2, Unit3)
VALUES ('SomeConfig','abc','bcd','cde');
触发器内部会执行以下操作:
DECLARE @last INT;
INSERT INTO Package (Config) VALUES ('SomeConfig');
SET @last = SCOPE_IDENTITY();
INSERT INTO UnitInPackage (Package,Unit)
VALUES (@last,'abc'),(@last,'bcd'),(@last,'cde');
或更多列:
INSERT INTO Package (Config) VALUES ('SomeConfig');
SET @last = SCOPE_IDENTITY();
INSERT INTO UnitInPackage (Package,Unit)
VALUES (@last,'hgf'),(@last,'gfe'),(@last,'fed'),(@last,'edc'),(@last,'dcb'),(@last,'cba');
总而言之,我想创建一个触发器,它接受一个PackageConfig
和 N 个数Units
并将它们插入相应的表中。
我一直在研究创建一个虚拟视图,该视图仅具有正确的数据类型和足够多的列以允许我想要的单元数,但没有找到解决方案。
我还研究了诸如按每个组进行分组的方法,Package.ID
并为每个组选择尚未选择到前一列的第一个单元。由于GROUP BY
只能与聚合函数一起使用,我不确定如何实现这个想法。
实际上,我认为不需要超过 5 个左右的 Units,但更喜欢通用解决方案来解决我的问题。
也许有一个非常简单的解决方案,我只是没有看到。任何帮助是极大的赞赏。