powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер отменяющий изменения в таблице
6 сообщений из 6, страница 1 из 1
Триггер отменяющий изменения в таблице
    #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
Триггер отменяющий изменения в таблице
    #39999772
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написать ещё один триггер. На этот раз - для таблицы tFIO_new.
...
Рейтинг: 0 / 0
Триггер отменяющий изменения в таблице
    #39999781
slavadan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Написать ещё один триггер. На этот раз - для таблицы tFIO_new.

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

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

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

а в триггере INSTEAD OF UPDATE tFIO, проверять CONTEXT_INFO() и в зависимости от его значения, или инсертить в tFIO_new, или апдейтить tFIO
...
Рейтинг: 0 / 0
Триггер отменяющий изменения в таблице
    #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
Триггер отменяющий изменения в таблице
    #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
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер отменяющий изменения в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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