2015-04-10 2 views
0

Я раньше не использовал триггеры, но они кажутся способ решить эту проблему.SQL Trigger для сохранения другой таблицы в актуальном состоянии

Я хочу иметь таблицу, которая имеет до даты записей из двух таблиц: Item_Master и Dev_Master ->Union_Master

Главным, я не понимание является вставленными и удаленными таблицами «». Если я хочу обновить одну строку (при обновлении строки), как мне получить доступ к столбцам вставленных таблиц?

Вот то, что я до сих пор:

ALTER TRIGGER [dbo].[DevMasterChangeTrigger] 
ON [dbo].[DEV_MASTER] 
AFTER INSERT, UPDATE, DELETE 
AS 
    DECLARE @UpdateType nvarchar(1) 
    DECLARE @UpdatedDT datetime 

    SELECT @UpdatedDT = CURRENT_TIMESTAMP 

    SET NOCOUNT ON; 

    IF EXISTS (SELECT * FROM inserted) 
     IF EXISTS (SELECT * FROM deleted) 
      SELECT @UpdateType = 'U' -- Update Trigger 
     ELSE 
      SELECT @UpdateType = 'I' -- Insert Trigger 
    ELSE 
     IF EXISTS (SELECT * FROM deleted) 
      SELECT @UpdateType = 'D' -- Delete Trigger 
     ELSE 
      SELECT @UpdateType = NULL; -- Unknown Operation 

    IF @UpdateType = 'I' 
    BEGIN 
     PRINT 'Insert' 
    END 

    IF @UpdateType = 'U' 
    BEGIN 
     UPDATE dbo.UNION_MASTER 
     SET PRDNO = inserted.PRDNO & 'abc' 
     WHERE dbo.DEV_MASTER.PRDNO = inserted.PRDNO 
    END 

    IF @UpdateType = 'D' 
    BEGIN 
     PRINT 'Delete' 
    END 

Кроме того, любые хорошие книги по погружая самого себя в MS SQL Server?

Редактировать: ok, для всех, кто наткнулся на этот пост, я понял это. Надеюсь, я не пропустил никаких нюансов, которые вызывают проблемы. Удаления части это немного для меня загадка ...

USE [abc] 
GO 
/****** Object: Trigger [dbo].[DevMasterChangeTrigger] Script Date: 10/04/15 12:43:43 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[DevMasterChangeTrigger] 
ON [dbo].[DEV_MASTER] 
AFTER INSERT, UPDATE, DELETE 
AS 
DECLARE @UpdateType nvarchar(1) 
DECLARE @UpdatedDT datetime 

SELECT @UpdatedDT = CURRENT_TIMESTAMP 



IF EXISTS (SELECT * FROM inserted) 
    IF EXISTS (SELECT * FROM deleted) 
     SELECT @UpdateType = 'U' -- Update Trigger 
    ELSE 
     SELECT @UpdateType = 'I' -- Insert Trigger 
ELSE 
    IF EXISTS (SELECT * FROM deleted) 
     SELECT @UpdateType = 'D' -- Delete Trigger 
    ELSE 
     SELECT @UpdateType = NULL; -- Unknown Operation 

IF @UpdateType = 'I' 
BEGIN 
    INSERT INTO [UNION_MASTER] 
    (PRDID, {Insert various fields here}) 
    SELECT [inserted].[PRDID], [inserted].{Insert various fields here} 
    FROM inserted 
END 

IF @UpdateType = 'U' 
BEGIN 
    UPDATE [UNION_MASTER] 
    SET 
    [UNION_MASTER].[abcdfield]=[inserted].[abcdfield], {other fields here} 
    FROM inserted 
    WHERE [UNION_MASTER].[PRDNO]=inserted.prdno  
END 

IF @UpdateType = 'D' 
BEGIN 
    declare @prdno varchar(50) 
    SELECT @prdno= PRDNO FROM deleted 
    DELETE 
    FROM UNION_MASTER 
    WHERE PRDNO = @prdno 
END 
+1

для книги: попробовать 'Training Kit (экзамен 70-461): Запрос Microsoft SQL Server 2012' , который охватывает почти все :) –

ответ

1

Короче говоря, inserted и deleted таблицы специальные таблицы, которые могут использованы в DML триггеры. Эти таблицы содержат строки на основе выполняемой операции DML, которая активировала триггер.

inserted таблица содержит данные строки, которые либо вставленные для insert заявления или недавно модифицированных строки в случае update

удален таблица содержат строки, которые будут удалены в delete операции или старых данных, который был модифицирован в случай update

в вашем триггером, вы можете попробовать что-то вроде этого

ALTER TRIGGER [dbo].[DevMasterChangeTrigger] 
ON [dbo].[DEV_MASTER] 
AFTER INSERT, UPDATE, DELETE 
AS 
    DECLARE @UpdateType nvarchar(1) 
    DECLARE @UpdatedDT datetime 

    SELECT @UpdatedDT = CURRENT_TIMESTAMP 

    SET NOCOUNT ON; 

    IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) 
      SELECT @UpdateType = 'U' -- Update Trigger 
     ELSE IF EXISTS(SELECT * FROM inserted) 
      SELECT @UpdateType = 'I' -- Insert Trigger 
     ELSE IF EXISTS (SELECT * FROM deleted) 
      SELECT @UpdateType = 'D' -- Delete Trigger 
     ELSE 
      SELECT @UpdateType = NULL; -- Unknown Operation 

    IF @UpdateType = 'I' 
    BEGIN 
     PRINT 'Insert' 
     // add appropriate logic here 
    END 

    IF @UpdateType = 'U' 
    BEGIN 
     UPDATE U dbo.UNION_MASTER 
     SET PRDNO = inserted.PRDNO & 'abc' 
     FROM dbo.UNION_MASTER U 
     inner join inserted i -- this table will have the rows affected from update statement for table DEV_MASTER 
     on i.<UNION_MASTER_ID> = U.<UNION_MASTER_ID> -- USE appropriate joining condition 
    END 

    IF @UpdateType = 'D' 
    BEGIN 
     PRINT 'Delete' 
     // add appropriate logic here 
    END 

Ref разностная ссылки

https://msdn.microsoft.com/en-us/library/ms191300.aspx

http://www.mssqltips.com/sqlservertip/2342/understanding-sql-server-inserted-and-deleted-tables-for-dml-triggers/

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