Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер отменяющий изменения в таблице / 6 сообщений из 6, страница 1 из 1
17.09.2020, 12:20
    #39999740
slavadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер отменяющий изменения в таблице
Ребята, помогите написать триггер, никак не могу сообразить
Есть две таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        CREATE TABLE [dbo].[tFIO](
	[FIO] [dbo].[varchar(50)] NOT NULL,
	[Number] [dbo].[int] NOT NULL
	
)

        CREATE TABLE [dbo].[tFIO_new](
	[FIO_n] [dbo].[varchar(50)] NOT NULL,
	[Number_n] [dbo].[int] NOT NULL
	
)



Нужен триггер, который при обновлении данных в таблице tFIO переписывал бы это обновление в таблицу tFIO_new, а таблицу tFIO оставлял бы без изменений. Мне видится вот такой вариант

Код: sql
1.
2.
3.
4.
5.
6.
CREATE TRIGGER Test ON tFIO
INSTEAD OF UPDATE
AS
 INSERT INTO tFIO_new (FIO_n,Number_n)
 SELECT  FIO, Number
 FROM inserted



И вроде бы вариант хороший, но следующий шаг должен быть такой. При удалении записи из таблицы tFIO_new она должна апдейтить запись соответствующего номера в таблице tFIO. Вот тут я затрудняюсь, подкиньте идею.
...
Рейтинг: 0 / 0
17.09.2020, 13:44
    #39999772
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер отменяющий изменения в таблице
Написать ещё один триггер. На этот раз - для таблицы tFIO_new.
...
Рейтинг: 0 / 0
17.09.2020, 13:54
    #39999781
slavadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер отменяющий изменения в таблице
Dimitry Sibiryakov
Написать ещё один триггер. На этот раз - для таблицы tFIO_new.

Ну это понятно, но триггер на tFIO имеет тип INSTEAD OF и вставить в таблицу физически ничего не даст.
Как вариант использовать триггер не INSTEAD OF, а например after update, но нужно как-то отменять изменения, с этим я не могу разобраться.
...
Рейтинг: 0 / 0
17.09.2020, 14:35
    #39999831
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер отменяющий изменения в таблице
slavadan,

имхо, правильно такую логику реализовывать на ХП, а не пытаться "вложить" её в триггеры ...

Но, как вариант, можно в триггере на удаление tFIO_new устанавливать какое-то "секретное" значение CONTEXT_INFO
после чего, в этом же триггере выполнять UPDATE tFIO

а в триггере INSTEAD OF UPDATE tFIO, проверять CONTEXT_INFO() и в зависимости от его значения, или инсертить в tFIO_new, или апдейтить tFIO
...
Рейтинг: 0 / 0
17.09.2020, 14:45
    #39999843
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер отменяющий изменения в таблице
slavadan
Dimitry Sibiryakov
Написать ещё один триггер. На этот раз - для таблицы tFIO_new.

Ну это понятно, но триггер на tFIO имеет тип INSTEAD OF и вставить в таблицу физически ничего не даст.
Как вариант использовать триггер не INSTEAD OF, а например after update, но нужно как-то отменять изменения, с этим я не могу разобраться.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
drop table if exists tFIO1, tFIO2;

create table tFIO1 (
   [fio] varchar(255),
   [id] int
);

create table tFIO2 (
   [fio] varchar(255),
   [id] int
);

insert into tFIO1 values ('test', 1)
insert into tFIO2 values ('test', 1)
go

create or alter trigger t1_tFIO1 on tFIO1 instead of update
as
IF TRIGGER_NESTLEVEL() > 1
    UPDATE t
       set [fio] = i.[fio]
      FROM tFIO1 t
          JOIN INSERTED i on i.[id] = t.[id];
ELSE
    insert into tFIO2 select [FIO], [ID] FROM INSERTED
go

create trigger tr_tFIO2 on tFIO2 after delete
as
update t
   set [FIO] = 'deleted:' + t.[FIO]
  from tFIO1 t
      join deleted d on d.[id] = t.[id];
go

select * from tFIO1;
select * from tFIO2;

update tFIO1 
set fio = 'test2'
where id = 1

select * from tFIO1;
select * from tFIO2;

delete from tFIO2;

select * from tFIO1;
select * from tFIO2;
...
Рейтинг: 0 / 0
17.09.2020, 16:57
    #39999971
slavadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер отменяющий изменения в таблице
felix_ff
slavadan
пропущено...

Ну это понятно, но триггер на tFIO имеет тип INSTEAD OF и вставить в таблицу физически ничего не даст.
Как вариант использовать триггер не INSTEAD OF, а например after update, но нужно как-то отменять изменения, с этим я не могу разобраться.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
drop table if exists tFIO1, tFIO2;

create table tFIO1 (
   [fio] varchar(255),
   [id] int
);

create table tFIO2 (
   [fio] varchar(255),
   [id] int
);

insert into tFIO1 values ('test', 1)
insert into tFIO2 values ('test', 1)
go

create or alter trigger t1_tFIO1 on tFIO1 instead of update
as
IF TRIGGER_NESTLEVEL() > 1
    UPDATE t
       set [fio] = i.[fio]
      FROM tFIO1 t
          JOIN INSERTED i on i.[id] = t.[id];
ELSE
    insert into tFIO2 select [FIO], [ID] FROM INSERTED
go

create trigger tr_tFIO2 on tFIO2 after delete
as
update t
   set [FIO] = 'deleted:' + t.[FIO]
  from tFIO1 t
      join deleted d on d.[id] = t.[id];
go

select * from tFIO1;
select * from tFIO2;

update tFIO1 
set fio = 'test2'
where id = 1

select * from tFIO1;
select * from tFIO2;

delete from tFIO2;

select * from tFIO1;
select * from tFIO2;



Спасибо уважаемому felix_ff, код работает
Немного исправил код во втором триггере, должно быть

Код: sql
1.
 set [FIO] = 'deleted:' + d.[FIO]


вместо
Код: sql
1.
 set [FIO] = 'deleted:' + t.[FIO]
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер отменяющий изменения в таблице / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]