CREATE TRIGER

talyi

Кто может подсказать можно в одном тригере повесить несколько действийпо аналогии с ораклом: - {create or replace trigger UsrT000000016 before update or insert or delete on T000000016 for each row beginif INSERTING THENinsert into repltab(id_date,name_table,work_table) values(:NEW.F000000056,'T000000016' ,'1');elsif UPDATING THENinsert into repltab(id_date,name_table,work_table) values(:NEW.F000000056,'T000000016' ,'2');elsif DELETING THENinsert into repltab(id_date,name_table,work_table) values(:OLD.F000000056,'T000000016' ,'3');end if;end;}
17 ответов

talyi

Анализировать наличие записей в inserted и deleted. С учетом случая, когда они обе пусты.


talyi

а поконкретнее?заранее приношу свои извененияс mssql ранее не работал.....


talyi

inserted - вставляемые записиdeleted - удаляемыеесли заполнены обе, то это update


talyi

сделал следуюшее не работает (((((((где не правильно подскажите SET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GOALTER TRIGGER USERT000000113 ON T000000103FOR INSERT, UPDATE, DELETE AS IF (( SELECT del.F000000583 FROM deleted del) is not null ) begin IF (( SELECT ins.F000000583 FROM inserted ins) is not null ) begin INSERT INTO repltab (id_date, name_table, work_table) SELECT ins.F000000583, 'T000000103', '2' FROM inserted ins end else begin INSERT INTO repltab (id_date, name_table, work_table) SELECT ins.F000000583, 'T000000103', '1' FROM inserted ins end end else begin INSERT INTO repltab (id_date, name_table, work_table) SELECT del.F000000583, 'T000000103', '3' FROM deleted del endGOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GO


talyi

в mssql нет триггеров for each row. триггера всегда срабатывают один разна инструкцию insert/update/delete. в inserted/deleted в этом случае может бытьнесколько записей. в этом случае, вот это:
(( SELECT del.F000000583 FROM deleted del) is not null )
приведет к ошибке.если уж действительно так надо совмещать три триггера в одном, топроверяйте наличие записей в inserted/deleted так:
if exists(select * from inserted)


talyi

срабатывае только на update где затык не понятноCREATE TRIGGER USERT000000113 ON T000000103FOR INSERT, UPDATE, DELETE AS IF exists(select * from deleted) begin IF exists(select * from inserted) begin INSERT INTO repltab (id_date, name_table, work_table) SELECT ins.F000000583, 'T000000103', '2' FROM inserted ins end else begin INSERT INTO repltab (id_date, name_table, work_table) SELECT ins.F000000583, 'T000000103', '1' FROM inserted ins end end else begin INSERT INTO repltab (id_date, name_table, work_table) SELECT del.F000000583, 'T000000103', '3' FROM deleted del end


talyi

CREATE TRIGGER USERT000000113 
ON T000000103
FOR INSERT, UPDATE, DELETE 
AS
	IF EXISTS (SELECT <b>1</b> FROM deleted)
 BEGIN
		IF EXISTS (select <b>1</b> FROM inserted)
 BEGIN
			INSERT INTO repltab (id_date, name_table, work_table) 
			SELECT F000000583, 'T000000103', '2' 
			FROM inserted

			INSERT INTO repltab (id_date, name_table, work_table) 
			SELECT F000000583, 'T000000103', '1' 
			FROM inserted
 END

		INSERT INTO repltab (id_date, name_table, work_table) 
		SELECT F000000583, 'T000000103', '3' 
		FROM deleted
 END
Переписал по красивее :0)Вот так должно работать!!!


talyi

IF exists(select * from deleted) and exists(select * from inserted)
begin
 INSERT INTO repltab (id_date, name_table, work_table) SELECT ins.F000000583, 'T000000103', '2' FROM inserted ins
end
else
 if exists(select * from inserted)
 begin
 INSERT INTO repltab (id_date, name_table, work_table) SELECT ins.F000000583, 'T000000103', '1' FROM inserted ins
 end
 else
 if exists(select * from deleted)
 begin
 INSERT INTO repltab (id_date, name_table, work_table) SELECT del.F000000583, 'T000000103', '3' FROM deleted del
 end
но я все же хорошенько подумал бы, стоит ли создавать себе проблему, объединяятри триггера в одном, ради того, чтоб потом ее решать, определяя в этомтриггере, какая же операция его вызвала.


talyi

писал по аналогии с ораклом так что нюансы могу не знать....в чем может быть проблема при таком анализе sql?


talyi

CREATE TRIGGER USERT000000113 
ON T000000103
FOR INSERT, UPDATE, DELETE 
AS
	IF EXISTS (SELECT <b>1</b> FROM deleted)
 BEGIN
		IF EXISTS (select <b>1</b> FROM inserted)
 BEGIN
			INSERT INTO repltab (id_date, name_table, work_table) 
			SELECT F000000583, 'T000000103', '2' 
			FROM inserted

			INSERT INTO repltab (id_date, name_table, work_table) 
			SELECT F000000583, 'T000000103', '1' 
			FROM inserted
 END

		INSERT INTO repltab (id_date, name_table, work_table) 
		SELECT F000000583, 'T000000103', '3' 
		FROM deleted
 END
Переписал по красивее :0)Вот так должно работать!!!
логика нарушена сработает только при update


talyi

CREATE TRIGGER USERT000000113 ON T000000103 FOR INSERT, UPDATE, DELETE AS
IF @@ROWCOUNT > <b>0</b>
 IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '1' --insert
 FROM inserted
 ELSE IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '3' --delete
 FROM deleted
 ELSE
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '2' --update
 FROM inserted;
GO


talyi

CREATE TRIGGER USERT000000113 
ON T000000103
FOR INSERT, UPDATE, DELETE 
AS
	IF EXISTS (SELECT <b>1</b> FROM deleted)
 BEGIN
		IF EXISTS (select <b>1</b> FROM inserted)
 BEGIN
			INSERT INTO repltab (id_date, name_table, work_table) 
			SELECT F000000583, 'T000000103', '2' 
			FROM inserted

			INSERT INTO repltab (id_date, name_table, work_table) 
			SELECT F000000583, 'T000000103', '1' 
			FROM inserted
 END

		INSERT INTO repltab (id_date, name_table, work_table) 
		SELECT F000000583, 'T000000103', '3' 
		FROM deleted
 END
Переписал по красивее :0)Вот так должно работать!!!
Обшибся, неправильно тут :0(Почему неправильно в изначальном варианте:Вложенный IF проверяет, существуют ли записи в ins, если есть, то это UPDATE (так они есть и в del). В противном случае мы копируем из ins с параметром 2, надеясь, что это инсерт. НО, ins же у нас пустой, мы только что это проверили!!! То же самое с внешним IF'омВроде популярно объяснил... :0)


talyi

CREATE TRIGGER USERT000000113 ON T000000103 FOR INSERT, UPDATE, DELETE AS
IF @@ROWCOUNT > <b>0</b>
 IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '1' --insert
 FROM inserted
 ELSE IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '3' --delete
 FROM deleted
 ELSE
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '2' --update
 FROM inserted;
GO
Опечатка
CREATE TRIGGER USERT000000113 ON T000000103 FOR INSERT, UPDATE, DELETE AS
IF @@ROWCOUNT > <b>0</b>
 IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '1' --insert
 FROM inserted
 ELSE IF NOT EXISTS(SELECT * FROM inserted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '3' --delete
 FROM deleted
 ELSE
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '2' --update
 FROM inserted;
GO


talyi

CREATE TRIGGER USERT000000113 ON T000000103 FOR INSERT, UPDATE, DELETE AS
IF @@ROWCOUNT > <b>0</b>
 IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '1' --insert
 FROM inserted
 ELSE IF NOT EXISTS(SELECT * FROM deleted)
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '3' --delete
 FROM deleted
 ELSE
 INSERT repltab (id_date, name_table, work_table)
 SELECT F000000583, 'T000000103', '2' --update
 FROM inserted;
GO
delete не работает ... (((


talyi

Всем огромное спасибо.....


talyi

А зачем вообще это нужно? Не проще ли использовать три разных триггера?


talyi

delete не работает ... (((
Я же поправился