Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Потестите плиз процедуру разбора скрипта лог-фала, потом положим в FAQ / 1 сообщений из 1, страница 1 из 1
09.02.2006, 16:27
    #33534853
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потестите плиз процедуру разбора скрипта лог-фала, потом положим в FAQ
ХП написана на WatcomSQL ASA 9 для разбора полученного через DBTRAN скрипта лог-файла. В комплекте к ней идет функция. Вот сами скрипты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
CREATE FUNCTION sp_sys_Translate_Log_RemoveOper (
  IN @Script long varchar
)
RETURNS long varchar
BEGIN
  DECLARE @Pos unsigned int;
  DECLARE @BeginPos unsigned int;
  DECLARE @Str long varchar;
  DECLARE @Oper char( 30 );

  SET @Script = Char( 13 ) || Char( 10 ) || @Script || Char( 13 ) || Char( 10 );

  SET @Pos = Locate(@Script, Char( 13 ) || Char( 10 ) || '--',  1 );
  WHILE @Pos >  0 
  LOOP
    // Получаем строку точки сохранения
    SET @Str = SubStr(@Script, @Pos +  2 , Locate(@Script, Char( 13 ) || Char( 10 ), @Pos +  2 ) - @Pos -  2 );

    // Обрабатываем, если строка является точкой сохранения
    IF PatIndex('--%-%-%', @Str) =  1 
    THEN
      IF @BeginPos IS NOT NULL
      THEN
        SET @Script = Stuff(@Script, @BeginPos, @Pos - @BeginPos, NULL);
        SET @Pos = @BeginPos;
        SET @BeginPos = NULL;
      END IF;

      SET @Oper = SubStr(@Str,  3 , Locate(@Str, '-',  3 ) -  3 );
      IF EXISTS(SELECT * FROM #Exclude_Opers WHERE Oper = @Oper)
      THEN
        SET @BeginPos = @Pos;
      END IF;
      SET @Pos = @Pos +  2 ;
    ELSE
      SET @Pos = @Pos +  2 ;
    END IF;

    SET @Pos = Locate(@Script, Char( 13 ) || Char( 10 ) || '--', @Pos);
  END LOOP;

  IF @BeginPos IS NOT NULL
  THEN
    SET @Script = SubStr(@Script,  1 , @BeginPos -  1 );
  END IF;

  RETURN Trim(@Script);
END;
COMMENT ON PROCEDURE sp_sys_Translate_Log_RemoveOper IS 'Убрать из скрипта лог-файла ненужные операторы';

CREATE PROCEDURE sp_sys_Translate_Log (
  IN @FileName char( 2000 ),
  IN @StartTime timestamp DEFAULT NULL,
  IN @EndTime timestamp DEFAULT NULL,
  IN @AllowCheckPoint bit DEFAULT  1 ,
  IN @AllowConnect bit DEFAULT  1 ,
  IN @AllowDDL bit DEFAULT  1 ,
  IN @AllowDML bit DEFAULT  1 
)
RESULT (
  Num unsigned int,
  OffSet char( 10 ),
  CheckpointTime timestamp,
  Script long varchar
)
BEGIN
  DECLARE @Data long varchar;
  DECLARE @Pos unsigned int;
  DECLARE @Str long varchar;
  DECLARE @Script long varchar;
  DECLARE @ProcessScript bit;

  DECLARE @CurrentTime timestamp;
  DECLARE @BeginTime timestamp;
  DECLARE @BeginPos unsigned int;
  DECLARE @Offs char( 10 );
  DECLARE @ScriptLen unsigned int;

  // Исключаемые операторы
  DECLARE LOCAL TEMPORARY TABLE #Exclude_Opers (
    Oper char( 30 ) NOT NULL PRIMARY KEY,
    PCTFREE  0 
  ) NOT TRANSACTIONAL;

  // Точки сохранения
  DECLARE LOCAL TEMPORARY TABLE #Result (
    Num unsigned int NOT NULL DEFAULT AUTOINCREMENT NOT NULL,
    Offs char( 10 ) NULL,
    CheckpointTime timestamp NULL,
    Script long varchar NOT NULL,
    PCTFREE  0 
  ) NOT TRANSACTIONAL;

  // Считываем транслированный скрипт лог-файла
  SET @Data = Char( 13 ) || Char( 10 ) || xp_read_File(@FileName);
  IF @Data IS NULL
  THEN
    RAISERROR  20000  'Файл "' || @SQLFileName || '" не обнаружен';
    RETURN;
  END IF;

  SET @ProcessScript =  0 ;

  IF @AllowCheckPoint =  0 
  THEN
    INSERT INTO #Exclude_Opers (Oper)
      SELECT 'CHECKPOINT';

    SET @ProcessScript =  1 ;
  END IF;

  IF @AllowConnect =  0 
  THEN
    INSERT INTO #Exclude_Opers (Oper)
      SELECT 'CONNECT';

    SET @ProcessScript =  1 ;
  END IF;

  IF @AllowDML =  0 
  THEN
    INSERT INTO #Exclude_Opers (Oper)
      SELECT 'BEGIN TRANSACTION'
      UNION ALL
      SELECT 'INSERT'
      UNION ALL
      SELECT 'UPDATE'
      UNION ALL
      SELECT 'DELETE'
      UNION ALL
      SELECT 'COMMIT'
      UNION ALL
      SELECT 'ROLLBACK';

    SET @ProcessScript =  1 ;
  END IF;

  IF @AllowDDL =  0 
  THEN
    INSERT INTO #Exclude_Opers (Oper)
      SELECT 'SQL';

    SET @ProcessScript =  1 ;
  END IF;

  // Ищем первую точку сохранения
  SET @Pos = Locate(@Data, Char( 13 ) || Char( 10 ) || '--CHECKPOINT-',  1 );
  SET @BeginPos =  1 ;

  WHILE @Pos >  0 
  LOOP
    // Получаем строку точки сохранения
    SET @Str = SubStr(@Data, @Pos +  2 , Locate(@Data, Char( 13 ) || Char( 10 ), @Pos +  2 ) - @Pos -  2 );
    // Обрабатываем, если строка является точкой сохранения
    IF PatIndex('--CHECKPOINT-____-__________-____-__-__ __:__', @Str) =  1 
    THEN
      // Обрабатываем предыдущую точку сохранения
      SET @ScriptLen = @Pos - @BeginPos;
      SET @Script = Trim(SubStr(@Data, @BeginPos, @ScriptLen));

      // Записываем скрипт, если в точке сохранения он присутствует
      IF @Script <> ''
      THEN
        IF (@StartTime IS NULL OR @StartTime <= @BeginTime) AND (@EndTime IS NULL OR @EndTime >= @BeginTime)
        THEN
          MESSAGE 'Proccessing chekpoin on ' || @BeginTime TO CLIENT;

          IF @ProcessScript =  1 
          THEN
            SET @Script = sp_sys_Translate_Log_RemoveOper(@Script);
          END IF;

          IF @Script <> ''
          THEN
            INSERT INTO #Result (Offs, CheckPointTime, Script)
            VALUES(@Offs, @BeginTime, @Script);
          END IF;
        END IF;
      END IF;

      // Получаем данные точки сохранения
      SET @BeginTime = CONVERT(timestamp, SubStr(@Str,  30 ,  16 ));
      SET @Offs = SubStr(@Str,  19 ,  10 );
      SET @BeginPos = @Pos +  2 ;
      SET @Pos = @BeginPos;
    ELSE
      SET @Pos = @Pos +  15 ;
    END IF;
    // Ищем следующую точку сохранения
    SET @Pos = Locate(@Data, Char( 13 ) || Char( 10 ) || '--CHECKPOINT-', @Pos);
  END LOOP;

  IF @BeginPos IS NOT NULL
  THEN
    SET @Pos = Length(@Data) +  1 ;
    SET @ScriptLen = @Pos - @BeginPos;
    SET @Script = Trim(SubStr(@Data, @BeginPos, @ScriptLen));

    IF @Script <> ''
    THEN
      IF (@StartTime IS NULL OR @StartTime <= @BeginTime) AND (@EndTime IS NULL OR @EndTime >= @BeginTime)
      THEN
        MESSAGE 'Proccessing chekpoin on ' || @BeginTime TO CLIENT;

        IF @ProcessScript =  1 
        THEN
          SET @Script = sp_sys_Translate_Log_RemoveOper(@Script);
        END IF;

        IF @Script <> ''
        THEN
          INSERT INTO #Result (Offs, CheckPointTime, Script)
          VALUES(@Offs, @BeginTime, @Script);
        END IF;
      END IF;
    END IF;
  END IF;

  // Выводим результат
  SELECT Num, Offs, CheckPointTime, Script
  FROM #Result;
END;
COMMENT ON PROCEDURE sp_sys_Translate_Log IS 'Обработать скрипты лог-файла';
Вызов процедуры, например получить с лог-файла все DDL операторы за 9 февраля 2006 года:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT Num, Offs, CheckPointTime, Script
FROM .sp_sys_Translate_Log (
  @FileName = 'D:\\BACKUP\\Test\log.sql', 
  @StartTime = '2006-02-09 00:00',
  @EndTime = '2006-02-09 23:59',
  @AllowCheckPoint =  0 ,
  @AllowConnect =  0 ,
  @AllowDML =  0 , 
  @AllowDDL =  1 
)
ORDER BY Num;
Соответствующе в параметрах передаем имя файла скрипта трансляции лог-файла и необязательные параметры с какое по какое время включить записи лога и каких типов операторы вывести в результат. Как обычно, можно использовать WHERE, LIST(), транслировать лог-файл по пользователям или таблицам. По времени конечно не самое быстрое, но скрипт размеров 900 кб обрабатывается примерно 75 сек с фильтрацией по операторам и 5 секунд без фильтрации, что в принципе не так уж плохо. Согласно стандартному ограничению long varchar, процедура позволяет обрабатывать файлы скриптов размером до 2 гб, правда это еще нужно проверить, как ASA будет обрабатывать переменную в 2 гб, имея к примеру RAM 512 мб :)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Потестите плиз процедуру разбора скрипта лог-фала, потом положим в FAQ / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]