Внутри триггера вставьте n строк из исходной таблицы в новую таблицу - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть следующая таблица:

==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 для каждой строки, которую хочу вставить.

1 Ответ

1 голос
/ 28 апреля 2019

Просто сделайте INSERT ... SELECT. Вам вообще не нужен цикл.

INSERT INTO tcontrol_offices
            (insertion_date,
             operation,
             office,
             the_user)
            SELECT getdate(),
                   'INSERT',
                   office,
                   suser_sname()
                   FROM inserted;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...