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

Откуда:
Сообщений: 47
Здравствуйте!
Возникла необходимость вести лог для нескольких хранимых процедур. В лог
будет записываться информация по ходу выполнения хранимой процедуры

Я создал простую таблицу с полями:
CREATE TABLE StoredProcLog (
	ID int IDENTITY (1, 1) NOT NULL ,
	DateTime datetime NULL , 
	ProcName nvarchar (200), -- имя хранимой процедуры
	Text nvarchar (2000), --текст, записываемый в лог
)
И
хранимую процедуру для записи в лог

CREATE PROCEDURE [dbo].[spWriteToLog]
	@ProcName VarChar(255),
	@Text VarChar(2000)
AS

INSERT INTO StoredProcLog(DateTime, ProcName, Text)
SELECT GetDate(), @ProcName, @Text

Я могу писать что-то вроде spWriteToLog 'MyStoredProc1', 'Some message.'

Возникли вопросы:
1. Хороший ли это способ ведения лога?
2. Насколько сильно потеряется производительность хранимой процедуры из-за этого,
особенно когда таблица StoredProcLog сильно разрастется.
3. Нет ли еще каких-либо подводных камней

4. Рассматриваю альтернативный способ - запись в текстовый файл через Scripting.FileSystemObject. Какой способ лучше?
21 авг 09, 12:18    [7566040]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
если нужна независимость от транзакций, то файл.. а так особо не повляет от особенно когда разрастется.

для спящего время бодрствования равносильно сну
21 авг 09, 12:27    [7566104]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
всё было бы хорошо, но если вы вызовете эту процедуру внутри транзакции, которая роллбэкнется, то откатятся и ваши логи. И вы не узнаете, что там было....
21 авг 09, 12:29    [7566120]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Алексей2003
если нужна независимость от транзакций, то файл.. а так особо не повляет от особенно когда разрастется.

для спящего время бодрствования равносильно сну


не только файл....
21 авг 09, 12:30    [7566131]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Winnipuh
не только файл....


ну чего уж там... продолжайте, продолжайте мысль :)
21 авг 09, 12:35    [7566169]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Можно складывать в табличную переменную, а в конце (после всех коммитов и роллбэков) - в таблицу.
21 авг 09, 12:41    [7566212]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Филипп Вульфович
Member

Откуда:
Сообщений: 47
Winnipuh
не только файл....


Поясните пожалуйста...
21 авг 09, 12:43    [7566223]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
O_val
Member

Откуда:
Сообщений: 157
Le Peace
Можно складывать в табличную переменную, а в конце (после всех коммитов и роллбэков) - в таблицу.


+1
Только при условии, что транзакция отрывается не на клиенте
21 авг 09, 14:03    [7566826]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
baracs
Member

Откуда: Москва
Сообщений: 7198
Филипп Вульфович
Я создал простую таблицу с полями:
CREATE TABLE StoredProcLog (
	ID int IDENTITY (1, 1) NOT NULL ,
	DateTime datetime NULL , 
	ProcName nvarchar (200), -- имя хранимой процедуры
	Text nvarchar (2000), --текст, записываемый в лог
)

Вместо
ProcName nvarchar (200)
я бы сделал что-нибудь вроде
ProcId smallint
и справочник логируемых ХП в отдельной табличке.

И еще подумал бы: стоит ли пихать в лог
ID int IDENTITY (1, 1)
Может лучше
[DateTime] datetime NOT NULL CONSTRAINT [DF_StoredProcLog_DateTime] DEFAULT (GETDATE())
Поиск-то, скорее всего, будет по времени и процедуре...

По п.2: Insert-ы же таблицу не читают...
По п.3: Когда разрастется, и возникнет мысль об индексах, надо будет о-очень хорошо думать.
21 авг 09, 14:36    [7567082]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать логирование для хранимой процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Кудряшка
Winnipuh
не только файл....


ну чего уж там... продолжайте, продолжайте мысль :)


SQLCLR процедура, которая не участвует в текущей транзакции, открывает коннект и пишет в таблицу. Даже при ролбеке в процедуре вызывавшей её она пишет записи.
Здесь не так давно была тема, и это реально работает.
21 авг 09, 14:42    [7567142]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить