powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выполнить скрипт
25 сообщений из 119, страница 3 из 5
Выполнить скрипт
    #38996853
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

я думаю тоже не помогут. Потому что если DDL ты выполнил в автономке, а DML в основной транзакции, то кеш метаданных загружен на момент старта основной транзакции (или на момент старта блока), где таблички ещё нет. Поэтому я и говорю через ES конечно можно выполнить DDL, но тогда уж только его.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996854
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов Денис
Код: sql
1.
2.
3.
4.
5.
6.
execute block as
begin
  create table a(b int);
  create domain d_int int;
  insert into a(b) values(1);
end


Это же можно написать без execute block, просто в одной транзакции с клиента. Результат полагаю должен быть одинаковым. И там и там человек меняющий DDL таблицы и меняющий её данные обречён на неудачу. А кому нужен только DDL или только DML, тем придётся:
- в случае с DML: написать один execute block или слать по одному запросу.
- в случае с DDL: написать один execute block c execute statements или слать по одному запросу.
Так что ничто не запрещено. Просто парсер в excute block не понимает DDL без execute statement. Всё.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996861
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-,

не просто не понимает. Его туда умышлено не вводили из-за глюков которые однозначно будут.
С клиента тебе тоже придётся сделать 1 или более DDL операторов затем подтвердить транзакцию, а только потом делать DML уже в другой транзакции.
Просто в редакторе скриптов IBE или в ISQL для DDL по умолчанию стартуется отдельная транзакция которая по завершении оператора тут же завершается.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996926
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов ДенисС клиента тебе тоже придётся сделать 1 или более DDL операторов затем подтвердить транзакцию, а только потом делать DML уже в другой транзакции.
Ничто не мешает создать табличку A, и в той же транзакции сделать запись в табличку B, которая от A никак не зависит.
Но опять же - это не то что интересно.
Интересно пачкой выполнять именно DDL. Интерес в простоте работы со скриптами.
Допустим скрипт лежит в файле. Как его сейчас применить например из кода Delphi? Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии. Это сейчас.
А как это делается в одну строчку, если бы в execute block не запретили DDL?
вот так, например:
Код: pascal
1.
Transaction.ExecuteSql('EXECUTE BLOCK AS'#13#10'BEGIN'#13#10 + LoadFile(ScriptFile) + #13#10'END')

Всё.
Хотя если там в скрипте где-то есть "commit;", то кода получится лишь немногим больше, и опять же без парсенья SQL.

Так что кто-то своим запретом малину всем портит :) Понятно что из благородных целей - с целью заботы о гражданах :)
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996949
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Допустим скрипт лежит в файле. Как его сейчас применить например из кода Delphi? Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии.

Выдыхай...
Код: pascal
1.
2.
  SQLScript.LoadFromFile(....);
  SQLScript.Execute;
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996955
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-,

блин я такой парсер даже на PHP писал. Ничего там сложного нет. Ибо парсить команды до основания не надо. Достаточно найти разделить ну и чуть посложней повозиться с SET TERM, а также с игнором разделителей в строках и комментах. Причём это мало зависит от версии сервера.

Вот сделать это без SET TERM чуть сложнее. Там как раз зависимость от версии может проявится. Ибо в FB3 есть CREATE/ALTER PACKAGE/FUNCTION которых в 2.5 не было. Но тоже можно, в IBE ведь сделали.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996958
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии.
никакой парсер не нужен. Достаточно из потока текста выколупывать конструкции между разделителем N, который по умолчанию ";", и меняется по set term. Никаких других конструкций кроме set term распознавать не надо, вообще.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996959
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

строки и комменты ещё надо, чтобы игнорировать разделители в них
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38996966
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvникакой парсер не нужен. Достаточно из потока текста выколупывать конструкции между разделителем N, который по умолчанию ";", и меняется по set term. Никаких других конструкций кроме set term распознавать не надо, вообще.

Кроме SET TERM есть еще кучка SET'ов, а также CONNECT/CREATE DATABASE.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997003
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
DarkMaster-Допустим скрипт лежит в файле. Как его сейчас применить например из кода Delphi? Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии.

Выдыхай...
Код: pascal
1.
2.
  SQLScript.LoadFromFile(....);
  SQLScript.Execute;


SQLScript - это что?
Вот такой скрипт, сгенерённый IBExpert-ом он поймёт?

Код: 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.
/******************************************************************************/
/***                               Generators                               ***/
/******************************************************************************/

CREATE GENERATOR GEN_T_ID;
SET GENERATOR GEN_T_ID TO 0;

/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/

SET TERM ^ ;

CREATE PROCEDURE P
RETURNS (
    ID INTEGER,
    S VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^

SET TERM ; ^

/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/

CREATE TABLE T (
    ID  INTEGER NOT NULL,
    S   VARCHAR(10)
);

/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/

SET TERM ^ ;

/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/

/* Trigger: T_BI */
CREATE TRIGGER T_BI FOR T
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_t_id,1);
end
^

SET TERM ; ^

/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/

SET TERM ^ ;

ALTER PROCEDURE P
RETURNS (
    ID INTEGER,
    S VARCHAR(10))
AS
begin
  for select id, s from t into :id, :s do
    suspend;
end^

SET TERM ; ^


А тот же самый, но без SET TERM-ов он распарсит?
Код: 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.
/******************************************************************************/
/***                               Generators                               ***/
/******************************************************************************/

CREATE GENERATOR GEN_T_ID;
SET GENERATOR GEN_T_ID TO 0;

/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/

CREATE PROCEDURE P
RETURNS (
    ID INTEGER,
    S VARCHAR(10))
AS
BEGIN
  SUSPEND;
END;

/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/

CREATE TABLE T (
    ID  INTEGER NOT NULL,
    S   VARCHAR(10)
);

/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);

/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/

/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/

/* Trigger: T_BI */
CREATE TRIGGER T_BI FOR T
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_t_id,1);
end;

/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/

ALTER PROCEDURE P
RETURNS (
    ID INTEGER,
    S VARCHAR(10))
AS
begin
  for select id, s from t into :id, :s do
    suspend;
end;

А если сюда добавить конструкций из FB 4.0?
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997012
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-А если сюда добавить конструкций из FB 4.0?

Где взял?
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997013
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
балабол
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997024
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-SQLScript - это что?
Вот такой скрипт, сгенерённый IBExpert-ом он поймёт?
А тот же самый, но без SET TERM-ов он распарсит?
А если сюда добавить конструкций из FB 4.0?

- TIB_Script от ИБО - внутри есть парсер - его хватает за глаза (и парсер не особо навороченный, кстати)
- Поймет
- будет FB 4.0 - поймет и его ;)

[sarcasm on]

P.S. Вот правда если скрипт разбавить конструкциями от Oracle вперемешку с MSSQL - то да, облом выйдет ;(
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997025
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов Денис-А если сюда добавить конструкций из FB 4.0?

Где взял?
Зачем ты меня троллишь таким вопросом? 4.0 если выйдет, то там наверняка будут новые языковые конструкции.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997054
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-,

блин что там сложного то?

Есть несколько типов команд:
1. SET TERM переключает терминатор (работает с незапамятных времён)
2. операторы в которых нет операторных скобок BEGIN...END. Таких большинство
3. операторы с операторными скобками CREATE/ALTER PROCEDURE/FUNCTION/PACKAGE/TRIGGER + EXECUTE BLOCK
4. спец команды, не являющиеся операторами CONNECT, SET DIALECT ... их надо обрабатывать отдельно

Так вот весьма высока вероятность что в новой версии появятся команды из группы 2. Для них вообще ничего переделывать не придётся.

Очень мала что из группы 3. Если работаем через SET TERM то и для них переделывать не придётся.

Группы 1 и 4 не являются частью операторов FB, а являются расширениями конкретного клиента исполняющего скрипт. Поэтому на них пофиг. Можешь им сам синтаксис придумать любой.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997066
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
DarkMaster - TIB_Script от ИБО - внутри есть парсер - его хватает за глаза (и парсер не особо навороченный, кстати)
Ну тогда дай ссылку, чтобы мы все смогли осчастливиться :)
Хотя смотрю что продукт платный, и разработчик является членом Firebird Foundation и все дела.

Так что можно обойти отсутствие запрещённого функционала у FB, просто покупкой этого функционала у члена Firebird Foundation.
Что-то меня понесло не туда... Или наоборот туда.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997068
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов Денисблин что там сложного то?

Есть несколько типов команд:
1. SET TERM переключает терминатор (работает с незапамятных времён)
C SET TERM вообще никаких проблем нет. С ним всё просто. Но он не часть языка.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997075
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Так что можно обойти отсутствие запрещённого функционала у FB, просто покупкой этого функционала у члена Firebird Foundation.


Дык тут все просто - качаешь исходники FB с запрещенным функционалом, выдираешь оттуда запрещенный парсер, адаптируешь под свои нужды, получаешь НЕзапрещенный парсер, раздаешь всем и каждому - профит.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997099
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис4. спец команды, не являющиеся операторами CONNECT, SET DIALECT ... их надо обрабатывать отдельно
дискуссия начинает уходить в космос, потому что исходно "минус" сказал про "как выполнить скрипт обновления своей БД из Дельфи".
Так что база своя, connect не нужен, set dialect не нужен, и никакой другой set кроме term не нужен.

-C SET TERM вообще никаких проблем нет. С ним всё просто. Но он не часть языка.
правильно. Это конструкция ISQL. А ISQL что, парсит конструкции DML/DDL Firebird? Хрен там!
Вы просто API не знаете. Достаточно "выкусить" оператор из разделителей, вызвать prepare, и получить, что это - DML (вплоть до select/insert/update/delete...) или DDL.

Прекратите валять дурака. для парсинга скрипта никаких специфических конструкций языка знать не нужно.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997110
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to all

какой-то апофеоз. Firebird не умеет выполнять скрипты. Он умеет выполнять единичные операторы. Firebird так устроен.
isql - может выполнять скрипты, разделяя скрипт на отдельные операторы. isql не умеет выполнять DDL/DML, потому что из выполняет Firebird. Аминь. ISQL не является Firebird-ом, и наоборот.

Пусть еще кто-нибудь скажет, что ISQL от Firebird 1.5 не умеет выполнять скрипты для Firebird 3.0 ...
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997113
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТак что база своя, connect не нужен, set dialect не нужен, и никакой другой set
кроме term не нужен.
set term тоже нафиг не нужен. У меня разделитель, например, гвоздиком прибит в значение "^".

kdvдля парсинга скрипта никаких специфических конструкций языка знать не нужно.
Как минимум две конструкции знать нужно: delimited литералы и комментарии. Остальное
действительно пофиг. "Это я тебе, голуба, говорю как краевед." (с) ЛФ
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997125
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
-
Код: sql
1.
2.
3.
4.
5.
execute block as
begin
  create table a(b int);
  create domain d_int int;
end


Почему нельзя одним блоком пульнуть создание БД, без всяких скриптов?
Оно вам не нужно. Вам нужно выполнять стейтменты по одному, или воспользоваться чужим кодом который парсит скрипт и дальше выполняет стэйтменты по одному. Вот как вам нужно. Я лучше знаю.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997134
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-,

если оно будет выполняться с глюками, то действительно не нужно. Я уж лучше через isql выполню скрипт. Да, да в виде тех отдельных статментов с разбитых по разделителю.
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997137
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovset term тоже нафиг не нужен. У меня разделитель, например, гвоздиком прибит в значение "^".


Если гвоздиком прибить что-нибудь вроде "===!!!-----@@THIS_IS_TERMINATOR@@-----!!!===", то и литералы с комментариями пофигу будут :)
...
Рейтинг: 0 / 0
Выполнить скрипт
    #38997138
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
kdvкакой-то апофеоз. Firebird не умеет выполнять скрипты. Он умеет выполнять единичные операторы. Firebird так устроен.
Вот. А еще Firebird умеет выполнять execute block. Но не умеет выполнять в нём DDL. Верней умеет, и корректно, но только через execute statement.
Собственно это ядро беседы которую я начал и которая мне на самом деле интересна и полезна. И даже код на Delphi привёл, как было бы просто если бы execute block не ленился и выполнял DDL.
Но собеседники цепляются за частности и уводят действительно в космос.
...
Рейтинг: 0 / 0
25 сообщений из 119, страница 3 из 5
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выполнить скрипт
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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