@alex99505

MSSQL триггер на поступление данных и копирование их в другую БД?

Как в MSSQL поставить тригер, который бы срабатывал при поступлении данных и копировал бы эти самые данные в другую БД предварительно их изменив?
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
https://msdn.microsoft.com/ru-ru/library/ms189799(...

Если конечно под термином "поступление" подразумевается insert или update

соответственно
create trigger имя_триггера on имя_таблицы after insert, update, delete as
....


Можно даже позабавиться и сделать триггер instead of и потом получать лулзы от взрывов мозга пытающихся разобраться почему не вставляются данные )
Ответ написан
tsklab
@tsklab
Системный администратор, программист
Но интересует именно как в другую БД вставлять.
Перед именем таблицы поставьте название БД. Естественно пользователь должен иметь нужные права.
INSERT INTO Gamege.dbo.TestTable (f1)
VALUES ('test')


SELECT @val = (SELECT val FROM inserted)
Грубая ошибка. В inserted (таблица) находится не одна запись. Нужно использовать либо курсор, либо соединение таблиц.

А как с курсором это будет выглядеть?

TRIGGER и CURSOR
CREATE TRIGGER AlbumRoleInsert ON AlbumRole INSTEAD OF INSERT AS 
BEGIN
  DECLARE @ALB INT, @PRF INT, @ROL VARCHAR(500), @mas INT, @pla BIT, @mem BIT, @gue BIT
  DECLARE @ID INT, @RLR VARCHAR(500)
  
  DECLARE LISTROLE CURSOR LOCAL FAST_FORWARD FOR
    SELECT Album, Master, Performer, Play, Member, Role, SpecialGuest
      FROM Inserted
  OPEN LISTROLE
  FETCH LISTROLE INTO @ALB, @mas, @PRF, @pla, @mem, @ROL, @gue
  WHILE @@FETCH_STATUS = 0 BEGIN
    -- Есть запись?
    IF EXISTS( SELECT * FROM AlbumRole WHERE (Album = @ALB) AND (Performer = @PRF)) BEGIN
      SELECT @ID = ID, @RLR = Role FROM AlbumRole WHERE (Album = @ALB) AND (Performer = @PRF)
      -- Есть роль?
      IF ( CHARINDEX( @ROL, @RLR) = 0 ) SET @RLR = @RLR + ', ' + @ROL
      IF ( @RLR IS NULL ) SET @RLR = @ROL
      -- Обновление списка.
      UPDATE AlbumRole SET Role = @RLR WHERE ID = @ID
    END ELSE BEGIN
      -- Добавление: 
      INSERT INTO AlbumRole ( Album, Master, Performer, Play, Member, Role, SpecialGuest ) 
             VALUES( @ALB, @mas, @PRF, @pla, @mem, @ROL, @gue )
    END
    -- Следующее поле
    FETCH LISTROLE INTO @ALB, @mas, @PRF, @pla, @mem, @ROL, @gue
  END
  CLOSE LISTROLE
  DEALLOCATE LISTROLE
           
END
--
GO

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы