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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

еще спасибо
...
Рейтинг: 0 / 0
26.01.2016, 13:45
    #39155516
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
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
26.01.2016, 13:47
    #39155520
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
Симонов Денисоно там есть. Просто в оглавлении не видно
да, склероз. Просто обычный старт - это вызовы функций 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
26.01.2016, 13:49
    #39155525
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
DBConstructor,

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



не надо так. вообще это херня какая-то. Допустим, так можно у фиплюса, но какой уровень изолированности у этой транзакции получается?
Короче, брак в коде.
...
Рейтинг: 0 / 0
26.01.2016, 13:50
    #39155529
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
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
26.01.2016, 13:54
    #39155531
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
DBConstructor,

да пофиг. не надо так писать (по крайней мере, использовать прекрасные имена write_mode_transaction, которые почти ни о чем не говорят).
...
Рейтинг: 0 / 0
26.01.2016, 13:55
    #39155532
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
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
26.01.2016, 13:56
    #39155534
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить результат выполнения оператора DDL
DBConstructor
Код: plaintext
1.
2.
concurrency\r\n\
no_rec_version\r\n\

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

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


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