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

Откуда:
Сообщений: 19
Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) Sep 6 2009 01:43:32 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

Для вливания в таблицу данных по ODBC создана вьюха с триггером.
Триггер предназначен для согласования форматов полей, в том числе DT.
Попытки вызвать из тела триггера хранимую продцедуру, которая преобразует DT, проваливаются с сообщением:

"Cannot find either column "dbo" or the user-defined function or aggregate "dbo.Date_To_Int", or the name is ambiguous."

Хранимая продцедура с таким названием есть. Но получается что из триггера ее не видно.
Можно ли это обойти?
8 ноя 09, 15:54    [7898183]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Din Gior,

текст триггера было бы интересно увидеть.
8 ноя 09, 16:05    [7898198]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Din Gior
Member

Откуда:
Сообщений: 19
USE [Base_1]
GO
/****** Object:  Trigger [dbo].[tr_vw_Orders]    Script Date: 11/08/2009 16:15:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE trigger [dbo].[tr_vw_Orders] on  [dbo].[vw_Orders] instead of insert
as begin
  set nocount on;
  insert into [dbo].[Orders] ([DT], [OrderNo], [Price], [Quant])
  
  select (dbo.Date_To_Int(convert(datetime, ins.[Date]+ ' '+ ins.[Time], 104))),
                ins.OrderNo,                
                ins.[Price], 
                ins.[Quant]
  from inserted ins;
end;
8 ноя 09, 16:25    [7898235]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Date_To_Int - процедура?
А вызываете вы её как функцию.

-------------------------
There’s no silver bullet!
8 ноя 09, 16:28    [7898242]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Din Gior
Member

Откуда:
Сообщений: 19
Пытаюсь научится. Подскажите как правильно. Продцедура возвращает значение int, которое затем используется для вставки.
8 ноя 09, 16:38    [7898255]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Din Gior,

перепишите в виде скалярной функции.
Либо, если таковое не представляется возможным - используйте курсоры.
8 ноя 09, 16:40    [7898259]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Din Gior
Member

Откуда:
Сообщений: 19
Другими словами, вызвать как продцедуру невозможно?
8 ноя 09, 16:43    [7898265]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Din Gior
Другими словами, вызвать как продцедуру невозможно?

Вызвать процедуру как функцию - невозможно.
Вызвать процедуру как процедуру - возможно. Например, открыв курсов по inserted, пробежавшись по нему и для каждой строки сделав exec @res = dbo.Date_To_Int ....
8 ноя 09, 16:48    [7898274]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
locky,

человеку, который не отличает процедуру от функции, советовать курсор??
IMHO, чайнику, который "пытается научится", курсор можно изучать только после всего остального.

Din Gior,

что делает Ваша процедура dbo.Date_To_Int? Почему от неё нельзя отказаться?
8 ноя 09, 17:52    [7898369]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Din Gior
Member

Откуда:
Сообщений: 19
locky, Спасибо огромное :)

Date_To_Int в функцию переделать удалось. Работает.
Есть еще вопрос. Попытался переделать еще одну продцедуру в функцию, но не получается. Там у меня селекты и инсерты. Сервер говорит:

Msg 443, Level 16, State 15, Procedure FUN2_GetSecNum, Line 17
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function.


Не получится вставить с помощью функции?
11 ноя 09, 16:29    [7915400]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Din Gior
Не получится вставить с помощью функции?


не пробовали, прежде, чем что-то делать и переделывать, почитать документацию, дабы понять, что можно делать в функции, а что нет.
11 ноя 09, 16:44    [7915502]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Din Gior
Member

Откуда:
Сообщений: 19
Благодарю за дельный совет.
Хотя простой ответ "Да можно" или "нет нельзя" помог бы сэкономить пару-тройку суток.

Для тех кто столкнется с такой же проблемой скажу, что из функции нет возможности изменить данные в базе. Т.е. не получится ни insert, ни update.
select - можно.

Из триггера не получится вызвать обычную хранимую продцедуру. Поэтому лучше прописать все действия в триггере.
18 ноя 09, 14:14    [7945194]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Glory
Member

Откуда:
Сообщений: 104760
Din Gior

Из триггера не получится вызвать обычную хранимую продцедуру.

И по каким же причинам не получится ?
18 ноя 09, 14:19    [7945227]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Din Gior
Для тех кто столкнется с такой же проблемой скажу, что из функции нет возможности изменить данные в базе.
Это не совсем так.
Из функции можно вызывать Extended Stored Procedure (ESP) и CLR-функции (начиная с версии 9.0). А уж они могут делать с базой почти всё.
Однако, это настоятельно не рекомендуется.
ESP же в будущих версиях Microsoft обещал вообще запретить.
18 ноя 09, 14:20    [7945241]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой продцедуры из триггера  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Din Gior
Благодарю за дельный совет.
Хотя простой ответ "Да можно" или "нет нельзя" помог бы сэкономить пару-тройку суток.

Для тех кто столкнется с такой же проблемой скажу, что из функции нет возможности изменить данные в базе. Т.е. не получится ни insert, ни update.
select - можно.

Из триггера не получится вызвать обычную хранимую продцедуру. Поэтому лучше прописать все действия в триггере.


вы бы добавили фразы типа "мне почему-то кажется...." к таким полезным советам
18 ноя 09, 14:26    [7945292]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить