Модераторы: Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Информация, документация, статьи, примеры, на русском 
:(
    Опции темы
Akella
Дата 12.11.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Скрипт создания резервной копии базы данных firebird (не помню, где нашел, пока что сам не использовал)

Код

rem Cкрипт срочной архивации баз
@echo off
rem Ключ proceed нужен для предотвращения случайного запуска
if not %1==proceed goto quit

title sweep, backup and restore database
echo ***************************************************************************
echo.|date
echo.|time

rem Устанавливаем локальные переменные на уровне командного файла (для удобства)

setlocal
set path=C:\program Files\Firebird\Firebird_1_5\Bin
set backuppath="d:\backup"
set logpath="d:\backup\logs"
set IB_USER="SYSDBA"
set IB_PASS="password"

rem Gbak лежит по пути Path. Копирование выполняется без сборки мусора (-g)
rem Пишется лог в gbak_tmp_1.log, после backup файла лога переименовывает файл
rem лога в соответствии с текущими датой и временем (rendate - самописная программа)

gbak.exe -user %IB_USER% -password %IB_PASS% -b -g -v -z -y %LOGPATH%\gbak_tmp_1.log "localhost/3070:base" %BACKUPPATH%\base.fbk
rendate %LOGPATH%\gbak_tmp_1.log "_YYMMDD_HHMMSS"
echo.|date
echo.|time
:quit


Добавлено через 1 минуту и 52 секунды
Стандартный скрипт создания резервной копии базы данных firebird (использовал часто)
Код
"c:\program files\firebird\firebird_2_0\bin\gbak.exe" -b -v -user sysdba -password masterkey origina_base.fdb base.bak


Добавлено через 2 минуты и 49 секунд
учтите, что параметр -g запрещает сборку мосура при создании резервной копии
PM MAIL   Вверх
Deniz
Дата 13.11.2009, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Выложу и я свой скрипт(первоначально где-то взял, потом доработал), может кому понадобится:
Код
@echo off
set gbak="C:\Program Files\Firebird\Firebird_1_5\bin\GBAK.EXE"
set rar="d:\winrar\winRar.exe" m -m5 -md4096 -ep -cl -idp -ag_A -inul
set gfix="C:\Program Files\Firebird\Firebird_1_5\bin\GFIX.EXE"

set user=SYSDBA
set pass=masterkey

rem в первой переменной передается файл БД
set f_name1=%1

set fGDB="localhost:d:\base\%f_name1%"
set fGBK="d:\backup\%f_name1%.fbk"
set fRAR="d:\backup\%f_name1%.rar"

echo ======== %f_name1% ========
echo  %date:~0,10% %time:~0,8% backup
%gbak% -b -v -user %user% -pass %pass% %fGDB% %fGBK%

echo  %date:~0,10% %time:~0,8% archive
%rar% "%fRAR%" %fGBK% 

rem echo     gfix ...
rem %gfix% -sweep -user %user% -password %pass% %fGDB%

echo  %date:~0,10% %time:~0,8% done



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
  Дата 9.12.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Конвертировать строку в таблицу.
На входе строка '1,2,3,4', на выходе - таблица.

Код

create or alter procedure SPLIT_INTEGER (
    VALUE_ varchar(2048))
returns (
    RESULT integer)
as
declare variable TEMP_ varchar(16);
declare variable CHAR_ varchar(1);
begin
    if (value_ is null) then
       exit;
    --end if
    value_=value_||',';
    temp_='';
    while (value_<>'') do
    begin
       char_=substring(value_ from 1 for 1);
       if (char_=',') then
       begin
          if (temp_<>'') then
          begin
             result=cast(temp_ as integer);
             temp_='';
             suspend;
          end--if
       end
       else
          temp_=temp_||char_;
       --end if
       value_=substring(value_ from 2 for 2048);
    end--while
end

Ист>>
PM MAIL   Вверх
Deniz
Дата 9.12.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Akella, там же потом полегче процедура (чуток подправил):
Код
create procedure UnList (
  String varchar(2048),
  Separator varchar(1)
)
returns (Row varchar(20))
as
begin
  Separator = coalesce(Separator, ';');
  if (Separator = '') then Separator = ';';
  Row = '';
  while (String != '') do
  begin
    if (substring(String from 1 for 1) != Separator) then
      Row = Row || substring(String from 1 for 1);
    else
    begin
      if (Row != '') then suspend;
      Row = '';
    end
    String = substring(String from 2);
  end
  if (Row != '') then suspend;
end
Примеры вызова:
Код
select ul.* from
rdb$database r
left join unlist(';Фамилия;Имя;;Отчество;2;3;4;5;', '') ul on 1=1
where ul.Row <> '3'
на выходе таблица. Прошу обратить внимание на возвращаемое значение varchar(...), кому надо приводите к нужному типу и размеру.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 19.1.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



PM MAIL   Вверх
Akella
Дата 29.3.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



PM MAIL   Вверх
Akella
Дата 8.4.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Как найти неиспользуемые домены, исключения, UDF, генераторы
Код

/* Неиспользумые домены */
select RF.Rdb$Field_Name
  from Rdb$Fields RF
 where RF.Rdb$Field_Name not like 'RDB$%'    /* Используются Interbase */
   and not exists (select 1
                     from Rdb$Relation_Fields
                    where RDB$FIELD_SOURCE = RF.Rdb$Field_Name);

/* Неиспользуемые исключения */
select E.Rdb$Exception_Name
  from Rdb$Exceptions E
 where E.Rdb$Exception_Name not like 'RDB$%' /* Используются Interbase */
   and not exists (select 1
                     from Rdb$Dependencies D
                    where D.Rdb$Depended_On_Name = E.Rdb$Exception_Name)


/* Неиспользуемые UDF: */
select F.Rdb$Function_Name
  from Rdb$Functions F
 where not exists (select 1
                     from Rdb$Dependencies D
                    where D.Rdb$Depended_On_Name = F.Rdb$Function_Name)

/* Неиспользуемые генераторы: */
select G.Rdb$Generator_Name
  from Rdb$Generators G
 where G.Rdb$Generator_Name not like 'RDB$%' /* Используются Interbase */
   and G.Rdb$Generator_Name not like 'SQL%'  /* Используются Interbase */
   and not exists (select 1
                     from Rdb$Dependencies D
                    where D.Rdb$Depended_On_Name = G.Rdb$Generator_Name)



Добавлено через 14 минут и 54 секунды
Восстановление удалённых записей в Interbase/Firebird
PM MAIL   Вверх
Akella
  Дата 9.4.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Удалить дубликаты записей в Firebird

Этот запрос удалит дубликаты записей по полю tel, основываясь на дополнительном условии - id_mediator is not null
Код

delete from phones
where
  (id_mediator is not null)
and 
  tel in (select p.tel from phones p
            where (p.id_mediator is not null)
            group by 1
            having count(p.tel) > 1)

Спасибо Deniz`у.

Это сообщение отредактировал(а) Akella - 17.1.2012, 11:01
PM MAIL   Вверх
Deniz
Дата 9.4.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Позволю себе некоторые комментарии:
Особенность FireBird состоит в том, что внутренний запрос (в where) выполняется для каждой удаляемой записи.
Следовательно, удалятся все дубликаты кроме последнего, т.к. для него внутренний запрос уже не отработает.
FAQ ibase.ru


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 5.2.2011, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Репликация Firebird
http://www.aleksandr-pro.ru/project1.php



user posted image
PM MAIL   Вверх
Akella
Дата 26.11.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Хостинг с поддержкой Firebird
Есть два неплохих русскоязычных хостера, которые предоставляют хостинг с поддержкой Firebird.
1. http://sweb.ru/ (на тарифе SX-1 нет поддержки Firebird)
2. http://moshoster.ru/

И оба хостера могут предоставить доступ к Firebird извне. Это очень здорово smile
PM MAIL   Вверх
Akella
Дата 26.1.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Замена IN. Конвертировать строку в таблицу. На входе строка '1,2,3,4', на выходе - таблица.


Код

CREATE OR ALTER PROCEDURE LIST_TO_ROWS(
    LST BLOB SUB_TYPE TEXT)
RETURNS (
    ID INTEGER)
AS
  declare pos_ int;
  declare offset int = 1;
  declare beg int;
  declare buf varchar(30100);
begin
  if (lst is null) then exit; -- добавлено по подсказке wm

  while (0=0) do begin
    buf = substring(lst from offset for 30100);
    pos_ = 1; beg = 1;
    while (pos_ <= char_length(buf) and pos_ <= 30000) do begin
      if (substring(buf from pos_ for 1) = ',') then begin
        if (pos_ > beg) then
          id = substring(buf from beg for pos_ - beg);
        else
          id = null;
        suspend;
        beg = pos_ + 1;
      end
      pos_ = pos_ + 1;
    end
    if (offset + pos_ - 2 = char_length(lst)) then leave;
    offset = offset + beg - 1;
    if (offset > char_length(lst)) then leave;
  end

  if (pos_ > beg) then
    id = substring(buf from beg for pos_ - beg);
  else
    id = null;
  suspend;
end



Ист >>>
PM MAIL   Вверх
Akella
Дата 16.4.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



PM MAIL   Вверх
Akella
Дата 9.7.2012, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



PM MAIL   Вверх
Akella
Дата 19.10.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Как добавить столбец в таблицу Firebird с предварительной проверкой, чтобы не было ошибок при добавлении


Код

EXECUTE block as
BEGIN
if (not exists(
select 1 from RDB$RELATION_FIELDS rf
where rf.RDB$RELATION_NAME = 'T1' and rf.RDB$FIELD_NAME = 'C1'))
then
execute statement 'ALTER TABLE T1 ADD C1 INTEGER';
END



Код

create procedure add_column(tab_name varchar(31), col_name varchar(31),
data_type varchar(100))
BEGIN
if (not exists(
select 1 from RDB$RELATION_FIELDS rf
where rf.RDB$RELATION_NAME = :tab_name and rf.RDB$FIELD_NAME = :col_name))
then
execute statement 'ALTER TABLE "'||tab_name||'" ADD "'||:col_name||'" '||:data_type;
END



execute procedure add_column('T1', 'C1', 'INTEGER');

PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.