У меня есть следующая таблица:
==OFFICES==
OFFICE INTEGER NOT NULL,
CITY VARCHAR(15) NOT NULL,
REGION VARCHAR(15) NOT NULL,
DIR INTEGER,
OBJECTIVE MONEY,
SALES MONEY
Я должен определить триггер с именем TRIGGER_EX3. Всякий раз, когда новая строка вставляется в OFFICES, она сохраняет в таблице с именем TCONTROL_OFFICES следующие значения:
==TCONTROL_OFFICES==
INSERTION_DATE DATETIME, --The day the office was inserted
OPERATION VARCHAR(15), --The name of the operation (inserted)
OFFICE INTEGER, --The id of the office (The value of OFFICE in OFFICES)
THE_USER VARCHAR(30) --Name of the user
Моя идея состояла в том, чтобы использовать цикл while (или цикл for) для вставки первой строки INSERTED в TCONTROL_OFFICES, а затем удалить эту же строку из INSERTED и повторять до тех пор, пока INSERTED не станет пустым. Тем не менее, кажется, я не могу изменить INSERTED. Несмотря на это, это все еще казалось неуклюжим подходом. Есть ли лучший способ сделать это?
Это то, что я имею до сих пор:
USE EMPLOYEES
GO
IF(OBJECT_ID ('TRIGGER_EX3', 'TR') IS NOT NULL)
BEGIN
DROP TRIGGER TRIGGER_EX3;
END
GO
CREATE TRIGGER TRIGGER_EX3 ON OFFICES
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
--CHECK IF THE TABLE EXISTS
IF EXISTS (SELECT *
FROM SYS.TABLES
WHERE NAME = 'TCONTROL_OFFICES') --IT DOES
BEGIN
PRINT 'IT EXISTS';
END
ELSE --IT DOESNT
BEGIN
CREATE TABLE TCONTROL_OFFICES
(INSERTION_DATE DATETIME,
OPERATION VARCHAR(15),
OFFICE INTEGER,
THE_USER VARCHAR(30));
END
WHILE((SELECT COUNT(*) FROM INSERTED) > 0)
BEGIN
INSERT INTO TCONTROL_OFFICES
VALUES(GETDATE(), 'INSERT', (SELECT OFFICE FROM INSERTED), SUSER_SNAME())
DELETE TOP (1) FROM INSERTED
END
END
Имейте в виду, что вставка может состоять из 3 строк, но она также может содержать более 100 строк, поэтому я не могу писать 1 на 1 для каждой строки, которую хочу вставить.