Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all 1677 articles
Browse latest View live

Вопрос GLOBAL TEMPORARY TABLE

$
0
0
Добрый день!

Вопрос такой есть ли возможность создать временную табличку
заполнить её данными в одном FibDataset
и потом в другом получить их SELECT'ом

пробовал создавать
и
ON COMMIT DELETE ROWS

и
ON COMMIT PRESERVE ROWS

как следует из описания, я должен из другой FibDataset видеть эти данные, но почемуто не вижу.
Оба FibDataset присоединены к одному FibDataBase.
Следовательно пока открыт конекшен я должен бы получить эти данные, но не получаю.
Помогите разобраться.

gfix.exe -shut full -force ...

$
0
0
Добрый день! программном вызове gfix для полного отключения всех,включая owner и sysdba, код возврата всегда 1. Отключение пользователей от базы происходит

Не выгружается fbclient.dll (FB 2.5 и 3)

$
0
0
Пользователи стали жаловаться на ошибку "connection shutdown", периодически возникающую при работе с экспертом (и не только).
Стал копать и обнаружил, что при каких-то условиях FreeLibrary не выгружает fbclient.dll и все остальное, что она использует.

Т.е., имеем такую последовательность:
1. Загружаем fbclient.dll в память процесса.
2. Коннект и работа с базой...
3. Дисконнект.
4. Вызов fb_shutdown.
5. FreeLibrary.

После чего fbclient и иже с ним остаются болтаться в памяти процесса, а повторный коннект приводит к упомянутой ошибке.

В порядке бреда: есть подозрение, что что-то из загружаемого самой fbclient.dll опять же ее и грузит, увеличивая счетчик ссылок. А потом не выгружает.

Никто не знал,а сегодня.....

$
0
0
Никто не знал,а сегодня день рождения Евгения Болтика!!!!
Поздравляем!!!!

Изменение типа поля

$
0
0
Подскажите, правильный вариант решения я выбрал?
Есть база N лет в базе в таблице есть поле INTEGER (в индексах участия не принимает), сейчас возникла необходимость изменить тип поля на double precision.
1. Создаем поле двойник double precision.
2. Переливаем данные с поля INTEGER > double precision.
3. Удаляем поле INTEGER.
4. Переименовываем поле double precision в old name поля INTEGER.

FB2.5 после апдейта к UTF8 базу невозможно бакапнуть

$
0
0
апдейт базы для UTF8 делается не для всей базы, а для некоторых столбцов отдельных таблиц. проводятся следующие операции:

удаляются все триггера, вьюшки и процедуры.

автор
1) добавляется к таблице новый столбец TMP CHARACTER SET UTF8;
2) в этот столбец копируются данные из старого столбца;
3) старый столбец дропается;
4) создается новый с тем же именемс CHARACTER SET UTF8;
5) меняется позиция нового столбца со старым;
6) копируются данные из TMP в новый столбец;
7) дропается TMP.


после этого идет сравнение метаданных базы со скриптом создания и востанавливаются все процедуры и триггеры.

При попытке бакапить базу выдается сообщение:
Arithmetic overflow or division by zero has occured.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
gds_$receive failed.
Exiting before completion due to error.


При этом сама база вроде как рабочая. Все данные читаются и все замечательно. Сначала такое сообщение выбрасывало после строчки обработки какогото индекса.
Попробовал для всех индексов применить 'SET STATISTIK INDEX' бакап сразу же выкидывает такое сообщение.

FB2.5
Все скриптовые операции производятся IBEScript и если сключить конвертацию столбцов , то все проходит замечательно.

В чем может быть засада?

PS:Все обновление делается в пакете. Применяется для роботов. Есть базы, которые просто великолепно данную операцию производят, но есть и вот с таким случаем. Нужно знать как лечить такую штуку на будущее и в чем собственно проблема.

системные TC

$
0
0
Здравствуйте.

есть необходимость использования системных ТС. Тут у меня похоже небольшой пробел )

на вьюхе в триггерах пишутся данные во временную таблицу
последний триггер вызывает процедуру, которая проверяет есть ли в таблице записи.
И если есть - вызывает исключение.
Вот только после этого если временную прочитать в этой же транзакции, то там ничего нет.
Подозреваю, что исключение отменило все вставки.

http://www.ibase.ru/savepoints/ читал

есть ли возможность в данном случае прочитать что находится во временной?

Спасибо

Db level trigger & Shutdown

$
0
0
Firebird 2.1.
Есть проблемы получения монопольного доступа к БД в случае, если у подключенного клиента произошла ошибка в триггере на подтверждении транзакции.
Структура базы для воспроизведения.
create database "TEST_Shut.gdb" page_size 1024
  user "sysdba" password "masterkey";

commit work;

create exception TransactionCannotBeCommited "Can not commit a  transaction";

set term ^ ;


create trigger TranCommit
active on transaction commit position 0
as
begin
  if (RDB$GET_CONTEXT ('USER_TRANSACTION','TranCommitDisabled') is not null)
    then exception TransactionCannotBeCommited;
  end
  ^

set term ; ^
commit work;

Сценарий работы клиента:
1. Соединение
2. Старт транзакции
3. Выполнение запроса select RDB$SET_CONTEXT ('USER_TRANSACTION','TranCommitDisabled',1) from RDB$Database
4. Подтверждение транзакции

Ес-но на 4 шаге клиенту выдается ошибка. Если клиент не предпринимает никаких особых действий (а он, в общем случае, не обязан их делать), то происходит следующее.
1. Супер сервер: gfix -shut full -force 0 зависает
2. Классик сервер gfix -shut full -force 0 выполняется, пусть и с проблемой, а последующий gfix -online дает ошибку "lock conflict on no wait transaction".

Как правильно передать Blob из БД в БД?

$
0
0
Добрый день!
Подскажите как передается содержимое blob поля
из базы в базу, таблица, тип, и поля идентичны.
Юзаю Fibplus.
Пробовал так но 'write stream error'.
Здается что не правильно как-то.
        if not DS_S_R.FieldByName('F_EXE').IsNull then 
        begin
          MyStream := TStream.Create;
          TBlobField(DS_S_R.FieldByName('F_EXE')).SaveToStream(MyStream);
          TBlobField(Query.FieldByName('F_EXE')).LoadFromStream(MyStream);
          MyStream.Free;
        end;

Спасибо!

no 2 table rows can have duplicate column values

$
0
0
ошибка при обновлении данных:

Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values.
violation of PRIMARY or UNIQUE KEY constraint "PK_CARDS" on table "CARDS".
unknown ISC error 335545072.

LI-V6.3.1.32609 Firebird 3

при выполнении:
MERGE INTO CARDS M
USING (SELECT CARDID,BARCODE,CARDON,CARDTYPE,ID,FIO,TEL,TELHOME,CORRECTION,RATING FROM "##CARDS4_LOAD" WHERE :SHORT_DISCOUNT_ = 0 OR (:SHORT_DISCOUNT_ = 1 AND ID > :MODIFY_ AND ID < 99991231)) P
ON P.CARDID = M.CARDID
WHEN MATCHED THEN
UPDATE SET
M.BARCODE = P.BARCODE,
M.CARDON = P.CARDON,
M.CARDTYPE = P.CARDTYPE,
M.ID = P.ID,
M.FIO = P.FIO,
M.TEL = P.TEL,
M.TELHOME = P.TELHOME,
M.CORRECTION = P.CORRECTION,
M.RATING = P.RATING
WHEN NOT MATCHED THEN
INSERT(CARDID,BARCODE,CARDON,CARDTYPE,ID,FIO,TEL,TELHOME,CORRECTION,RATING)
VALUES(P.CARDID,P.BARCODE,P.CARDON,P.CARDTYPE,P.ID,P.FIO,P.TEL,P.TELHOME,P.CORRECTION,P.RATING);
с параметрами:
SHORT_DISCOUNT_=1
MODIFY_=20161020
хотя в таблицах CARDS и "##CARDS4_LOAD" дублей по CARDID нет
проверял так:
select cardid,count(*) cnt from "##CARDS_LOAD" group by cardid having count(*)>1

select cardid,count(*) cnt from CARDS group by cardid having count(*)>1

+
CREATE TABLE CARDS (
CARDID VARCHAR(10) NOT NULL,
BARCODE VARCHAR(13),
CARDON SMALLINT,
CRDDATEON VARCHAR(255),
CRDDATEOFF VARCHAR(255),
CARDTYPE INTEGER,
CLIENT INTEGER,
SUMALL NUMERIC(16,2),
STAT INTEGER,
ID BIGINT DEFAULT 0 NOT NULL,
UPDATE_DATE D_DATETIME DEFAULT '30-DEC-1899' NOT NULL,
FIO VARCHAR(150),
TEL VARCHAR(50),
TELHOME VARCHAR(50),
CORRECTION INTEGER DEFAULT 0 NOT NULL,
RATING INTEGER DEFAULT 0 NOT NULL
);

ALTER TABLE CARDS ADD CONSTRAINT PK_CARDS PRIMARY KEY (CARDID);
CREATE INDEX CARDS_BARCODE_IDX ON CARDS (BARCODE);
CREATE INDEX CARDS_IDX ON CARDS (ID);
CREATE INDEX CARDS_IDX1 ON CARDS (STAT, BARCODE);
CREATE INDEX CARDS_UPDATE_DATE_IDX ON CARDS (UPDATE_DATE);

CREATE TABLE "##CARDS4_LOAD" EXTERNAL 'CARDS4_LOAD.DAT' (
ID D_IDENTITY NOT NULL,
CARDID VARCHAR(10) NOT NULL,
BARCODE D_BARCODE,
CARDON D_BOOLEAN,
CRDDATEON D_DATETIME,
CRDDATEOFF D_DATETIME,
CARDTYPE INTEGER NOT NULL,
CLIENT INTEGER,
SUMALL D_MONEY,
STAT INTEGER,
FIO VARCHAR(150),
TEL VARCHAR(50),
TELHOME VARCHAR(50),
CORRECTION INTEGER,
RATING INTEGER,
EOL CHAR(2) CHARACTER SET OCTETS
);

Длинна varchar и utf8

$
0
0
Добрый день

Судя по документации firebird 2.5 длинна указанная в varchar равна 1 байту, при указание character set utf8, firebird резервирует всегда 4 байта под 1 символ, отсюда вопрос, получатеся я имею ограничение в 32765 / 4 = 8191 символов?

Заранее благодарен за ответ!

Оптмизация вызова ХП в предложении where

$
0
0
FB3. Хочется ускорить запрос. Или для начала понять. Вот такой запрос:
  • select a.id_sotr
    from sotr a
    where a.dat_uv is null and a.ruk is null and ( select out1 from sotr_rab(a.id_sotr, 91, '2016-10-01', '2016-10-25') ) = '1'
    

    Его план:
  • План
    PLAN (SOTR_RAB NATURAL)
    PLAN (A NATURAL)
    
    ------ Информация о производительности ------
    Время подготовки запроса = 16ms
    Время выполнения запроса = 250ms
    Среднее время на получение одной записи = 0,85 ms
    Current memory = 59 596 944
    Max memory = 111 757 384
    Memory buffers = 12 000
    Reads from disk to cache = 0
    Writes from cache to disk = 0
    Чтений из кэша = 189 506
    

    Нормально я бы сказал. Всё устраивает.
    Делаю запрос сложнее:
  • select a.id_sotr, sum(r.trud)
    from sotr a
         inner join rz r on r.id_sotr=a.id_sotr
         inner join umass u on u.id_ums=r.id_ums
    where a.id_sotr=r.id_sotr and a.dat_uv is null and a.ruk is null and ( select out1 from sotr_rab(a.id_sotr, 91, '2016-10-01', '2016-10-25') ) = '1'
          and u.dat_master between '2016-10-01' and '2016-10-25'
    group by 1
    

    Его план:
  • План
    PLAN (SOTR_RAB NATURAL)
    PLAN SORT (JOIN (U INDEX (UMASS_IDX5), R INDEX (FK_RZ_RELATIONS_UMASS), A INDEX (PK_SOTR)))
    
    ------ Информация о производительности ------
    Время подготовки запроса = 16ms
    Время выполнения запроса = 3s 73ms
    Среднее время на получение одной записи = 21,49 ms
    Current memory = 59 603 488
    Max memory = 111 757 384
    Memory buffers = 12 000
    Reads from disk to cache = 0
    Writes from cache to disk = 0
    Чтений из кэша = 2 437 738
    

    Получаю сильный перепробег по таблицам, задействованным в хранимке. От перемены порядка джойнов таблиц разницы нет. Как можно уменьшить количество "вызовов" хранимки?
  • Как защитить код хранимой процедуры от просмотра и изменения

    $
    0
    0
    Всем привет,

    возможно ли такое в Firebird?
    хочется подстраховаться на случай наёма мальчика "умельца" по дэмпинговой цене а так же скрыть некоторые ноухау

    Спасибо

    Восстоновление работы базы

    $
    0
    0
    В общем ситуация жопа. Пароль SYSDBA не известен, ибо разработчик не возжелал его предоставить и на мнимых правах некого обслуживания доил компанию в течение 2010-2014 годов. В итоге в конце 2014 года отказались от обслуживания, бэкапы делал методом остановки сервера и переноса БД и все было хорошо на протяжение двух лет. Все бы нечего, но на прошлой недели сервер умер. И сейчас подняв новый сервер не получается оживить базу данных...
    В наличие есть security2.fdb и собственно сама база данных, вопрос как их security вытащить пользователей и залить на новый сервер? Судя по документации из различных источников перезаливка пользователей может восстоновить работу базы...

    Собственно вот ошибка:
    Error Message:
    ----------------------------------------
    can't format message 13:896 -- message file D:\firebird.msg not found.
    invalid request BLR at offset 257.
    function BITAND is not defined.
    string truncated.
    user AN_ACCESS_AUTHORIZED is not a member of SQL role (null).


    [00540EE3] FIB.IBError (Line 539, "FIB.pas" + 55) + $2
    [0053CA65] FIBDatabase.TFIBDatabase.Open (Line 1014, "FIBDatabase.pas" + 77) + $9
    [0051763F] pFIBDatabase.TpFIBDatabase.Open (Line 285, "pFIBDatabase.pas" + 9) + $2
    [0053CD6D] FIBDatabase.TFIBDatabase.SetConnected (Line 1080, "FIBDatabase.pas" + 4) + $4
    [01060336] IBEDatabases.TIBEDatabase.Connect (Line 3098, "IBEDatabases.pas" + 2) + $10
    [00FFAA3A] InspectorFm.TInspectorFrame.OpenDatabase (Line 3303, "Frames\InspectorFm.pas" + 44) + $D
    [00FF5856] InspectorFm.TInspectorFrame.ObjectsTLDblClick (Line 1281, "Frames\InspectorFm.pas" + 11) + $A
    [00455281] Controls.TControl.DoMouseDown (Line 4306, "Controls.pas" + 2) + $21
    [0045533D] Controls.TControl.WMLButtonDblClk (Line 4331, "Controls.pas" + 5) + $C
    [00444044] Forms.StdWndProc (Line 1459, "Forms.pas" + 8) + $0
    [0044D853] Forms.TApplication.ProcessMessage (Line 6630, "Forms.pas" + 13) + $1
    [010A2468] IBExpert.IBExpert (Line 944, "D:\Projects_5\IBExpert\IBExpert.dpr" + 156) + $7


    Если просто заменить security2, то сервер не читает его в итоге база данных не доступна.
    Хотели уже связаться с разработчикам, а они оказывается закрыли свою лавочку еще в начале этого года.

    HQbird Enterprise и репликация

    $
    0
    0
    Пришло письмо - информационная рассылка по подписке - с предложением потестировать $subj.

    Интересное предложение.
    Но прежде тестов хотелось бы ясности.

    Как настроить репликацию расписано подробнее некуда.
    А как использовать копию в случае отказа мастера и как потом восстановить штатную репликацию - не нашёл.

    В первую очередь, наверное, это к kdv, конечно.
    Хотел на ibase на форуме тему создать, но ни в учетку не пустило, ни восстановление не находит меня. Странно. Но это к делу не относится. Пишу тут.

    HQbird Enterprise и нативная репликация и высокая доступность для Firebird

    $
    0
    0
    Доброе время суток Всем,

    Почитать можно тут.
    Кто то уже попробовал? Откуда у них ноги растут, точнее кто за ними стоит? Насколько надёжны? Не исчезнут ли неожиданно?
    Такое если покупать то хочется уверенности в будующем. Опять же ценовая политика немного не понятна, если у фёникса их репликация обойдётся сравнительно не дорого и единоразово то тут с репликацией только Enteprise около 5000 Евро в год, дороговато (по крайней мере с первого взгляда). Кто какие за и против выскажет?

    Спасибо.

    SAVEPOINT, EXECUTE BLOCK, EXCEPTION

    $
    0
    0
    Шалом.

    В N-ном звене динамически формируется EB (один оператор!), из которого фетчятся данные.
    Результат выполнения коммитится всегда, независимо от того, вывалит или нет исключение.
    Текст исключения динамический.

    Вопрос: как откатить часть операций (после фетча!) из EB?


    +
    execute block
    returns (
    PROGRESS varchar(100)
    )
    as
    begin
     -- >>>>
     -- блок операций, которые выполняются всегда
     delete from T_TEST;
     PROGRESS = 'START';  suspend;
    
     in autonomous transaction do --если сработает savepoint, то можно не в автономе
     insert into T_TEST( OPER) values (:PROGRESS || CURRENT_TIMESTAMP);
    
     -- <<<<
    
     -- опциональный блок
     -- savepoint p1;
     -- хочу откатить сюда
    
     PROGRESS = 'P_TEST1'; suspend;
     for select RESULT
         from P_TEST1
         into :PROGRESS
         do suspend;
    
     PROGRESS = 'P_TEST2'; suspend;
     for select RESULT
         from P_TEST2
         into :PROGRESS
         do suspend;
    
     PROGRESS = 'PROCESSED'; suspend;
     for select OPER
         from T_TEST
         into :PROGRESS
         do suspend;
    
     when any
     do begin
         -- rollback p1;
         exception;
        end
    end
    

    LockHashSlots, максимальное значение

    $
    0
    0
    Какое максимальное значение может быть у LockHashSlots?
    В настройках выставил LockHashSlots = 90001, но только сейчас заметил,что в выводе:

    LOCK_HEADER BLOCK
    Version: 145, Active owner: 0, Length: 1476395008, Used: 1445648768
    Flags: 0x0001
    Enqs: 42838367471, Converts: 111179156, Rejects: 726033999, Blocks: 816925355
    Deadlock scans: 12910, Deadlocks: 0, Scan interval: 120
    Acquires: 48810792322, Acquire blocks: 14616961785, Spin count: 0
    Mutex wait: 29.9%
    Hash slots: 65521, Hash lengths (min/avg/max): 0/ 2/ 12
    Remove node: 0, Insert queue: 0, Insert prior: 0
    Owners (530): forward: 25486296, backward: 78385320
    Free owners (242): forward: 104065216, backward: 36896368
    Free locks (10853): forward: 548208, backward: 70145520
    Free requests (363511191): forward: 492601864, backward: 233647560
    Lock Ordering: Enabled

    p.s. Firebird 2.5.3

    Время и частота выполнения триггера

    $
    0
    0
    Как правильно мониторить частоту вызова триггера и время выполнения?
    Пока варианты сделать вставки :
    +
    CREATE OR ALTER trigger algoritm_bu for algoritm
    active before update position 0
    as
    begin
    // тут смотреть время старта и писать его в таблицу или файлик
    if (old.name <> new.name or
    old.procdown is distinct from new.procdown or
    old.procrest is distinct from new.procrest or
    old.comment is distinct from new.comment or
    old.reserve <> new.reserve or
    old.reserve1 <> new.reserve1 or
    old.reserve2 <> new.reserve2)
    then new.moddate = 'now';
    // тут смотреть время финиша и писать его в таблицу или файлик
    end

    трассировкой не хочу, т.к. запуск триггера не всегда в неё попадает или просто может дублироваться.
    Что лучше - писать в файл или в базу?

    Вновь созданный пользователь не может подключиться к БД

    $
    0
    0
    Ребят, помогите решить проблему:

    1. Я создаю пользователя через IB expert из-под учетки SYSDBA (FB 2.5)
    2. Потом пытаюсь подцепиться этим новым пользователем к БД и получаю:

    Connecting... Failed!
    ------------------------------------
    Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
    Your user name and password are not defined. Ask your database administrator to set up a Firebird login.

    Attempting to connect to services manager... Failed!
    ------------------------------------

    Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
    Your user name and password are not defined. Ask your database administrator to set up a Firebird login.


    Пробовал заводить учетку через gsec, но это тоже не помогло, результат аналогичный.
    Пробовла подключаться к БД не SYSDBA, подключаюсь нормально.

    Security база лежит вот тут /opt/firebird/security2.fdb

    Может где-нибудь в каких нибудь конфигах нужно прописать путь в Security БД? Заранее спасибо за любые советы.
    Viewing all 1677 articles
    Browse latest View live