2013-08-11 3 views
1

У меня есть таблица 2 A1 и A2. Я хочу создать триггер для вставки, обновления и удаления таким образом, когда я вставляю новую запись в таблицу A1, такую ​​же запись следует вставить в A2,Создать триггер для вставки

То же самое должно произойти, когда я обновляю или удаляю таблицу A1.

+2

есть вопрос (с ответами!) На SO по этому вопросу. Сначала попробуйте некоторые из них ... – rene

+0

Прочтите [официальные электронные книги SQL Server о триггерах] (http://technet.microsoft.com/en-us/library/ms189799.aspx) или см. [Изучение триггеров SQL Server (на MSDN)] (http://msdn.microsoft.com/en-us/magazine/cc164047.aspx) для более подробной информации. Как только вы прочтете это - ** попробуйте сами написать триггер! ** Если вы все еще застряли - вернитесь с ** конкретным вопросом **. –

ответ

1

Вы можете объединить A2 с ОБНОВЛЕННОЙ таблицей триггера.

CREATE TRIGGER dbo.trg_A1 
ON dbo.A1 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 

    MERGE dbo.A2 AS target 
    USING (SELECT * FROM INSERTED) AS source 
    ON (target.A1_ID= source.A2_ID) 
    WHEN MATCHED THEN 
     UPDATE SET Col1 = source.Col1, 
        Col2 = source.Col2, 
        . 
        . 
        . 
    WHEN NOT MATCHED THEN 
    INSERT (Col1,Col2,Col3....) 
    VALUES (source.Col1, source.Col2, source.Col3....) 
    WHEN NOT MATCHED BY source and target.A1_ID= source.A2_ID 
    THEN DELETE  
END 
+0

Это может работать - для SQL Server ** 2008 ** и новее - если OP находится в 2005 году, он еще не может использовать 'MERGE'. .. –

+0

@marc_s Так очень верно, но версия не указана, и есть вероятность, что после трех новых версий он может быть на одном из них –

1

Я покажу вам простой способ проверить это в SQL Server 2000 или 2005, но в целом я согласен с Ремусом, что вы должны разбить их на отдельные триггеры:

DECLARE @insert INT, @delete INT; 
SELECT @insert = COUNT(*) FROM inserted; 
SELECT @delete = COUNT(*) FROM deleted; 
IF @insert [email protected] > 0 
BEGIN 
    IF @insert > 0 AND @delete = 0 
     -- insert 
    IF @insert > 0 AND @delete > 0 
     -- update 
    IF @insert = 0 AND @delete > 0 
     -- delete 
END 

Обратите внимание, что это может быть несовместимо с передовой совместимостью из-за сложности, которую MERGE представляет в SQL Server 2008/2012.

Итак, если вы планируете использовать SQL Server 2008/2012 и MERGE в будущем, как решение выше, то это еще больше оснований разбить триггер на триггер для каждого типа операции DML.

Смежные вопросы