powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / DROP TABLE IF EXISTS
25 сообщений из 25, страница 1 из 1
DROP TABLE IF EXISTS
    #38597452
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет

В fb не силен.
Задача создать файл, выполняя который таблицы будут приводится в исходное состояние. Но без DROP DATABASE.
Сделал в IBEExpert экспорт метаданных (см. файл в приложении).
Пытаюсь предварить его следующим:

Код: sql
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.
SET TERM ^ ;

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_VALIDATOR_REF'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_VALIDATOR_REF;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_VALIDATOR_REF_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_VALIDATOR_MAIN'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_VALIDATOR_MAIN;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_VALIDATOR_MAIN_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_TYPE'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_TYPE;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_PROFILE'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_PROFILE;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_PROFILE_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_NULL_VALUES'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_NULL_VALUES;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_NULL_VALUES_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_CONSTRAINTS'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_CONSTRAINTS;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_COMPOSITE_FK'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_COMPOSITE_FK;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_ORDER_ITEM'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_ORDER_ITEM;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TABLE TBL_ORDER'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_ORDER;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_ORDER_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_ITEM'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_ITEM;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_ITEM_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_CUSTOMER'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_CUSTOMER;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_CUSTOMER_ID;';
    END
END^

EXECUTE BLOCK AS BEGIN
    IF (EXISTS(SELECT 1 FROM rdb$relations WHERE rdb$relation_name = 'TBL_CATEGORY'))
    THEN BEGIN
        EXECUTE STATEMENT 'DROP TABLE TBL_CATEGORY;';
        EXECUTE STATEMENT 'DROP GENERATOR GEN_TBL_CATEGORY_ID;';
    END
END^

SET TERM ; ^



Но все равно жалуется на связи и еще всякую хрень. Вроде и в порядке их расположил таком, что если вручную (чем GUI IBExpert) в этом же порядке удалять, что все проходит гладко.
Триггеры, как я понимаю, автоматом вместе с таблицей должны удаляться. Так что остается только генераторы удалить.
Подскажите как чудо-файлик скомпоновать.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597457
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и портянка. Может, почитаешь про Recreate и Create or Alter для начала ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597459
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам, RECREATE пробовал - не работает. Если речь идет о том, чтобы просто заменить CREATE на RECREATE
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597460
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблицы связаны он дает просто RECREATE сделать
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597461
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web leafбез DROP DATABASE
Обоснуй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597463
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну типа в БД могут быть другие группы таблиц со своими префиксами, которые нельзя трогать. это не каприз, это необходимость вписаться в не мною созданную архитектуру.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597469
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web leafтипа в БД могут быть другие группы таблиц со своими префиксами, которые
нельзя трогать.
Ну так не лезь в чужую БД с чужими таблицами, создай свою собственную. И с точки зрения
производительности лучше будет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597473
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не подходит.
вобщем, буду рад практическуому совету с примером в рамках поставленной задачи
я так же не уверен что приведенный аналог DROP IF EXISTS составлен правильно
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597483
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web leafя так же не уверен что приведенный аналог DROP IF EXISTS составлен
правильно
Неправильно. Дропай безусловно, не мучайся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597486
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите лучше как правильно. "Дропай безусловно, не мучайся" не решает мою задачу.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597487
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я имею возможность работать в рамках приложения только с уже имеющимся подключением. я не могу дропнуть БД, к которой подключен. и сменить не могу.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597489
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web leafя имею возможность работать в рамках приложения только с уже имеющимся
подключением. я не могу дропнуть БД
Кто говорит про БД, чудак? Дропай свои таблицы не глядя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597498
web leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только ошибки сыпятся, если дропать несуществующую таблицу.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597502
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web leafТолько ошибки сыпятся, если дропать несуществующую таблицу.
И чо? Отправляй их в /dev/null
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597510
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web leafжалуется на связи и еще всякую хрень.Ниже приведен скрипт, аккуратно удаляющий ВСЕ( еще раз: ВСЕ! ) объекты в базе, за исключением UDF'ок. Он сделан для ФБ-3, для младших версий надо убрать блок удаления stored-функций (см курсор c_func).
Уберите из него всё лишнее (точнее - оставьте только курсор c_tabs, но добавьте в его where-условие что-то типа списка НЕ ваших таблиц, которые нельзя трогать). Кроме того, учтите: если какие-то процедуры зависят от ваших таблиц, то этот скрипт не отработает: ведь вы не можете, как я понимаю, удалять эти процедуры.
script to remove *ALL* objects in 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.
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.
set term ^;
execute block as
  declare stt varchar(512);
  declare ref_name varchar(31);
  declare tab_name varchar(31);
  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
    );
  
  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   V I E W S,    F U N C S    &    P R O C S  ##########
  open c_view;
  while (1=1) do
  begin
    fetch c_view into stt;
    if (row_count = 0) then leave;
    stt = 'create or alter view '||stt||' as select 1 id from rdb$database';
    execute statement (:stt);
  end
  close c_view;

  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;


end
^
set term ;^
commit;
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597525
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка. Поторопился я с реляцией об "аккуратности" скрипта.
Если в базе есть view V1 с колонками F01, F02, ... , на которые ссылается view V2, то скрипт обломится на команде create or alter view V1 as select 1 id from rdb$database. Может, есть и другие варианты с аналогичной зависимостью от ХП.
Тут надо будет еще покумекать, как эти самые колонки доставать.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597527
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидУберите из него всё лишнее (точнее - оставьте только курсор c_tabs, но
добавьте в его where-условие что-то типа списка НЕ ваших таблиц, которые нельзя трогать).

Зря ты так с гранатами...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597543
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ему бесполезно объяснять. Уже раз 10 говорили, не меньше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597626
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ТС, может, и новичек в ФБ, но не первый день с базами работает. Копию .fdb для предв. проверки сделать никто не запрещает.
К тому же, я дважды сказал, что скрипт грохает все объекты. Имеющий глаза да узреет.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597629
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, обезьяне тоже можно долго объяснять,
что нехорошо дергать чеку ибо ба-бах будет.
И речь идёт вовсе не о ТС, тем более, что
скрипт ты подарил всем, а не только ему.

Но ты продолжай, продолжай, молодец.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597642
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидПоправка. Поторопился я с реляцией об "аккуратности" скрипта.
Ещё есть default-значения и constraints на значения полей.
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597675
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНо ты продолжай, продолжай, молодец.я не понимаю тебя...
Чел спросил, как ему грохнуть таблицы, которые он же добавил к базу. Какие-то из этих таблиц, судя по всему, связаны по FK, и ТС получает шваброй, пытаясь нарушить очередность удаления. Я ему показал скрипт, но предупредил ЗАГЛАВНЫМИ БУКВАМИ, что скрипт опасен и его надо рихтовать под себя. В частности, сказал ему про необх-сть коррекции where-условия со списком таблиц, дабы он чужие не грохнул.

Что не так ? Может, вообще теперь про drop-команды никому не говорить ? А не то поломают чего...
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597683
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достаточно было подсказать про порядок выполнения.
Если бы появились вопросы и после этого - по ситуации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38597970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЧто не так ?
Прочитай внимательнее: ТС колупается в чужой БД к которой у него есть только коннект.
Бэкап он сделать технически не может. Поскольку ему вообще позволяют колупаться в БД, то
следует предполагать худшее: бэкапы этой базы вообще не делаются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DROP TABLE IF EXISTS
    #38598323
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как обычно, развели бодягу...

ТС, если в эксперте все проходит в указанном порядке, то в том же порядке должно проходить и в скрипте. Я бы посоветовал явный коммит после каждого блока делать. А еще лучше - после каждого DROP'а.
Ну и озвучить текст ошибок, ежели таковые возникнут.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / DROP TABLE IF EXISTS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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