firebird database (快速入门) 简体版

firebird database (快速入门)

参考文件(均可自firebird网站找到):
Novice's Guide
Migration from MS-SQL to firebird 
Firebord Release Notes 

 

 

  1. 学习资料库基础是在sql的语法应用(请参考: firebird网站的说明文件 最好把这份文件印出来,在写程式时可以参考其语,虽然大部份都是sql-92相容,但是有差异,还有一些专有的语法)
  2. 当你需要的资料找不到时可以找寻interbase的相关资料(因为firebird是由interbase释放原始码所衍生的)
  3. 有一本网路上完整的书"BORLAND INTERBASE7.0 应用开发指南(姚启红着)",虽然是interbase但非常详细,要深入了解(建议必读)
尚在撰写中............

目录索引


前言
它是Borland之前推出interbase资料库,并将其开放原始码的免费资料库软体,目前版本是1.5.2,它比mysql, postgresql 更适合于windows作业系统,它并不是使用cygwin的方式移植到windows上,而是真正的windows软体,我们一般将其比较于Ms- sql server,是一个小而美资料库,最大的优点在于它是免费的(ms-sql server五人版至将近三万元) ,其实它也支援不同作业平台(含inux),对于linux上我还是建议大家postgresql或是mysql
因为firebird若要用php的话就有点难了...,你要根据网站文件来作一些修改编译的动作
#日前postgresql 8.0释放已经支援windwos的原始档(不使用cygwin来执行),但很可惜不支援98/me
因目前还是有人使用win98单机使用的资料库,如果你单机上使用nt系统(2000/xp)等可以使用postgresql,因为postgresql 比起firebird来讲某方面确实比较强,而使用者也比较多

架构
firebird 资料库软体有三种套件,并而支援不同作业平台(windows系列,linux,freebsd等...)
  1. Super Server -无法直接存取资料库档案,必须透过socket来和伺服器沟通
  2. Classic- 直接存取资料库的档案,多个程式可以同时存取一个档案,有点像vfp,dbase
  3. embedded- 专为一些小型系统的嵌入式资料库(pda)

下载及安装
主网站: http://firebird.sourceforge.net/
Download->Firebird relational database
直接点两下就可以安装,请照步骤,根据自己的需求来安装
预设安装路径
windows:c:\program files\firebird\firebird_1_5
linux:/opt/firebird 
两个作业系统下的目录结构非常像
根目录下:
firebird.conf-设定档 
aliases.conf -别名档
friebird.log -记录档
SYSDBA.password -linux才有,管理者的名称及密码在里面,windows则预设:名称:sysdba,密码:masterkey
windows直接使用security.fdb来存sysdba的密码
注意:使用者名称不分大小写,但密码有分
目录/bin:
则是一些必要的主要及工具程式

设定firebird 
主要的设定档
firebird.conf 
预设tcp/ip会启动port:3050
你可以使用telnet ip 3050来测试
aliases.conf
设定资料库的别名
资料库连线时一般要指定路径,有时路径太长时你可以指定,在aliases.conf中使用别名来存取
它是位于你安装firebird的根目录,以下为内建范例
# 别名= 原始路径
employee.fdb = /opt/firebird/examples/employee.fdb
 
其中#为注解,而windows及linux的路径是有所不同:
# fbdb1 在Windows伺服器:
fbdb1 = c:\Firebird\sample\Employee.fdb
# fbdb2 在Linux伺服器:
fbdb2 = /opt/databases/killergames.fdb
资料库执行时可以编辑这个档案,不需要重新启动伺服器
连线别名的方式:
Server_name:aliasname

使用者管理(consloe介面)
1.预设管理者名称sysdba,密码masterkey
2.密码档security.fdb,位于firebird安装目录下
3.管理程式gsec 
   安装目录下\bin
4.密码长度限制在8码
用法:
本地主机(资料库server在本台电脑)
gsec -user sysdba -password <password> [options]
远端主机(资料库server在别台电脑)
gsec -user sysdba -password <password> -database <databasename>

 

gsec命令

options

范例
有两种方式
1.直接下在命令列-
2.进入互动式的命令列-额外的命令
新增使用者
gsec -user sysdba -password masterkey 
gsec> add elvis -pw elvis -fname elvis -lnmae presley 
修改密码
gsec> modify elvis -pw chunk 
修改sysdba密码
gsec -user sysdba -password masterkey -modify sysdba -pw mykey37
修改远端伺服器linux的sysdba密码
gsec -user sysdba -password masterkey -database harry:/opt/firebird/security.fbd -modify sysdba -pw hamburg 
修改远端伺服器windows的sysdba密码
gsec -user sysdba -password masterkey -database sally:"c:\Program files\Firebird\security.fdb" -modify sysdba -pw hannover
修改远端伺服器使用tcp port 3050
gsec -user sysdba -password masterkey -database jack/3050:/opt/firebird/security.fdb" -modify sysdba -pw londo
修改远端windows伺服器ip( abcd)使用tcp port 3050 
gsec -user sysdba -password masterkey -database abcd/3050:"c:\program files\firebird\firebird_1_5\security.fdb -modiyf sysdba -pw londo 
删除本地使用者
gsec -user sysdba -password masterkey -delete joe 

di[splay]
显示所有使用者
di[splay] <username>
显示某使用者
a[dd] <username> -pw <password> [options]
新增使用者
mo[dify] <username> [options]
修改使用者
de[lete] <username>
删除使用者
h[elp]
求助
?
同上
q[uit]
离开gsec
z
显示版本
-pa[ssword] <password>
管理者的密码
-user <username>
使用者名称
-pw <password>
使用者密码
-fname <first name>
英文名字有,三个部份
-mname <middle name>

-lname <last name>


资料库管理(console)
程式isql位于安装目录下的bin
以下是一个操作范例:
c:\Program files\firebird\firebird_1_5\bin\> isql -user sysdba -password masterkey
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect test;
Database: test, User: sysdba
SQL> show table;
       COUNTRY CUSTOMER
       DEPARTMENT EMPLOYEE
       EMPLOYEE_PROJECT JOB
       PHONE_LIST PROJECT
       PROJ_DEPT_BUDGET SALARY_HISTORY
       SALES
SQL> select * from country ;
COUNTRY CURRENCY
=============== ==========
USA Dollar
England Pound
Canada CdnDlr
SQL>quit;

建立资料库
1.建立资料库create database 
2.建立资料表格create table (sql指令)
3.删除资枓表格drop table (sql指令)
4.查询资料库中所含表格show table 
5.查询表格中的结构show table 表格名称
6.新增,删除,更新(insert,delete,update)均为sql指令
7.SQL命令交付,在新增或删除时,资料库并未直接变更,要使用sql指命commit 或commit work来更新

 

isql -user sysdba -password masterkey

 Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'c:\temp\test.fdb';
SQL> create table abc (name char(12),age numeric(3));
SQL> show table friend ;
FIRSTNAME CHAR(15) Nullable
LASTNAME CHAR(20) Nullable
CITY CHAR(15) Nullable
STATE CHAR(2) Nullable
AGE INTEGER Nullable

 SQL> insert into abc (name ,age) values( 'cschen',34);
SQL> select * from abc;

 

NAME AGE
============ =======
cschen 34
 

以上的操作主要是sql指令
命令的结尾必需使用";", 如果没有使用";"提示会由SQL>变为CON>,告诉你延续之前的命令
SQL>create table friend 
CON>(FIRSTNAME CHAR(13),
CON> LASTNAME CHAR(40),
CON> STATE CHAR(2),
CON> AGE INTEGER );
同下
SQL>create table friend (FIRSTNAME CHAR(13),LASTNAME CHAR(40),STATE CHAR(2),AGE INTEGER);


每一个资料库有一个特殊资料库- 系统资料库 ,包含了使用者权限等...
SQL> show system;
       RDB$CHARACTER_SETS RDB$CHECK_CONSTRAINTS
       RDB$COLLATIONS RDB$DATABASE
       RDB$DEPENDENCIES RDB$EXCEPTIONS
       RDB$FIELDS RDB$FIELD_DIMENSIONS
 
      .................. ..................

 

 

使用者权限
1.GRANT 授予使用者权限
  GRANT 权限ON 物件TO 对象[with grant option]
2.REVOKE 撤消使用者权限
  REVOKE 权限ON 物件FROM 对象

 

权限:SELECT ,INSERT ,UPDATE,DELETE, ALL
物件:TABLE,VIEW
对象:使用者,PUBLIC(代表全部)
with grant option 让该名使用者有设定别的使用者的权限 
*因为isql无法输入中文,因此无法使用在中文输入资料
*在linux下由于可能会有同名的isql(unixODBC套件),而linux安装在/opt/firebird,因此必须使用绝对路径来执行,另资料库的管理者名称可以不固定,至于密码在安装时会自动产生在档案SYSDBA.password中


连线方式(档案/tcpip)
程式支援两种连线方式
1.使用完整路径连线
  c:\abcd.....
2.使用tcpip连线,在路径前加主机的名称或IP
   主机:c:\abcd....

 

我们可以根据切换这两种
windows 下的路径如有空白,有时必须使用" "将路径框起来才可以用

 


资料库/使用者管理(gui)
  
我有试过几个免费的windows端的软体 
选择 ibeasy+ :非常容易管理,必须有资料库的观念
另外可配合 marathon 使用
ibeasy+使用者管理介面:
server->users management

(输入管理者的名称及密码,进入下一个视窗)

(你就可以管理你的使用者)

 

 


设定odbc 
在firebird->download ->odbc
下载后安装
odbc 
odbc picture
Database 
1.完整路径-c:\database\abc.fdb
2.tcp/ip-ip:完整路径(127.0.0.1:c:\database\abc.fdb)

资料库的安全(备份/回存)(console)

GBAK:命令列工具,命令有两个状态,备份/回存(-b / -c) 

语法 
gbak <options> -user <username> -password <password> <source> <destination> 
1.备份
gbak -b <source> 是你要备份的资料库来源, <destination>是备份的目的地档名.一般的延伸附档名是.fbk .
只有SYSDBA 或是资料库的拥有者可以执行备份工作. 对于多个档案的资料库,只需指定第一个档案的名称来当资料库的名称. 
2.回存 
gbak -c <source> 是先前备份的档案而<destination> 是资料库的名称

 


选项

(中括号内的是非必要,也就是命令可以使用中括号前的缩写,或是含中括号内为长参数)

参数 说明 功能
-b[ackup_database]  备份 备份
-bu[ffers] Set cache size for restored database 回存
-c[reate_database] 回存(必要参数) 回存
-co[nvert] 转换外部表格到内部表格s 备份
-e[xpand] 建立一个非压缩的备份 备份
-fa[ctor] n 磁带机的区块系数 备份
-g[arbage collect] 备份时不清空已删除的资料 备份
-i[nactive] 所有的索引将回存为INACTIVE 回存
-ig[nore] 备份时不做checksum错误检查 备份
-k[ill] 在不建立定义备份中的shadows 回存
-l[imbo] 备份时忽略limbo transactions 备份
-m[etadata] 只备份资料表格的metadata (schema).不备份资料 备份
-mo[de] read_write  回存一个可读/写的资料库(预设) 回存
-mo[de] read_only 回存一个唯读写资料库 回存
-n[o_validity] 不回存validity constraints.也就是回存资料不回存constraints 
回存
-nt 非相容性的格式(只使用在相同作业平台,及firebird版本) 备份
-o[ne_at_a_time] 一次回存一个表格.你可以分别分次回存表格 
回存
-ol[d_descriptions] 旧的格式 备份
-p[age_size] <size> 设定page size of new database.
 <size> 可以是1024, 2048, 4096, 8192.预设1024. 
回存
-pa[ssword] <password> 资料库的密码  
-r[eplace_database] 回存在一个存在的资料库上.只能在拥有本资料库的使用者可以操作 
这是覆写,不要执行在使用中的资料库!
回存
-role <role> 使用某一群组(role )来连线  
-se[rvice] <hostname>:service_mgr 备份: 建立,使用服务管理.
回存: 回存,使用服务管理.
 
-t[ransportable] 建立可转移的备份(不同作业系统及firebird版本) 备份
-u[ser] <username> 资料库使用者的名字 
 
-use_[all_space] 正常,回存,资料库页会填满80% 
唯读才会写回100%(因为不用预留修改的空间)
回存
-v[erbose] 显示所有gbak执行的详细动作 
 
-y <filename> 重导所有的输出到一个档案<filename>.
注意:命令执行之前不可以存在档名  
 
-y suppress_output Quiet mode   
-z 显示版本
 

范例:

正常的备份:
gbak -v -t -user SYSDBA -password "masterkey" dbserver:/db/warehouse.fdb c:\backups\warehouse.fbk

备份并记录所有备份时的输出讯息:
gbak -v -t -user SYSDBA -password masterkey -yc:\backups\warehouse.log dbserver:/db/warehouse.fdb c:\backups\warehouse.fbk

正常的回存:
gbak -c -v -user SYSDBA -password masterkey c:\backups\warehouse.fbk dbserver:/db/warehouse2.fdb

回存到一个已存在的资料库:
gbak -c -r -v -user SYSDBA -password masterkey c:\backups\warehouse.fbk dbserver:/db/warehouse.fdb

回存一个唯读的资料库:
gbak -c -v -mode read_only -use_all_space -user SYSDBA -password masterkey c:\backups\warehouse.fbk c:\files\warehousedb.fdb

多重档案备份
当资料库很大时,要备份有点困难,因此我们将资料库备份成许多小的档案,如此储存时比较方便

备份语法:
gbak [options] <database> <target file 1> <size 1> <target file 2> <size 2> ... <target file n>

注意: 不要指定最后一个档案的大小.因我们不一定知道最后一个档案需要多少空间来储存,所以它将自动依据大小来储存.至于其它档案的大小可以是bytes (8192), kilbytes (1024k), megabytes (5m), 或gigabytes (2g)

回存语法:
gbak -c [options] <source file 1> <source file 2> ... <source file n> <database>

回存到一个多个档案的资料库

有些系统的档案系统有限制,或是为了效能的因素,因此单一资料库,可分成多个小的资料库

gbak -c [options] <source file> <db file 1> <size 1> <db file 2> <size 2> ... <db file n>

注意:不要指定最后资料库的大小.它可以无限制的依据回存的档案来变更大小.
Size can be given in bytes (8192), kilbytes (1024k), megabytes (5m), or gigabytes (2g)

由备份多个档案回存到多个档案的资料库:
gbak -c [options] <source file 1> <source file 2> ... <source file n> <db file 1> <size 1> <db file 2> <size 2> ... <db file n>


资料库安全(备份/ 回存)(gui)
(ibeasy+,参考hlp档)

选项 (Database | Save Database)
backup database

你可以简单复制资料库档(如一般的指令copy) 但是无法确定资料库的安全.
优点:

  • 改善效能经由排除不完整的(eliminating incomplete)交易和过期的记录
  • 减少资料库的大小-移除删除的记录
  • 独立的备份和回存的功能和作业系统无关

执行时必要参数:

  •  资料库全名
  • 备份档案的名称,可包含大小等特性.
  • The options which must be applied at the time of back up
    Checksums 检查资料的完整.
    End transactions
    Metadata only 只存结构不存资料.
    Eliminate garbage 予许释放旧版本记录的空间.
    Old data format
    Transportable database 可以回存资料库到不同的作业系统.
    Convert to tables 转换外部档案到内部表格.
选项: (Database | Restore Database)
resotre database

执行这个操作,必须是这个资料库的拥有者或是有执行管理系统的权限: SYSDBA.
一个资料备份的资料库可以回存
执行时必要参数:

  • 备份档案的名称
  • 资料库全名
  • 可用的参数 
    Page size 变更资料库每页的大小,可以改善效能.说实在,所有资料库在一页中会比较快.
    Rebuild Indices.  重建索引
    Create database image Allow the recovery of a database in case of disk crash.
    Validity conditions Allow when data are not valid any more, following for example a modification of the integrity constraints, to be unaware of the integrity constraints.
    Commit after each table
    Replace database In this case, the database must be closed beforehand, and no user must be connected.
    Create a new database This option is exclusive compared to the preceding option
    Use all space to recreate the database. By default, at the time of the restoration of a database, the pages are filled out to 80%. This option makes it possible to fill them to 100%.

资料型态

名称 大小 范围/精度 描述
Blob 不固定
blob段大小限于64K 动态变长度二进位类型,用于存放大量资料的情况,如图片、音乐、视频、多媒体等。 其基本结构单位为段,它的子类型描述了存储资料的详细资讯
Boolean 16位 True
False
Unkown
代表了逻辑上的(真、假、不确定)与Dialect无关。
Char(N) n个字元 1到32767个位元组。 双字元集除2 固定长度的字元或字串
Date 64位 从西元后100年一月一日到32768年二月29日 日期类型。 只有年月日,不带时间
Decimal(P,S) 变数(16、32或64位) 精度p从1到18: 指定数字的总长度;标度s从0到18: 指定小数点后的位数。 定点小数。 例如decimal(5,3)可以存储的数位形式为:pp.sss
Double Precision 64位 从2.225×10的-308 次方
到1.797×10的308次方
IEEE双精度浮点数,15位长度
Float 32位 从1.175×10的-38 次方
到3.402×0的38次方
IEEE单精确度浮点数,7位长度
Integer 32位 从-2147483648
到2147483647
整数
Numeric(P,S) 变长(16、32或64位) 精度p从1到18: 指定数字的总长度;标度s从0到18: 指定小数点后的位数。 定点小数。 例如decimal(10,3)可以存储的数位形式为:ppppppp.sss
Smallint 16位 从-32768到32767 短整数
Time 64位 从0:00 AM到23:59.9999 PM 时间类型
Timestamp 64位 从西元后100年一月一日到32768年二月29日 带有时间的日期类型
Varchar(N) n个字元 1到32767个位元组。 字元集决定了其能容纳的最大字元数

#Blob
blob sub_type segment 
这是一个特有的资料型态,是用于储存比较大量的资料,类似其它资料库的text或是memo资料型态,在定义时有两个附加参数是sub_type, segment
sub_type是blob的资料类型,以下是它的types.h中的定义
定义
说明
TYPE ("TEXT", 1,nam_f_sub_type)
TYPE ("BLR", 2,nam_f_sub_type)
TYPE ("ACL", 3,nam_f_sub_type)
TYPE ("RANGES", 4,nam_f_sub_type)
TYPE ("SUMMARY", 5,nam_f_sub_type)
TYPE ("FORMAT", 6,nam_f_sub_type)
TYPE ("TRANSACTION_DESCRIPTION", 7,nam_f_sub_type)
TYPE ("EXTERNAL_FILE_DESCRIPTION", 8,nam_f_sub_type)
文字,类似memo,而资料型态varchar限制32K
二位元资料(图片,影音档等)

 


1,2是我们常用的,其它的很少使用

generator(计数器)
计数器可以我们帮助产生循序的数字,你可以将其看成如一个公共变数,使用gen_id(generator名称,step)来取得一个值并加step
create generator my_gen 
num=gen_id(my_gen,1)

num
 问题
如果纯粹使用generator来填入,如果是uniqe或primary key,当generator最大值是2 64 (18446744073709551616)如果超过会重回到0
由于generator的最大值2 64 是很大数字要产生重复的机率很小

要不要使用日期来配合产生?
如果配合日期则会产生重复的机率会减少(发票,传票等)
年月日+流水号
20040303004
而generator 只要产生流水号,但是流水号每天都是从1开始,并且一般会限制数字的宽度如四位数或三位数
如此造成重复性会增加
目前资料库并无法处理这个问题,你必须自己设计一个表格来储存这个值,配合sql指令来取得最后的值
(建议:不要浪费时间在使用在资料库端的解决方法)
填入的栏位要字串或是数字?
如果是单独使用generator,最好是用数字的格式比较好
#注意:integer只有32位元
范例:
自动展示
create generator test_gen ;
CREATE TABLE test1 (serial_no char(3) not null primary key,name char(15));
建立触发来自动取得ID(new.栏位名称,这个变数是可以被sql指令时自动引用)
set term !!;
create trigger test for test1 active before insert  
as
begin
   new.serial_no=cast(gen_id(test_gen,1) as char(3));
end 
!!  
set term ; !!
#针对本身栏位变更方法:触发包含了三种sql指令及二种状态执行前/执行后
在insert的执行前,所有的插入到被触发的表格的栏位,你可以使用new.栏位名称来存取,只要变更该值就可以自动变更新增到表格中的栏位值
#在建立trigger 时由于trigger中的;(分号)会混淆结束符号,因此使用sql指令或在isql中新增trigger请变更其结尾符号,是set term 结尾符号,预设的结尾符号";" ,因此做完要复原set term ;!!
 

流水号
每日重置流水号
使用表格栏位来记录日期,检查若日期不同则写入新日期并将generator归零(set generator 名称to 0),但无法使用在储存函式中
在新增之前触发这个功能,比上述更简单(尚未测试)
create trigger test2 for test active before insert 
as 
declare variable temp_date date;
declare variable serial_no char(3);
begin
   if current_date==t_date then 
      #取得流水号 
      serial_no=cast(gen_id(generator名称,1) as char(3));
   else
      #将流水号置为0,使用相减
       =GEN_ID(My_Generator, -GEN_ID(My_Generator))
      #取得流水号
   endif   
end

 

 

#current_date
select current_date from rdb$database

储存函式或触发呼叫其它的储存函式
execute procedure 名称[(变数1,变数2....)] [RETURNING_VALUES [(变数1,变数2.....)]]
最简单的呼叫(不传值,也不传回值)直接执行EXECUTE PROCEDURE 名称

测试函式的执行或GENERATOR的结果
1.建立一个GENERATOR
CREATE GENERATOR TESTGEN
2.建立一个储存函式(只是将GENERATOR加一)
create procedure TEST 
as
DECLARE VARIABLE MY FLOAT;
BEGIN
MY=GEN_ID("TESTGEN",1);
END
3.直接执行命令
EXECUTE TEST 
4.查询GENERATOR是不是变为2

变数
函式中自己宣告的区域变数
1.直接引用-不需任何前置符号
2.用在sql语法中-必须前置:
记录使用者
CURRENT_USER 和CURRENT_ROLE
时间变数
current_time,current_date,current_timestamp

udf自定函式的内建函式
预设有内建函式放在在安装目录下的udf
中含有的函式资讯在fbudf.sql、ib_udf.sql,但真正函式是在fbudf.dll、ib_udf.dll
在firebird中使用者自定函式,和其它的sql-server有很大的不同
在firebird中udf一般是以c或c++写成函式,然后编译成为模组
1.windows- .dll档
2.linux - .so 档
再来将其放在安装目录的UDF目录下,一般会将其宣告档放在同一目录下,如果不是放在预设的目录下,你必须在firebird的环境档中设定,但是会有安全的问题.
如果你不会也不想写自定函式,但是想要用别人写好的函式
要使用宣告命令
declare external function 
其语法如下:
declare external function '名称'
传入的变数型态列表
returns 回传变数型态FREE_IT
entry_point '函式名称' '模组名称';
如果你不知道有那些函式可以使用,可以参考UDF目录下的.sql
以下是完整抄自ib_udf.sql
DECLARE EXTERNAL FUNCTION ltrim 
    CSTRING(255)
    RETURNS CSTRING(255) FREE_IT
    ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';
你必须在isql连线资料库完毕后执行上述的命令(或其它管理程式),则该函式就会随资料库可以被呼叫使用,
FREE_IT是在函式传回值之后清掉所配置的记忆体.
个人认为目前client所提供的函式远多于server端,因此除非必要否则尽量使用client端的函式
#ibeasy++不提供UDF的管理
#marthon提供

安全性(建立多个资料库备份档)
create shadow 
一旦使用上述命令则会建立一个同步的资料库在其它的储存设备上,这可以保障当资料库逻辑或实体的储存介面损坏时,有一个备份的资料库可以即时取代

重建索引
alter index 索引名称inactive 
alter index 索引名称active 
上述命令可以用在重建索引,或是资料库回存时想要加速其执行速度,不要回存时边回存边建立索引,先执行inactive则回存时索引会失去作用,等资料库回存完毕时再执行active的动作,则会重建索引,当然只有在没有人使用该资料库时才可以使用
posted @ 2011-01-05 16:39  网帆  阅读(1533)  评论(0编辑  收藏  举报