MS SQL 2012插入时触发:插入表中的所有行

时间:2019-05-30 14:54:31

标签: sql-server

很抱歉,这个问题太标准了,但我想不出有效的方法

我有3个表CustomerCustomerProjectStandardProject

  • StandardProject表包含Customer表中每个客户必须拥有的所有项目的列表。

我的逻辑是,将新客户插入Customer表中时,它将触发并将StandardProject的所有项目插入CustomerProject

Create Table [Customer]
(
   [CID] INTEGER PRIMARY KEY IDENTITY(1,1)
 , Customer   VARCHAR(50) NOT NULL UNIQUE 
)


Create Table [CustomerProject]
(
   ProjectID INTEGER PRIMARY KEY IDENTITY(1,1)
 , [CID]     INTEGER FOREIGN KEY REFERENCES [Customer](CID)
 , Project   VARCHAR(50) NOT NULL 
 , CONSTRAINT UN_Customer_Project UNIQUE([CID], Project)
)


Create Table [StandardProject]
(
    ProjectID INTEGER PRIMARY KEY IDENTITY(1,1)
 ,  Project   VARCHAR(50) NOT NULL UNIQUE
)

INSERT INTO [StandardProject](Project) VALUES('PROJECT 1')
INSERT INTO [StandardProject](Project) VALUES('PROJECT 2')
INSERT INTO [StandardProject](Project) VALUES('PROJECT 3')

问题:当我插入Customer = 'My Customer'时,是否有可能将'Project 1''Project 2''Project 3'添加到CustomerProject表中的触发器?

实际上,StandardProject可以有很多项目,而这些项目可以改变频率。

CREATE TRIGGER InsertStandardProjects ON [Customer]
FOR INSERT
AS

INSERT INTO [CustomerProject]([CID], [Project])...

2 个答案:

答案 0 :(得分:0)

首先,我建议将CustomerProject定义为:

CREATE TABLE [CustomerProject] (
    ProjectID INTEGER FOREIGN KEY REFERENCES [StandardProject](ProjectID),
    CID INTEGER FOREIGN KEY REFERENCES [Customer](CID),
    CONSTRAINT UN_Customer_Project UNIQUE(CID, ProjectID)
)

此联结表仅用于存储客户及其项目之间的关系,存储与客户或项目关联的元数据。因此,在此处存储Project名称是不合适的,只是浪费空间。

话虽如此,您可以尝试使用以下触发器:

CREATE TRIGGER InsertStandardProjects ON [Customer]
FOR INSERT
AS

INSERT INTO [CustomerProject] (ProjectID, CID)
SELECT ProjectID, INSERTED.CID
FROM StandardProject

GO

上述触发器中的插入查询使用INSERTED,它保存要插入的行中的值,其中包括客户的CID

答案 1 :(得分:0)

这样的事情。

CREATE TRIGGER InsertStandardProjects ON [Customer]
FOR INSERT
AS
INSERT INTO [CustomerProject]([CID], [Project])
SELECT i.CID, St.Project
    FROM inserted i,StandardProject St 


-检查

INSERT INTO Customer (Customer) VALUES ('MyNewCustomer')

SELECT * FROM [Customer]
SELECT * FROM [CustomerProject]

Output:

CID Customer
1   MyNewCustomer

ProjectID   CID Project
1   1   PROJECT 1
2   1   PROJECT 2
3   1   PROJECT 3