powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
7 сообщений из 7, страница 1 из 1
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38750764
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Терзает меня смутное сомнение, но таки озвучу. Ибо надо что-то делать :-)

Кажись, появление '<t> in use' даже после выполнения команды Reconnect в IBE каким-то боком связано с ДРУГИМ коннектом к базе, который выполнялся (и точно ЗАВЕРШИЛСЯ) из isql.

Вот был у мну запущен ИБЭ, запускал я внём всякое разное (и скрипты, и стейтменты).
Но в какой-то момент понадобилось получить explained-план, для чего был создан файлик
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
set explain on;
set planonly;
set term ^;
execute block as
  declare k int;
  declare a_doc_id int;
  declare a_old_optype int;
begin
select 1 from <много-чего-всякого> into k;
end^
set term ;^
set planonly;
- и я запускал его несколько раз в isql'e (меняя содержимое файла для получения нужного мну плана).

Дальше я забыл про этот isql, решил запустить в ИБЭ "полный пересбор" базы - он, ес-сно, выругался (сабжем).
Вспомнил об isql'e, шлёпнул в нём Упр-Це (не сработало, т.к. в линухе; вышел в итоге из этого шыйда по Упр-Де).

Вроде бы всё - можно перезапускать скрипт в ИБЭ ? Хрен, опять лезет эта же ошибка ('table <T> in use').
Делаю в ИБЭ reconnect - не помогает.
Запукаю шыйд, ввожу: "кто еще тут ?!"
Код: 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.
$ /opt/fb30trnk/bin/isql localhost/3333:oltp30b -n
Database:  localhost/3333:oltp30b
SQL> set list on; commit; select * from mon$attachments where mon$attachment_id is distinct from current_connection;

MON$ATTACHMENT_ID               2014
MON$SERVER_PID                  28958
MON$STATE                       0
MON$ATTACHMENT_NAME             /var/db/fb30/oltp30b.fdb
MON$USER                        Garbage Collector
MON$ROLE                        <null>
MON$REMOTE_PROTOCOL             <null>
MON$REMOTE_ADDRESS              <null>
MON$REMOTE_PID                  <null>
MON$CHARACTER_SET_ID            0
MON$TIMESTAMP                   2014-09-18 07:58:52.4400
MON$GARBAGE_COLLECTION          1
MON$REMOTE_PROCESS              <null>
MON$STAT_ID                     5
MON$CLIENT_VERSION              <null>
MON$REMOTE_VERSION              <null>
MON$REMOTE_HOST                 <null>
MON$REMOTE_OS_USER              <null>
MON$AUTH_METHOD                 <null>
MON$SYSTEM_FLAG                 1

MON$ATTACHMENT_ID               2042
MON$SERVER_PID                  28958
MON$STATE                       0
MON$ATTACHMENT_NAME             oltp30b
MON$USER                        SYSDBA
MON$ROLE                        NONE
MON$REMOTE_PROTOCOL             TCPv4
MON$REMOTE_ADDRESS              192.168.43.96
MON$REMOTE_PID                  1852
MON$CHARACTER_SET_ID            52
MON$TIMESTAMP                   2014-09-18 16:56:03.0390
MON$GARBAGE_COLLECTION          1
MON$REMOTE_PROCESS              C:\MIX\IBE\IBExpert.exe
MON$STAT_ID                     7
MON$CLIENT_VERSION              <null>
MON$REMOTE_VERSION              P12
MON$REMOTE_HOST                 csprog
MON$REMOTE_OS_USER              ZOTOV
MON$AUTH_METHOD                 Legacy_Auth
MON$SYSTEM_FLAG                 0


SQL> quit;
- вижу только ИБЭ (правда, куда-то подевался Cache Writer, ну да ладно).
Запускаю трейс, делаю снова переконнект в ИБЭ.
В трейсе получаю:
Код: 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.
Trace session ID 1 started
2014-09-18T16:51:20.1670 (28958:0x7fa597ccdcc8) TRACE_INIT
        SESSION_1


2014-09-18T16:51:20.1670 (28958:0x7fa597ccdcc8) START_TRANSACTION
        oltp30b (ATT_2037, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257646, CONCURRENCY | WAIT | READ_WRITE)

2014-09-18T16:51:20.1680 (28958:0x7fa597ccdcc8) EXECUTE_STATEMENT_FINISH
        oltp30b (ATT_2037, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257646, CONCURRENCY | WAIT | READ_WRITE)

Statement 64877:
-------------------------------------------------------------------------------
select RDB$RELATION_NAME from RDB$RELATIONS
where (RDB$RELATION_NAME = 'MON$ATTACHMENTS') and
(RDB$VIEW_BLR is NULL)

1 records fetched
      0 ms, 4 fetch(es)

2014-09-18T16:51:20.1690 (28958:0x7fa597ccdcc8) COMMIT_TRANSACTION
        oltp30b (ATT_2037, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257646, CONCURRENCY | WAIT | READ_WRITE)
      0 ms, 1 write(s), 1 fetch(es), 1 mark(s)

 2014-09-18T16:51:21.0110 (28958:0x7fa597ccdcc8) DETACH_DATABASE
        oltp30b (ATT_2037, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852

2014-09-18T16:51:21.0120 (28958:0x7fa597ccdcc8) TRACE_FINI
        SESSION_1

 
2014-09-18T16:51:21.0540 (28958:0x7fa597ccdcc8) TRACE_INIT
        SESSION_1


2014-09-18T16:51:21.0540 (28958:0x7fa597ccdcc8) ATTACH_DATABASE
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852

2014-09-18T16:51:21.0570 (28958:0x7fa597ccdcc8) START_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257647, CONCURRENCY | WAIT | READ_WRITE)

2014-09-18T16:51:21.0940 (28958:0x7fa597ccdcc8) COMMIT_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257647, CONCURRENCY | WAIT | READ_WRITE)
      0 ms

2014-09-18T16:51:21.0960 (28958:0x7fa597ccdcc8) START_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257648, CONCURRENCY | WAIT | READ_WRITE)

2014-09-18T16:51:21.0990 (28958:0x7fa597ccdcc8) EXECUTE_STATEMENT_FINISH
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257648, CONCURRENCY | WAIT | READ_WRITE)

Statement 64927:
-------------------------------------------------------------------------------
SELECT D.RDB$CHARACTER_SET_NAME, C.RDB$DEFAULT_COLLATE_NAME
FROM RDB$DATABASE D
LEFT JOIN RDB$CHARACTER_SETS C ON (D.RDB$CHARACTER_SET_NAME = C.RDB$CHARACTER_SET_NAME)

1 records fetched
      0 ms, 9 fetch(es)

2014-09-18T16:51:21.0990 (28958:0x7fa597ccdcc8) COMMIT_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257648, CONCURRENCY | WAIT | READ_WRITE)
      0 ms, 1 write(s), 1 fetch(es), 1 mark(s)

2014-09-18T16:51:21.1000 (28958:0x7fa597ccdcc8) START_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257649, CONCURRENCY | WAIT | READ_WRITE)

2014-09-18T16:51:21.1010 (28958:0x7fa597ccdcc8) EXECUTE_STATEMENT_FINISH
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257649, CONCURRENCY | WAIT | READ_WRITE)

Statement 64928:
-------------------------------------------------------------------------------
SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS
WHERE (RDB$RELATION_NAME = 'RDB$FIELDS') and (RDB$FIELD_NAME = 'RDB$FIELD_PRECISION')

1 records fetched
      0 ms, 5 fetch(es)

2014-09-18T16:51:21.1010 (28958:0x7fa597ccdcc8) COMMIT_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257649, CONCURRENCY | WAIT | READ_WRITE)
      0 ms, 1 write(s), 1 fetch(es), 1 mark(s)

2014-09-18T16:51:21.1020 (28958:0x7fa597ccdcc8) START_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257650, CONCURRENCY | WAIT | READ_WRITE)

2014-09-18T16:51:21.1040 (28958:0x7fa597ccdcc8) EXECUTE_STATEMENT_FINISH
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257650, CONCURRENCY | WAIT | READ_WRITE)

Statement 64929:
-------------------------------------------------------------------------------
select RDB$RELATION_NAME from RDB$RELATIONS
where (RDB$RELATION_NAME = 'IBE$VERSION_HISTORY') and
(RDB$VIEW_BLR is NULL)

0 records fetched
      0 ms, 2 fetch(es)

2014-09-18T16:51:21.1040 (28958:0x7fa597ccdcc8) COMMIT_TRANSACTION
        oltp30b (ATT_2039, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257650, CONCURRENCY | WAIT | READ_WRITE)
      0 ms, 1 write(s), 1 fetch(es), 1 mark(s)
т.е. DETACH_DATABASE - был !

Делаю полный дисконнект, в трейсе получаю стартовый фрагмент от предыдущего куска:
Код: 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.
Trace session ID 3 started
2014-09-18T16:55:26.2350 (28958:0x7fa597ccdcc8) TRACE_INIT
        SESSION_3


2014-09-18T16:55:26.2350 (28958:0x7fa597ccdcc8) START_TRANSACTION
        oltp30b (ATT_2041, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257670, CONCURRENCY | WAIT | READ_WRITE)

2014-09-18T16:55:26.2370 (28958:0x7fa597ccdcc8) EXECUTE_STATEMENT_FINISH
        oltp30b (ATT_2041, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257670, CONCURRENCY | WAIT | READ_WRITE)

Statement 69489:
-------------------------------------------------------------------------------
select RDB$RELATION_NAME from RDB$RELATIONS
where (RDB$RELATION_NAME = 'MON$ATTACHMENTS') and
(RDB$VIEW_BLR is NULL)

1 records fetched
      0 ms, 4 fetch(es)

2014-09-18T16:55:26.2370 (28958:0x7fa597ccdcc8) COMMIT_TRANSACTION
        oltp30b (ATT_2041, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852
                (TRA_257670, CONCURRENCY | WAIT | READ_WRITE)
      0 ms, 1 write(s), 1 fetch(es), 1 mark(s)

2014-09-18T16:55:27.4890 (28958:0x7fa597ccdcc8) DETACH_DATABASE
        oltp30b (ATT_2041, SYSDBA:NONE, WIN1251, TCPv4:192.168.43.96)
        C:\MIX\IBE\IBExpert.exe:1852

2014-09-18T16:55:27.4890 (28958:0x7fa597ccdcc8) TRACE_FINI
        SESSION_3
Как вообще такое может быть, что после DETACH_DATABASE какой-то из объектов всё равно держится 'in use' ?
...
Рейтинг: 0 / 0
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38750767
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидпонадобилось получить explained-план, для чего был создан файлик ...
и я запускал его несколько раз в isql'ePS. Забыл добавить: isql'ем выполнял коннект по ТСР:
Код: plaintext
1.
2.
$ /opt/fb30trnk/bin/isql localhost/3333:oltp30b -n
Database:  localhost/3333:oltp30b
SQL> in crs;

(впрочем, по локальному протоколу при открытых других ТСР-коннектах в линухе и не получится).
...
Рейтинг: 0 / 0
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38750811
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидвижу только ИБЭ (правда, куда-то подевался Cache Writer, ну да ладно).
А Garbage Collector? Или ты уверен что он не способен вызывать "object in use"? :)
Например он коллектит записи в табличке T, а ты ему "drop T" делаешь...
...
Рейтинг: 0 / 0
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38750819
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТаблоидвижу только ИБЭ (правда, куда-то подевался Cache Writer, ну да ладно).
А Garbage Collector? Или ты уверен что он не способен вызывать "object in use"? :)
Например он коллектит записи в табличке T, а ты ему "drop T" делаешь...Ну так скока он будет их коллектить-то ? К тому же, ФБ вещал про таблицу, которая не менялась вообще в шыйде (и в нём я вообще ничего не менял, в отличие от ИБЭ).
...
Рейтинг: 0 / 0
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38750828
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидТерзает меня смутное сомнение, но таки озвучу. Ибо надо что-то делать :-)Воспроизводимый пример конечно же есть ?
Нету ? Ну так я знаю - кто будет что-то делать :)
...
Рейтинг: 0 / 0
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38750834
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladТаблоидТерзает меня смутное сомнение, но таки озвучу. Ибо надо что-то делать :-)Воспроизводимый пример конечно же есть ? Пока что есть воспроизводимое подозрение
Ибо за прошедшие полгода я натыкался на эту загадку уже раз 10-15, если не больше. Но в пылу борьбы просто делал полный дисконнект к ЧМ. Но вот стало надоедать уже как бэ... :-)
hvladНету ? Ну так я знаю - кто будет что-то делать :)ггг... тебя не обманешь, чё... :-)
...
Рейтинг: 0 / 0
table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
    #38752296
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladВоспроизводимый пример конечно же есть ?еще не воспроизводимый пример, но gdb + fb_lock_print для данной ситуации. Опять единственный аттач (ИБЭ), опять не могу в нём выполнить скрипт при указании в IBE "Reconnect". Знаю наперёд, что поможет только полный дисконнект.
Разумеется, проверил в isql'е (после получения шваброй 'obj in use'), что действительно к базе сейчас только 1 user-коннект:
Код: 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.
SQL> set list on; select * from mon$attachments where mon$attachment_id<>current_connection;

MON$ATTACHMENT_ID               612
MON$SERVER_PID                  28958
MON$STATE                       0
MON$ATTACHMENT_NAME             /var/db/fb30/oltp30b.fdb
MON$USER                        Cache Writer
MON$ROLE                        <null>
MON$REMOTE_PROTOCOL             <null>
MON$REMOTE_ADDRESS              <null>
MON$REMOTE_PID                  <null>
MON$CHARACTER_SET_ID            0
MON$TIMESTAMP                   2014-09-19 23:13:08.3180
MON$GARBAGE_COLLECTION          1
MON$REMOTE_PROCESS              <null>
MON$STAT_ID                     6
MON$CLIENT_VERSION              <null>
MON$REMOTE_VERSION              <null>
MON$REMOTE_HOST                 <null>
MON$REMOTE_OS_USER              <null>
MON$AUTH_METHOD                 <null>
MON$SYSTEM_FLAG                 1

MON$ATTACHMENT_ID               613
MON$SERVER_PID                  28958
MON$STATE                       0
MON$ATTACHMENT_NAME             /var/db/fb30/oltp30b.fdb
MON$USER                        Garbage Collector
MON$ROLE                        <null>
MON$REMOTE_PROTOCOL             <null>
MON$REMOTE_ADDRESS              <null>
MON$REMOTE_PID                  <null>
MON$CHARACTER_SET_ID            0
MON$TIMESTAMP                   2014-09-19 23:13:08.3190
MON$GARBAGE_COLLECTION          1
MON$REMOTE_PROCESS              <null>
MON$STAT_ID                     7
MON$CLIENT_VERSION              <null>
MON$REMOTE_VERSION              <null>
MON$REMOTE_HOST                 <null>
MON$REMOTE_OS_USER              <null>
MON$AUTH_METHOD                 <null>
MON$SYSTEM_FLAG                 1

MON$ATTACHMENT_ID               643
MON$SERVER_PID                  28958
MON$STATE                       0
MON$ATTACHMENT_NAME             oltp30b
MON$USER                        SYSDBA
MON$ROLE                        NONE
MON$REMOTE_PROTOCOL             TCPv4
MON$REMOTE_ADDRESS              192.168.43.96
MON$REMOTE_PID                  1852
MON$CHARACTER_SET_ID            52
MON$TIMESTAMP                   2014-09-20 11:21:05.9050
MON$GARBAGE_COLLECTION          1
MON$REMOTE_PROCESS              C:\MIX\IBE\IBExpert.exe
MON$STAT_ID                     9
MON$CLIENT_VERSION              <null>
MON$REMOTE_VERSION              P12
MON$REMOTE_HOST                 csprog
MON$REMOTE_OS_USER              ZOTOV
MON$AUTH_METHOD                 Legacy_Auth
MON$SYSTEM_FLAG                 0


SQL> quit;


В аттаче, помимо сника fb_lock_print -c -a и бактрассы, еще два лога трейса: один для команды IBE 'reconnect', второй - для вот этого скрипта:
Код: 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.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
recreate exception ex_not_suitable_fb_version 'This script can`t run on this FB version';
commit;
set bail on;
set autoddl off;
commit;
set term ^;
execute block as
begin
  if ( rdb$get_context('SYSTEM','ENGINE_VERSION') NOT starting with '3.' ) then
    exception ex_not_suitable_fb_version;
end
^
set term ;^
commit;

-- ############################################################################
-- #########################    C L E A N I N G   #############################
-- ############################################################################

-- 1. Separate EB for devastation views with preserving their column names
-- (otherwise can get ISC error 336397288. invalid request BLR at offset 2. context not defined (BLR error).)
-- see letter to dimitr, 29.03.2014 22:43
set term ^;
execute block as
  declare stt varchar(8190);
  declare ref_name varchar(31);
  declare tab_name varchar(31);
  declare view_ddl varchar(8190);
  declare c_view cursor for (
    with
    a as(
      select rf.rdb$relation_name view_name, rf.rdb$field_position fld_pos, rf.rdb$field_name fld_name
      from rdb$relation_fields rf
      join rdb$relations rr
      on rf.rdb$relation_name=rr.rdb$relation_name
      where
      coalesce(rf.rdb$system_flag,0)=0 and coalesce(rr.rdb$system_flag,0)=0 and rr.rdb$relation_type=1
    )
    select view_name,
           cast( 'create or alter view '||trim(view_name)||' as select '
                 ||list( fld_pos||' '||trim(lower(fld_name)) )
                 ||' from rdb$database' as varchar(8190)
               ) view_ddl
    from a
    group by view_name
  );
begin
  open c_view;
  while (1=1) do
  begin
    fetch c_view into tab_name, stt;
    if (row_count = 0) then leave;
    execute statement (:stt);
  end
  close c_view;
end^
set term ;^
commit;

-------------------------------------------------------------------------------

-- 2. Removing all objects from database is they exists:
set term ^;
execute block as
  declare stt varchar(512);
  declare ref_name varchar(31);
  declare tab_name varchar(31);
  --declare view_ddl varchar(8190);

  declare c_trig cursor for
    (select rt.rdb$trigger_name
       from rdb$triggers rt
       where coalesce(rt.rdb$system_flag,0)=0
    );

  declare c_view cursor for
    (select rr.rdb$relation_name
       from rdb$relations rr
      where rr.rdb$relation_type=1 and coalesce(rr.rdb$system_flag,0)=0
    );
  declare c_func cursor for
    (select rf.rdb$function_name
       from rdb$functions rf
      where coalesce(rf.rdb$system_flag,0)=0
    );
  declare c_proc cursor for
    (select rp.rdb$procedure_name
       from rdb$procedures rp
       where coalesce(rp.rdb$system_flag,0)=0
    );
  
  declare c_excp cursor for
    (select re.rdb$exception_name
       from rdb$exceptions re
       where coalesce(re.rdb$system_flag,0)=0
    );
  
  declare c_fk cursor for
    (select rc.rdb$constraint_name, rc.rdb$relation_name
       from rdb$relation_constraints rc
      where rc.rdb$constraint_type ='FOREIGN KEY'
    );
  
  declare c_tabs cursor for -- fixed tables and GTTs
    (select rr.rdb$relation_name
       from rdb$relations rr
      where rr.rdb$relation_type in(0,4,5) and coalesce(rr.rdb$system_flag,0)=0
      -- todo: what about external tables ?
    );
  
  declare c_doms cursor for -- domains
    (select rf.rdb$field_name
      from rdb$fields rf
     where coalesce(rf.rdb$system_flag,0)=0
           and rf.rdb$field_name not starting with 'RDB$'
    );
  
  declare c_coll cursor for -- collations
    (select rc.rdb$collation_name
       from rdb$collations rc
      where coalesce(rc.rdb$system_flag,0)=0
    );
  declare c_gens cursor for -- generators
    (select rg.rdb$generator_name
      from rdb$generators rg
     where coalesce(rg.rdb$system_flag,0)=0
    );
  declare c_role cursor for -- roles
    (select rr.rdb$role_name
      from rdb$roles rr
     where coalesce(rr.rdb$system_flag,0)=0
    );

begin

  -- ################   D R O P   T R I G G E R S  ################
  open c_trig;
  while (1=1) do
  begin
    fetch c_trig into stt;
    if (row_count = 0) then leave;
    stt = 'drop trigger '||stt;
    execute statement (:stt);
  end
  close c_trig;

  -- #########    Z A P   F U N C S    &    P R O C S  ##########
  -- not needed views has been already "zapped", see above separate EB

  open c_func;
  while (1=1) do
  begin
    fetch c_func into stt;
    if (row_count = 0) then leave;
    stt = 'create or alter function '||stt||' returns int as begin return 1; end';
    execute statement (:stt);
  end
  close c_func;

  open c_proc;
  while (1=1) do
  begin
    fetch c_proc into stt;
    if (row_count = 0) then leave;
    stt = 'create or alter procedure '||stt||' as begin end';
    execute statement (:stt);
  end
  close c_proc;

  -- ######################   D R O P    O B J E C T S   ######################

  open c_view;----------------------  d r o p   v i e w s  ---------------------
  while (1=1) do
  begin
    fetch c_view into stt;
    if (row_count = 0) then leave;
    stt = 'drop view '||stt;
    execute statement (:stt);
  end
  close c_view;

  open c_func; --------------------  d r o p   f u c t i o n s  ----------------
  while (1=1) do
  begin
    fetch c_func into stt;
    if (row_count = 0) then leave;
    stt = 'drop function '||stt;
    execute statement (:stt);
  end
  close c_func;

  open c_proc; -----------------  d r o p   p r o c e d u r e s  ---------------
  while (1=1) do
  begin
    fetch c_proc into stt;
    if (row_count = 0) then leave;
    stt = 'drop procedure '||stt;
    execute statement (:stt);
  end
  close c_proc;

  open c_excp; -----------------  d r o p   e x c e p t i o n s  ---------------
  while (1=1) do
  begin
    fetch c_excp into stt;
    if (row_count = 0) then leave;
    stt = 'drop exception '||stt;
    execute statement (:stt);
  end
  close c_excp;

  open c_fk; -----------  d r o p    r e f.   c o n s t r a i n t s ------------
  while (1=1) do
  begin
    fetch c_fk into ref_name, tab_name;
    if (row_count = 0) then leave;
    stt = 'alter table '||tab_name||' drop constraint '||ref_name;
    execute statement (:stt);
  end
  close c_fk;

  open c_tabs; -----------  d r o p    t a b l e s  ------------
  while (1=1) do
  begin
    fetch c_tabs into stt;
    if (row_count = 0) then leave;
    stt = 'drop table '||stt;
    execute statement (:stt);
  end
  close c_tabs;

  open c_doms; -------------------  d r o p    d o m a i n s -------------------
  while (1=1) do
  begin
    fetch c_doms into stt;
    if (row_count = 0) then leave;
    stt = 'drop domain '||stt;
    execute statement (:stt);
  end
  close c_doms;

  open c_coll; ---------------  d r o p    c o l l a t i o n s -----------------
  while (1=1) do
  begin
    fetch c_coll into stt;
    if (row_count = 0) then leave;
    stt = 'drop collation '||stt;
    execute statement (:stt);
  end
  close c_coll;

  open c_gens; -----------------  d r o p    s e q u e n c e s -----------------
  while (1=1) do
  begin
    fetch c_gens into stt;
    if (row_count = 0) then leave;
    stt = 'drop sequence '||stt;
    execute statement (:stt);
  end
  close c_gens;

  open c_role; --------------------  d r o p    r o l e s ----------------------
  while (1=1) do
  begin
    fetch c_role into stt;
    if (row_count = 0) then leave;
    stt = 'drop role '||stt;
    execute statement (:stt);
  end
  close c_role;

end
^
set term ;^
commit;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / table <T> in use при вып-нии скрипта после reconnect'a в IBE единственного аттача
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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