powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сохранить результат выполнения оператора DDL
25 сообщений из 36, страница 1 из 2
Как сохранить результат выполнения оператора DDL
    #39155368
Oleg77777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только начал осваивать DDL, поэтому не бейте больно. Вопрос - в следующем:

Создаю хранимую процедуру, запускаю - работает. Переподключаюсь к базе данных - процедура пропадает.

Делаю DROP TABLE - таблица пропадает. Переподключаюсь - вижу, что таблица осталась в базе.

1. Как удалить таблицу навсегда?

2. Можно ли сохранить навсегда хранимую процедуру?
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155376
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg77777,

транзакцию надо подтверждать.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155384
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 26 января 2016 г. 12:00:21:

Симонов Денис> транзакцию надо подтверждать.обычно инструменты это делают сами.
в том числе и isql при соответствующем режиме.

поэтому хотелось бы узнать, чем именно пользуется ТС?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155388
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

мой ХШ подсказывает что IBE. Но только делает это не в редакторе скриптов (в котором по умолчанию AUTODLL ON), а в окошке для выполнения SQL
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155390
Oleg77777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Работаю с Embarcadero® C++Builder® XE, подключаюсь к firebird'овскому файлу. Делаю так:

авторpFIBQuery2->SQL->Text = "DROP TABLE AAA";
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155394
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg77777,

да ХШ подвёл, но лишь от части. Бегом читать про транзакции

P.S. Что то мне кажется странным что ТСу потребовался DDL в приложении. Опять изменение метаданных "налету"?
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155422
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg77777,

как тут уже сказали, транзакции надо явно завершать. У FIBPlus.pFIBTransaction по умолчанию DefaultAction (и TimeOutAction) стоит taRollback. То есть, когда закрывают БД, без явного commit/rollback активных в этот момент транзакций, транзакциям делается rollback.
(в компонентах IBX не так, там по умолчанию taCommit).
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155457
Oleg77777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Спасибо, все понял.

А то я тут пытался SQL-ем пулять, типа pFIBQuery2->SQL->Text = "SET TRANSACTION"; , а оно ругаецца, типа "Not permitted".

Кстати, интересно, почему?
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155478
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg77777,

потому что управление транзакциями в ИБ и ФБ производится с клиента. А set transaction - это хитрая команда. она либо препарсится gpre, и превращается в вызов ФБ API, либо выполняется в isql, и является такой же специфической, как и set term.

Ты тут видишь set transaction? Ага...
http://www.ibase.ru/firebird/doc/langref25rus.html

единственное управление транзакциями на сервере - это savepoints и автономные транзакции.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155482
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg77777,

www. youtube.com/watch?v=9Th_14X6Ckg

у меня на канале есть еще другие видео по транзакциям.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155483
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

оно там есть. Просто в оглавлении не видно
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155503
Oleg77777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

еще спасибо
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155516
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg77777,

Код: 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.
    static const char write_mode_transaction[] = "\
write\r\n\
concurrency\r\n\
no_rec_version\r\n\
nowait";

    static const char libname[]  = "fbclient.dll";
    static const char codepage[] = "WIN1251";
    static const char sql__select[] = "\
SELECT *\r\n\
  FROM MY_TABLE\r\n\
  WHERE NAME LIKE :TEMPLATE";

    Pfibdatabase::TpFIBDatabase     * db   = NULL;
    Pfibdatabase::TpFIBTransaction  * tran = NULL;
    Fibquery::TFIBQuery             * qry  = NULL;

    try
    {
      db = new Pfibdatabase::TpFIBDatabase(NULL);
      db->DBParams->Clear();

      db->LibraryName = libname;
      db->DBParams->BeginUpdate();
      db->DBParams->Add(AnsiString("user_name=") + User);      // const char * User
      db->DBParams->Add(AnsiString("password=") + Password);   // const char * Password
      db->DBParams->Add(AnsiString("lc_ctype=") + codepage);
      db->DBParams->EndUpdate();
      db->SQLDialect = 3;
      db->DBName = Database;                                   // const char * Database
      db->UseLoginPrompt = false;

      tran = new Pfibdatabase::TpFIBTransaction(NULL);
      tran->DefaultDatabase = db;
      tran->TRParams->Clear();
      tran->TRParams->Text = write_mode_transaction;
      db->Open();
      tran->StartTransaction();
      qry = Pfibcachequeries::GetQueryForUse(tran, sql__select);
      if (!qry->Prepared)
      {
        qry->Options << qoNoForceIsNull;
        qry->Options >> qoAutoCommit >> qoFreeHandleAfterExecute;
        qry->GoToFirstRecordOnExecute = true;
        qry->Prepare();
      }
      qry->ParamByName("TEMPLATE")->Value = "%";
      qry->ExecQuery();
      if (qry->AllRowsAffected.Selects)
        while (!qry->Eof)
        {
          .
          .
          .
          qry->Next();
        }
      qry->Close();
      Pfibcachequeries::FreeQueryForUse(qry);
      tran->Commit();
      db->Close();
    }
    catch (const Fib::EFIBError& x)
    {
      .
      .
      .
    }
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155520
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисоно там есть. Просто в оглавлении не видно
да, склероз. Просто обычный старт - это вызовы функций isc_start_transaction или isc_start_multiple, которые возвращают хэндл транзакции, с которым дальше можно работать.
А выполняя SET TRANSACTION как "DSQL" мы не можем с сервера получить хэндл этой транзакции. Якобы, надо тогда использовать isc_dsql_execute_immediate. Но вернет-ли он isc_tr_handle*, я не знаю.
Короче, гемор.

В ESQL, SET TRANSACTION должен превращаться в соотв вызовы isc_start_transaction или isc_start_multiple.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155525
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Код: plaintext
1.
      tran->TRParams->Text = write_mode_transaction;



не надо так. вообще это херня какая-то. Допустим, так можно у фиплюса, но какой уровень изолированности у этой транзакции получается?
Короче, брак в коде.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155529
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
Код: plaintext
1.
2.
3.
4.
5.
    static const char write_mode_transaction[] = "\
write\r\n\
concurrency\r\n\
no_rec_version\r\n\
nowait";
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155531
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

да пофиг. не надо так писать (по крайней мере, использовать прекрасные имена write_mode_transaction, которые почти ни о чем не говорят).
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155532
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

а зачем ты для запроса

Код: plaintext
1.
2.
3.
4.
5.
    
static const char sql__select[] = "\
  SELECT *\r\n\
  FROM MY_TABLE\r\n\
  WHERE NAME LIKE :TEMPLATE";



write транзакцию запускаешь?
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155534
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor
Код: plaintext
1.
2.
concurrency\r\n\
no_rec_version\r\n\

Сам понял, что написал ?
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155538
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

вроде, уже не первый раз (хотя может у меня склероз).
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155539
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, артефакт копипасты.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155561
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, у тебя нет склероза. Как-то уже копипастил похожим образом - менял read_committed на concurrency, а rec_version/no_rec_version забывал удалять. Понятно, что указание no_rec_version не имеет смысла при уровне изолированности snapshot, но и ошибкой, влияющей на работу программы, это не назовешь.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155572
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм... а разве в 2.5 не делали чтобы сервер ругался на несовместимые параметры транзакции?
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155576
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, а какая разница? Считаю, что во многих случаях, наличие двух транзакций (одна на чтение, другая на запись), да еще и с разными уровнями изолированности - это devil evil. Особенно, если в рамках одной транзакции приходится не только изменять, но и читать измененные записи. В таком варианте, транзакция на чтение - сущность без надобности.
...
Рейтинг: 0 / 0
Как сохранить результат выполнения оператора DDL
    #39155581
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, ИМХО, здесь нет несовместимости. Всего лишь бессмысленное указание одного из параметров транзакции, не вступающего в конфликт с уровнем изолированности.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сохранить результат выполнения оператора DDL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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