MS SQL 2012 Trigger на вставке: вставка всех строк из таблицы - PullRequest
2 голосов
/ 30 мая 2019

Извините, если этот вопрос слишком стандартный, но я не смог придумать, как это сделать эффективно

У меня есть 3 таблицы Customer, CustomerProject и StandardProject

  • 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 ]

2 голосов
/ 30 мая 2019

Как то так.

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

1 голос
/ 30 мая 2019

Прежде всего, я предлагаю определить 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 клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...