Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
ДАВИД Member Откуда: г. Одесса Сообщений: 348 |
Доброго дня всем! Суть проблемы: В базе есть табл., в ней поле КОЛ. Есть порядка 60 ХП и Функций, которые могут изменить Это поле. Вроде все работает правильно, НО иногда в это поле попадает какое-то большое, неверное значение. Смотрел ХП - не увидел ошибки. Есть мысль сделать триггер на поле и записывать при каждом изменении Старое значение, новое и Имя ХП или Функции, которая это изменение произвела. Вопрос: Каким способом определить ИМЯ ХП или функции, вызвавшей срабатывание триггера? Спасибо, если кто в курсе и подскажет. |
4 сен 14, 12:25 [16534165] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
@@PROCID
|
4 сен 14, 12:27 [16534179] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
ДАВИД, триггер на поле сделать нельзя. Только на INSERT или на DELETE или на UPDATE или на любую их комбинацию. Knyazev Alexey, @@PROCID - это object_id самогО триггера, а не процедуры, из которой сделали UPDATE. |
4 сен 14, 12:33 [16534237] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
внутри триггера @@procid = object_id триггера ДАВИД, никак, триггер не должен по разному работать в зависимости от процедуры вызвавшей изменение таблицы. |
||
4 сен 14, 12:33 [16534238] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Почему тогда для этого поля нет ограничения ? |
||
4 сен 14, 12:34 [16534253] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
а вот тут поподробнее, что это за функции, "изменяющие поле"? |
||
4 сен 14, 12:34 [16534256] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
кто мешает это значение передавать из процедур...например в теле процедуры менять контекст инфо = этому значению....далее триггер просто из контекс_инфо вытаскивает имя процедуры... либо логировать в самих процедурах |
||
4 сен 14, 12:36 [16534275] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
ДАВИД, используйте DBCC INPUTBUFFER(@@SPID) |
4 сен 14, 12:41 [16534317] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
это нужно вносить изменения во все процедуры, а именно этого ТС, по всей видимости, не очень хочет. уж если править процедуры, то сразу по второму варианту
в любом случае это не ответ на вопрос
|
||||||
4 сен 14, 12:41 [16534321] Ответить | Цитировать Сообщить модератору |
ДАВИД Member Откуда: г. Одесса Сообщений: 348 |
Knyazev Alexey - Спасибо. Но, извините, ИМЯ ХП по ее ID ? Напомните функцию, пожалуйста... |
4 сен 14, 12:55 [16534411] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
[quote ДАВИД]Но, извините, ИМЯ ХП по ее ID ?[/quote object_name(@@procID) |
4 сен 14, 13:01 [16534468] Ответить | Цитировать Сообщить модератору |
ДАВИД Member Откуда: г. Одесса Сообщений: 348 |
Knyazev Alexey, А вот с этого места по-подробнее и если можно с маленьким примерчиком. Спасибо |
4 сен 14, 13:08 [16534520] Ответить | Цитировать Сообщить модератору |
ДАВИД Member Откуда: г. Одесса Сообщений: 348 |
Имеется ввиду ЭТО место |
||||
4 сен 14, 13:08 [16534524] Ответить | Цитировать Сообщить модератору |
ДАВИД Member Откуда: г. Одесса Сообщений: 348 |
И еще... В принципе я имел ввиду (просто не ясно сформулировал) СТЕК процедур. А уже из стека брать последнюю, вызвавшую триггер. И еще , триггер конечно срабатывает всегда одинаково. А вот ХП ( какая из 60-65) в это поле заносит фигню - вот ВОПРОС... |
4 сен 14, 13:12 [16534552] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
CREATE TABLE Test ( TestID INT ) GO CREATE TRIGGER TestTrigger ON Test FOR INSERT AS SELECT CAST(CONTEXT_INFO() AS NVARCHAR(128)); GO CREATE PROCEDURE usp_ProcIDTest AS DECLARE @ProcedureName VARBINARY(MAX) = CAST(OBJECT_NAME(@@PROCID) AS VARBINARY(MAX)) SET CONTEXT_INFO @ProcedureName INSERT INTO Test ( TestID ) VALUES ( 1 ) GO EXEC usp_ProcIDTest GO DROP TABLE Test GO |
||||
4 сен 14, 13:13 [16534557] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
А вы что собрались переписать все свои 60-65 процедур ? |
||
4 сен 14, 13:19 [16534612] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
ДАВИД, у вас два пути 1. вы в каждую процедуру дописываете код, отвечающий за идентификацию (запись id процедуры в CONTEXT_INFO) и затем в триггере получаете текущее состояние. 2. если процедуры менять нельзя или неохота, то в триггере анализируете результат DBCC INPUTBUFFER() и пытаетесь понять цепочку событий готовый стек вызова триггера без усилий вы не получите |
4 сен 14, 13:27 [16534675] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Страдалец, поставь в таблице или триггере constraint на "фигню" и спокойно жди... когда прибегут и доложат. |
||
4 сен 14, 13:29 [16534701] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
Не факт, что плохое значение вообще пишет процедура. |
4 сен 14, 13:30 [16534709] Ответить | Цитировать Сообщить модератору |
ДАВИД Member Откуда: г. Одесса Сообщений: 348 |
НЕ факт!!! Но саму программу (модули) я вроде бы [ :-((( ] проверил... Хотя... |
||
4 сен 14, 13:37 [16534782] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |