firebird database (快速入門)
參考文件(均可自firebird網站找到): Novice's Guide Migration from MS-SQL to firebird Firebord Release Notes
目錄索引
前言 它是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等...)
下載及安裝 主網站:http://firebird./ 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( 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 以下是一個操作範例: 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指令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>,告訴你延續之前的命令 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 ![]() 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> 是資料庫的名稱 選項 (中括號內的是非必要,也就是命令可以使用中括號前的縮寫,或是含中括號內為長參數)
範例: 正常的備份: 備份並記錄所有備份時的輸出訊息: 正常的回存: 回存到一個已存在的資料庫: 回存一個唯讀的資料庫: 當資料庫很大時,要備份有點困難,因此我們將資料庫備份成許多小的檔案,如此儲存時比較方便 備份語法: 注意: 不要指定最後一個檔案的大小.因我們不一定知道最後一個檔案需要多少空間來儲存,所以它將自動依據大小來儲存.至於其它檔案的大小可以是 bytes (8192), kilbytes (1024k), megabytes (5m), 或 gigabytes (2g) 回存語法: 回存到一個多個檔案的資料庫 有些系統的檔案系統有限制,或是為了效能的因素,因此單一資料庫,可分成多個小的資料庫gbak -c [options] <source file> <db file 1> <size 1> <db file 2> <size 2> ... <db file n> 注意:不要指定最後資料庫的大小.它可以無限制的依據回存的檔案來變更大小. 由備份多個檔案回存到多個檔案的資料庫: 資料庫安全(備份/ 回存)(gui) 選項 (Database | Save Database) 你可以簡單複製資料庫檔(如一般的指令copy) 但是無法確定資料庫的安全.
執行時必要參數:
![]() 執行這個操作,必須是這個資料庫的擁有者或是有執行管理系統的權限: SYSDBA.
#Blob blob sub_type segment 這是一個特有的資料型態,是用於儲存比較大量的資料,類似其它資料庫的text或是memo資料型態,在定義時有兩個附加參數是sub_type, segment sub_type是blob的資料類型,以下是它的types.h中的定義
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指令時自動引用) set term ; !! 在insert的執行前,所有的插入到被觸發的表格的欄位,你可以使用 new.欄位名稱來存取,只要變更該值就可以自動變更新增到表格中的欄位值 #在建立trigger 時由於trigger中的;(分號)會混淆結束符號,因此使用sql指令或在isql中新增trigger請變更其結尾符號,是set term 結尾符號,預設的結尾符號";",因此做完要復原set term ;!! 流水號 每日重置流水號 使用表格欄位來記錄日期,檢查若日期不同則寫入新日期並將generator歸零(set generator 名稱 to 0),但無法使用在儲存函式中 在新增之前觸發這個功能,比上述更簡單(尚未測試) create trigger test2 for test active before insert
#current_dateas 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的動作,則會重建索引,當然只有在沒有人使用該資料庫時才可以使用 |
|