主網站:http://firebird.sourceforge.net/
預設安裝路徑
linux:/opt/firebird
aliases.conf -別名檔
friebird.log -記錄檔
SYSDBA.password -linux才有,管理者的名稱及密碼在裏面,windows則預設:名稱:sysdba,密碼:masterkey
windows直接使用security.fdb來存sysdba的密碼,
設定 firebird
主設定檔 firebird.conf
# 別名 = 原始路徑
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碼
用法:
gsec -user sysdba -password <password> [options]
遠端主機(資料庫server在別台電腦)
gsec -user sysdba -password <password> -database <databasename>
gsec命令
di[splay] | 顯示所有使用者 |
di[splay] <username> | 顯示某使用者 |
a[dd] <username> -pw <password> [options] | 新增使用者 |
mo[dify] <username> [options] | 修改使用者 |
de[lete] <username> | 刪除使用者 |
h[elp] | 求助 |
? | 同上 |
q[uit] | 離開gsec |
z | 顯示版本 |
options
-pa[ssword] <password> | 管理者的密碼 |
-user <username> | 使用者名稱 |
-pw <password> | 使用者密碼 |
-fname <first name> | 英文名字有,三個部份 |
-mname <middle name> | |
-lname <last name> |
範例
有兩種方式
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( a.b.c.d)使用tcp port 3050
gsec -user sysdba -password masterkey -database a.b.c.d/3050:"c:\program files\firebird\firebird_1_5\security.fdb -modiyf sysdba -pw londo
刪除本地使用者
gsec -user sysdba -password masterkey -delete joe
資料庫管理(console)
程式isql位於安裝目錄下的bin
以下是一個操作範例:
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
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>變為CON>,告訴你延續之前的命令
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);
每一個資料庫有一個特殊資料庫-系統資料庫,包含了使用者權限 等...
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)
程式支援兩種連線方式
2.使用tcpip連線,在路徑前加主機的名稱或IP : 主機:c:\abcd....
資料庫的安全(備份/回存)(console)
GBAK:命令列工具,命令有兩個狀態,備份/回存(-b / -c)
語法►選項 (中括號內的是非必要,也就是命令可以使用中括號前的縮寫,或是含中括號內為長參數)
參數 | 說明 | 功能 |
-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 -y c:\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>
資料型態
名稱 | 大 小 | 範 圍 /精度 | 描 述 |
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個 位元組。字元集決定了其能容納的最大字元數 |
generator(計數器)
計數器可以我們幫助產生循序的數字,你可以將其看成如一個公共變數,使用gen_id(generator名稱,step)來取得一個值並 加step
create generator my_gen
num=gen_id(my_gen,1)
則
num
問題
如果純粹使用generator來填入,如果是uniqe或primary key,當generator最大值是264(18446744073709551616) 如果超過會重回到0
由於generator的最大值264 是很大數字要產生重複的機率很小
要不要使用日期來配合產生?
如果配合日期則會產生重複的機率會減少(發票,傳票等)
年月日+流水號
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指令時自動引用)
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 ; !!
在insert的執行前,所有的插入到被觸發的表格的欄位,你可以使用 new.欄位名稱來存取,只要變更該值就可以自動變更新增到表格中的欄位值
#在建立trigger 時由於trigger中的;(分號)會混淆結束符號,因此使用sql指令或在isql中新增trigger請變更其結尾符號,是set term 結尾符號,預設的結尾符號";",因此做完要復原set term ;!!
流水號
每日重置流水號
使用表格欄位來記錄日期,檢查若日期不同則寫入新日期並將generator歸零(set generator 名稱 to 0),但無法使用在儲存函式中
在新增之前觸發這個功能,比上述更簡單(尚未測試)
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
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的動作,則會重建索引,當然只有在沒有人使用該資料庫時才可以使用
from http://csc.ocean-pioneer.com/docum/firebird/firebird.html#dba_back_rest