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

Откуда: Киев
Сообщений: 77
Нужно логировать имя и параметры, с которыми вызывается процедура. Это нужно сделать для всех процедур в базе. Можно ли написать универсальную логику, которая была бы способна логировать вход в любую процедуру с параметрами?
Что-то типа этого:
CREATE PROC dbo.MainProc1 (@param1 VARCHAR(10), param2 VARCHAR(10))
AS
begin
	EXEC dbo.LogProc  --creates string 'dbo.MainProc @param1='blabla1', param2='blabla2' '
	
	/*Some proc logic*/
end

CREATE PROC dbo.MainProc2 (@param1 VARCHAR(10), param2 VARCHAR(10)), param3 VARCHAR(10))
AS
begin
	EXEC dbo.LogProc  --creates string 'dbo.MainProc2 @param1='blabla1', param2='blabla2', param3='blabla3' '
	
	/*Some proc logic*/
end

Как написать dbo.LogProc ?


---------
Победи себя - будешь непобедим.
(А.В. Суворов)
28 авг 13, 15:25    [14766644]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
А что будет с входными параметрами других типов - int, float, datetime, image... ?
28 авг 13, 15:32    [14766685]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Glory,

могут быть только int varchar datetime.
Например, зная имя процедуры можно типы переменных определить через sp_help, но как получить значения этих переменных - вопрос.
28 авг 13, 16:04    [14766868]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
не текстовые типы наверное нужно CAST-ом преобазовать, как мне видится
28 авг 13, 16:08    [14766899]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
ilyaBS
но как получить значения этих переменных - вопрос.

Да никак.
Для обращения к переменной нужно явно указывать ее имя.
28 авг 13, 16:08    [14766901]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Скелетно:

1. Написать логирующу процедуру вида:
create procedure dbo.LogProc
 @ProcName sysname,
 @ProcParams xml
as
begin
 ...
end;

2. Все рабочие процедуры переместить в служебную(ые) схему(ы)
3. Написать служебную процедуру, которая на основе метаданных и соответствия служебных схем из п. 2 и основных схем, будет генерировать в основных схемах процедуру-заглушку, вызывающую LogProc, а затем рабочую процедуру.
4. Написать триггер уровня БД, перегенерирующий процедуру-заглушку по изменению рабочей процедуры.
28 авг 13, 16:46    [14767128]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
aleks2
Guest
Ваще то
sp_executesql
умудряется работать с произвольным списком параметров...
29 авг 13, 11:42    [14770013]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Dimais
Member

Откуда:
Сообщений: 227
Create Proc
as

declare @i int
insert into db..proc_load_log
select db_name() + '.' + object_schema_name(@@procid) + '.' + object_name(@@procid), getdate(), null
select @i = scope_identity()

-- тело процедуры

update db..proc_load_log set enddate = getdate() where id = @i


таблица db..proc_load_log - 3 поля:
имя процедуры
дата начала
дата конца
29 авг 13, 17:06    [14772203]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Гость333
Member

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

А где же тут логирование входных параметров?
29 авг 13, 17:12    [14772235]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
sp_executesql
Guest
aleks2
Ваще то
sp_executesql
умудряется работать с произвольным списком параметров...

а чем это может помочь ТСу?
или это просто негодования "MSу можно а нам нельзя"?
29 авг 13, 17:25    [14772307]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Dimais
Member

Откуда:
Сообщений: 227
Гость333
Dimais,
А где же тут логирование входных параметров?

Да нету, но думаю сделать н сложно ...
29 авг 13, 17:27    [14772318]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Dimais
Гость333
Dimais,
А где же тут логирование входных параметров?

Да нету, но думаю сделать н сложно ...

Я заинтригован, честно. Продемонстрируйте, пожалуйста — чтоб было таким же универсальным куском кода, который берём и копипастим без изменений в любую процедуру.
29 авг 13, 17:32    [14772341]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Dimais
Да нету, но думаю сделать н сложно ...


"Я нашел этому поистине чудесное доказательство, но поля книги слишком узки для него."
29 авг 13, 17:40    [14772382]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
[quot ilyaBS]Нужно логировать имя и параметры, с которыми вызывается процедура.
может лог профайлера?? не?
29 авг 13, 17:45    [14772415]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
aleks2
Guest
sp_executesql
aleks2
Ваще то
sp_executesql
умудряется работать с произвольным списком параметров...

а чем это может помочь ТСу?
или это просто негодования "MSу можно а нам нельзя"?


Если тредстартер добудет текст определения sp_executesql - это может навести его на фсякие мысли...
30 авг 13, 06:56    [14773846]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
aleks2
sp_executesql
пропущено...

а чем это может помочь ТСу?
или это просто негодования "MSу можно а нам нельзя"?


Если тредстартер добудет текст определения sp_executesql - это может навести его на фсякие мысли...
Так это же расширенная процедура, в DLL, откуда её текст взять :-(
30 авг 13, 09:09    [14774099]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
alexeyvg
aleks2
Если тредстартер добудет текст определения sp_executesql - это может навести его на фсякие мысли...
Так это же расширенная процедура, в DLL, откуда её текст взять :-(
Рассказывайте, где взять! Или рыбаки мест не сдают? :-)
30 авг 13, 09:09    [14774103]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Dimais
Member

Откуда:
Сообщений: 227
Гость333
Я заинтригован, честно. Продемонстрируйте, пожалуйста — чтоб было таким же универсальным куском кода, который берём и копипастим без изменений в любую процедуру.


Я не уверен, но вероятно, все входящие параметры каждой процедуры можно запросить в системных таблицах ...
Ну а там уже дело техники ...
30 авг 13, 16:35    [14777108]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
Dimais
Гость333
Я заинтригован, честно. Продемонстрируйте, пожалуйста — чтоб было таким же универсальным куском кода, который берём и копипастим без изменений в любую процедуру.


Я не уверен, но вероятно, все входящие параметры каждой процедуры можно запросить в системных таблицах ...
Ну а там уже дело техники ...

запросить-то можно
30 авг 13, 16:37    [14777116]     Ответить | Цитировать Сообщить модератору
 Re: Логирование процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Dimais
Гость333
Я заинтригован, честно. Продемонстрируйте, пожалуйста — чтоб было таким же универсальным куском кода, который берём и копипастим без изменений в любую процедуру.


Я не уверен, но вероятно, все входящие параметры каждой процедуры можно запросить в системных таблицах ...
Ну а там уже дело техники ...

Ок, запросили:
select * from sys.parameters where object_id = @@procid

Какую технику применяем дальше?
30 авг 13, 16:54    [14777206]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить