Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Тригер на Isert для view  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
добрый день
как сделать тригер на инсерт, чтоб он запускал хранимую процедуру
REATE TRIGGER calcalationInsert 
   ON  [dbo].[calcalation]
   FOR INSERT
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
select
  id,       -- неизменяемый идентификатор строки
  value_1,
  value_2,
from
  inserted

этим я получаю данные для вставки. правильно?
теперь как эти данные подставить в хранимую проыедуду
exec calcInsert id,value_1,value_2 ....
3 фев 12, 15:15    [12027401]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Рострига Артур,
INSTEAD OF INSERT, а не FOR

добавляемые записи в виртуальных таблицах iserted / deleted .
3 фев 12, 15:19    [12027468]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
и курсор..
3 фев 12, 15:20    [12027484]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Crimean
и курсор..

лучше переписать хп, чтоб можно передать таблу
3 фев 12, 15:21    [12027503]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Ken@t
Crimean
и курсор..

лучше переписать хп, чтоб можно передать таблу


это если версия сиквела позволит (1) и дизайн системы (2)
очень часто в хранимках прячется достаточно сложная логика, ориентированная на построчную обработку
очень часто эту логику практически нереально переписать в расчете на массовую обработку - те же "сложные лимиты", к примеру
3 фев 12, 15:24    [12027537]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ken@t
Crimean
и курсор..

лучше переписать хп, чтоб можно передать таблу
А откуда её взять?
Ведь придётся временную таблицу создавать и заполнять.

Лучше вообще процедуру выбросить, а её внутренности разместить в триггере.
3 фев 12, 15:25    [12027544]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
iap
Ken@t
пропущено...

лучше переписать хп, чтоб можно передать таблу
А откуда её взять?
Ведь придётся временную таблицу создавать и заполнять.

Лучше вообще процедуру выбросить, а её внутренности разместить в триггере.


А если UI пользует её, а если текст дури изменят , а текст триггера - нет..
3 фев 12, 15:27    [12027576]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
iap
А откуда её взять?
Ведь придётся временную таблицу создавать и заполнять.


по-моему "давно" можно так:

declare @a table ()
insert into @a select from inserted
exec myproc @a


только хорошо это или плохо однозначно сложно сказать + уже вышесказанное
3 фев 12, 15:28    [12027587]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Ken@t
если текст дури изменят , а текст триггера - нет..


бред. триггер ничем от хранимки не отличается с точки зрения "дуроустойчивости"
3 фев 12, 15:30    [12027607]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Crimean
Ken@t
если текст дури изменят , а текст триггера - нет..


бред. триггер ничем от хранимки не отличается с точки зрения "дуроустойчивости"


От чего же, дублирование куда в процедуре и триггере - потенциальный источник забавных ошибок.
3 фев 12, 15:34    [12027668]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Crimean
iap
А откуда её взять?
Ведь придётся временную таблицу создавать и заполнять.


по-моему "давно" можно так:

declare @a table ()
insert into @a select from inserted
exec myproc @a


только хорошо это или плохо однозначно сложно сказать + уже вышесказанное
Я и говорю: создать и заполнить.
Представим, что в inserted миллион записей...
К тому же это требует отслеживать изменения в структуре inserted.
3 фев 12, 15:34    [12027680]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
Crimean,

логика простая
if  @value_1 <>0
  INSERT INTO real_key(id_real,id_keys,value) VALUES (@id,1,@value_1)
if  @value_2 <>0
  INSERT INTO real_key(id_real,id_keys,value) VALUES (@id,2,@value_2)

не пойму как получить доступ к переменным
select
id, -- неизменяемый идентификатор строки
value_1,
и вытащить их в инсерт(((
3 фев 12, 15:37    [12027712]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Рострига Артур
не пойму как получить доступ к переменным


КУРСОР
3 фев 12, 15:39    [12027758]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Рострига Артур,

в курсе, что инсертить можно из SELECTа?
В WHERE которого проверять @value_1?
То же самое и с @value_2
3 фев 12, 15:40    [12027781]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
Рострига Артур,

в курсе, что инсертить можно из SELECTа?
В WHERE которого проверять @value_1?
То же самое и с @value_2
Это я к тому, что эту "простую логику" надо перенести в триггер
3 фев 12, 15:42    [12027795]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Рострига Артур
как сделать тригер на инсерт, чтоб он запускал хранимую процедуру


declare ccc cursor for
select id from inserted

open ccc

while 1=1 begin

declare @id 

fetch next from ccc into @id

if @@fetch_status <> 0 break

exec myproc @id

end
3 фев 12, 15:43    [12027818]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
iap,

не пойму как
у меня идет
SELECT id,value_1,value_2 FROM insert

а вставить нужно
INSERT INTO real_key(id_real,id_keys,value) VALUES (@id,1,@value_1)
INSERT INTO real_key(id_real,id_keys,value) VALUES (@id,2,@value_2)

при этом поля может и не быть какого-то, равно NULL
3 фев 12, 15:44    [12027839]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
CREATE TRIGGER dbo.InsteadOfInsertCalcalation ON dbo.Calcalation INSTEAD OF INSERT AS
IF EXISTS(SELECT * FROM inserted)
BEGIN
 SET NOCOUNT ON;
 INSERT real_key(id_real,id_keys,value)
 SELECT id,1,value_1
 FROM inserted
 WHERE value_1<>0
 UNION ALL
 SELECT id,2,value_1
 FROM inserted
 WHERE value_2<>0;
END;
А это ничего, что записи, в которых оба поля ненулевые, попадут в real_key дважды?
3 фев 12, 15:51    [12027956]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Традиционная опечатка
iap
CREATE TRIGGER dbo.InsteadOfInsertCalcalation ON dbo.Calcalation INSTEAD OF INSERT AS
IF EXISTS(SELECT * FROM inserted)
BEGIN
 SET NOCOUNT ON;
 INSERT real_key(id_real,id_keys,value)
 SELECT id,1,value_1
 FROM inserted
 WHERE value_1<>0
 UNION ALL
 SELECT id,2,value_2
 FROM inserted
 WHERE value_2<>0;
END;
А это ничего, что записи, в которых оба поля ненулевые, попадут в real_key дважды?
3 фев 12, 15:52    [12027966]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Glory
Member

Откуда:
Сообщений: 104751
INSERT INTO real_key(id_real,id_keys,value)
select id, value_1 from inserted
union all
select id, value_2 from inserted
3 фев 12, 15:53    [12027986]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
iap
Традиционная опечатка
iap
CREATE TRIGGER dbo.InsteadOfInsertCalcalation ON dbo.Calcalation INSTEAD OF INSERT AS
IF EXISTS(SELECT * FROM inserted)
BEGIN
 SET NOCOUNT ON;
 INSERT real_key(id_real,id_keys,value)
 SELECT id,1,value_1
 FROM inserted
 WHERE value_1<>0
 UNION ALL
 SELECT id,2,value_2
 FROM inserted
 WHERE value_2<>0;
END;
А это ничего, что записи, в которых оба поля ненулевые, попадут в real_key дважды?

Во вроде то что нужно!!!
Спасибо.
не понял почему они попадут дважды?
CREATE TABLE [dbo].[real_key](
	[id_real] [int] NOT NULL,
	[id_keys] [int] NOT NULL,
	[value] [float] NOT NULL,
 CONSTRAINT [PK_real_key] PRIMARY KEY CLUSTERED 
(
	[id_real] ASC,
	[id_keys] ASC
)
3 фев 12, 15:55    [12028008]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Чуть не забыл. Надо же ещё WITH VIEW_METADATA при создании VIEW.
А то не факт, что триггер будет всегда запускаться.
3 фев 12, 15:55    [12028010]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Рострига Артур
iap
Традиционная опечатка пропущено...

Во вроде то что нужно!!!
Спасибо.
не понял почему они попадут дважды?
CREATE TABLE [dbo].[real_key](
	[id_real] [int] NOT NULL,
	[id_keys] [int] NOT NULL,
	[value] [float] NOT NULL,
 CONSTRAINT [PK_real_key] PRIMARY KEY CLUSTERED 
(
	[id_real] ASC,
	[id_keys] ASC
)
Попадут дважды, но с разным [id_keys].
Как я мог догадаться о структуре таблиц??
3 фев 12, 15:56    [12028022]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
iap
Чуть не забыл. Надо же ещё WITH VIEW_METADATA при создании VIEW.
А то не факт, что триггер будет всегда запускаться.


а с этого места можно поподробнее? каким боком это к сработке триггера?
3 фев 12, 15:59    [12028057]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на Isert для view  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
iap,

а виев тоже нужно переписать через курсор или нормально?
SELECT     real_key_1.value AS value_1, real_key_2.value AS value_2
FROM         dbo.real INNER JOIN
                      dbo.real_key AS real_key_1 ON dbo.real.id = real_key_1.id_real AND real_key_1.id_keys = 1 LEFT OUTER JOIN
                      dbo.real_key AS real_key_2 ON dbo.real.id = real_key_2.id_real AND real_key_2.id_keys = 2 LEFT OUTER JOIN
3 фев 12, 16:00    [12028074]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить