Category Archives: Interbase
Seperti yang telah kita ketahui bersama, Interbase dengan dukungan fitur keamanan yang baru yaitu Embedded User Authentication (EUA) yang telah ada sejak Interbase versi 7.5, sebenarnya data kita sudah cukup aman.
Namun mungkin kita belum puas dan belum merasa aman dengan yang ada, berikut ini ada sedikit resep agar data kita lebih aman dan lebih kebal dari tangan orang-orang yang “mungkin” jahil/iseng.
Seperti yang kita ketahui juga sebuah object (table, procedure dll) , hanya dapat dibaca atau dijalankan oleh SYSDBA, user yang membuat atau user lain yang diberi hak, namun tidak ada batasan atau larangan bagi user lain untuk membuat object baru.
Pada “ramuan jamu” kali ini kita akan membuat agar data Interbase kita lebih aman diantaranya membatasi hanya SYSDBA yang dapat membuat object (table, procedure, trigger, view, ganerator dll)Â baru, hanya SYSDBA dan user yang bersangkutan yang dapat melihat daftar user.
Pada postingan sebelumnya telah dibahas cara untuk menghapus source code pada procedure, trigger atau view.
Pada kesempatan kali ini kita bukan menghapus source codenya namun kita akan menyembunyikan daftar procedurenya sehingga user tidak tahu ada procedure apa aja dalam database.
Rasanya untuk uraian gak perlu panjang lebar langsung saja ini resepnya …
/*-------------------------------------------------------------*
* STANDAR SECURITY FOR INTERBASE PROJECT *
* BY IMAM CHALIMI FEBRUARY, 2010 *
* Last Update January 22, 2013 *
* 29/10/2012 - Prevent Other user create/delete generator *
* 22/01/2012 - Add DATA field for users *
*-------------------------------------------------------------*/
/*--------------------------------------------------------------
* Revoke all access on system tables from PUBLIC
*--------------------------------------------------------------
*/
REVOKE ALL ON RDB$CHARACTER_SETS FROM PUBLIC;
REVOKE ALL ON RDB$COLLATIONS FROM PUBLIC;
REVOKE ALL ON RDB$CHECK_CONSTRAINTS FROM PUBLIC;
REVOKE ALL ON RDB$DATABASE FROM PUBLIC;
REVOKE ALL ON RDB$DEPENDENCIES FROM PUBLIC;
REVOKE ALL ON RDB$EXCEPTIONS FROM PUBLIC;
REVOKE ALL ON RDB$FIELD_DIMENSIONS FROM PUBLIC;
REVOKE ALL ON RDB$FIELDS FROM PUBLIC;
REVOKE ALL ON RDB$FILES FROM PUBLIC;
REVOKE ALL ON RDB$FILTERS FROM PUBLIC;
REVOKE ALL ON RDB$FORMATS FROM PUBLIC;
REVOKE ALL ON RDB$FUNCTION_ARGUMENTS FROM PUBLIC;
REVOKE ALL ON RDB$FUNCTIONS FROM PUBLIC;
REVOKE ALL ON RDB$GENERATORS FROM PUBLIC;
REVOKE ALL ON RDB$INDEX_SEGMENTS FROM PUBLIC;
REVOKE ALL ON RDB$INDICES FROM PUBLIC;
REVOKE ALL ON RDB$LOG_FILES FROM PUBLIC;
REVOKE ALL ON RDB$PAGES FROM PUBLIC;
REVOKE ALL ON RDB$PROCEDURE_PARAMETERS FROM PUBLIC;
REVOKE ALL ON RDB$PROCEDURES FROM PUBLIC;
REVOKE ALL ON RDB$REF_CONSTRAINTS FROM PUBLIC;
REVOKE ALL ON RDB$RELATION_CONSTRAINTS FROM PUBLIC;
REVOKE ALL ON RDB$RELATION_FIELDS FROM PUBLIC;
REVOKE ALL ON RDB$RELATIONS FROM PUBLIC;
REVOKE ALL ON RDB$ROLES FROM PUBLIC;
REVOKE ALL ON RDB$SECURITY_CLASSES FROM PUBLIC;
REVOKE ALL ON RDB$TRANSACTIONS FROM PUBLIC;
REVOKE ALL ON RDB$TRIGGER_MESSAGES FROM PUBLIC;
REVOKE ALL ON RDB$TRIGGERS FROM PUBLIC;
REVOKE ALL ON RDB$TYPES FROM PUBLIC;
REVOKE ALL ON RDB$USER_PRIVILEGES FROM PUBLIC;
REVOKE ALL ON RDB$USERS FROM PUBLIC;
REVOKE ALL ON RDB$VIEW_RELATIONS FROM PUBLIC;
/*--------------------------------------------------------------
* Read only access on many system tables from PUBLIC
*--------------------------------------------------------------
*/
GRANT SELECT ON RDB$DATABASE TO PUBLIC;
GRANT SELECT ON RDB$CHARACTER_SETS TO PUBLIC;
GRANT SELECT ON RDB$FIELD_DIMENSIONS TO PUBLIC;
GRANT SELECT ON RDB$FIELDS TO PUBLIC;
GRANT SELECT ON RDB$RELATION_FIELDS TO PUBLIC;
GRANT SELECT ON RDB$RELATIONS TO PUBLIC;
GRANT SELECT ON RDB$USER_PRIVILEGES TO PUBLIC;
GRANT SELECT ON RDB$PROCEDURE_PARAMETERS TO PUBLIC;
GRANT SELECT ON RDB$FILES TO PUBLIC;
GRANT SELECT ON RDB$LOG_FILES TO PUBLIC;
/* Required by IB-Expert */
GRANT SELECT ON RDB$DEPENDENCIES TO PUBLIC;
GRANT SELECT ON RDB$COLLATIONS TO PUBLIC;
GRANT SELECT ON RDB$INDEX_SEGMENTS TO PUBLIC;
GRANT SELECT ON RDB$RELATION_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON RDB$INDICES TO PUBLIC;
GRANT SELECT ON RDB$REF_CONSTRAINTS TO PUBLIC;
/*--------------------------------------------------------------
* Allow Access on Temporary Table to Public
*--------------------------------------------------------------
*/
GRANT SELECT ON TMP$DATABASE TO PUBLIC;
GRANT SELECT ON TMP$ATTACHMENTS TO PUBLIC;
/*--------------------------------------------------------------
* Prevent public user to create new object
*--------------------------------------------------------------
*/
CREATE EXCEPTION EX_SYSDBA_ONLY 'Only SYSDBA can create/delete object';
SET TERM ^ ;
CREATE TRIGGER RDB$DATABASE_BU FOR RDB$DATABASE
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
IF (USER<>'SYSDBA') THEN
EXCEPTION EX_SYSDBA_ONLY;
END
^
CREATE TRIGGER RDB$PROCEDURES_BI FOR RDB$PROCEDURES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (USER<>'SYSDBA') THEN
EXCEPTION EX_SYSDBA_ONLY;
END
^
CREATE TRIGGER RDB$TRIGGERS_BI FOR RDB$TRIGGERS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (USER<>'SYSDBA') THEN
EXCEPTION EX_SYSDBA_ONLY;
END
^
CREATE TRIGGER RDB$GENERATORS_BD FOR RDB$GENERATORS
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
IF (USER<>'SYSDBA') THEN
EXCEPTION EX_SYSDBA_ONLY;
END
^
CREATE TRIGGER RDB$GENERATORS_BI FOR RDB$GENERATORS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (USER<>'SYSDBA') THEN
EXCEPTION EX_SYSDBA_ONLY;
END
^
SET TERM ; ^
ALTER TABLE RDB$USERS
ADD DATA BLOB SUB_TYPE 1 SEGMENT SIZE 80;
CREATE VIEW RDB$VW_USERS
AS
SELECT *
FROM RDB$USERS
WHERE
USER='SYSDBA' OR
USER=RDB$USER_NAME;
GRANT SELECT ON RDB$VW_USERS TO PUBLIC;
GRANT UPDATE(RDB$FIRST_NAME,RDB$MIDDLE_NAME,RDB$LAST_NAME,DATA) ON RDB$VW_USERS TO PUBLIC;
COMMIT;
/* ---- */
Script SQLnya dapat didownload di https://www.box.com/s/0dxp1pf9ficxxf2rm5x6
Catatan:
Resep ini hanya (lebih) cocok untuk Interbase dengan fitur Embedded User Authentication (EUA) Â diaktifkan
Seperti diketahui bersama banyak sekali vcl untuk koneksi data Interbase menggunakan Delphi, salah satunya dan yang kaya fitur adalah FIBPlus, sayangnya FIBplus ini berbayar.
Pada kesempatan kali ini kita akan mencoba mengoptimalkan VCL IBX (IBExpress) dengan pertimbangan IBX ini adalah VCL bawaan Delphi.
Kita akan mencoba memasukkan beberapa fitur yang ada di FIBPlus kedalam IBX.
Beberapa fitur yang akan kita tambahkan diantaranya :
- Auto Commit .. Commit otomatis setelah Post
- Simple Query .. Query sederhana tanpa komponen
- GetServerTime .. Membaca jam pada server
- Gen_ID Â .. Mengambil nilai generator (Auto Number)
- Default Value .. Nilai default akan terisi otomatis
- Numeric Format .. Field Numeric akan ditampilkan berformat
- Show Memo Text .. Text asli akan ditampilkan di Field Memo
- Konfirmasi penghapusan (pada Actionlist)
Langsung saja ini source kodenya ..
unit IBXPlus;
(*
Advanced IBExpress by Imam Chalimi
First Release November 11, 2012
Last Update November 24, 2012
Feature :
- Delete Confirmation (ActionList)
- Simple Query
- Gen_ID
- GetServerTime
- AutoCommit
- AutoFill Default Value
- AutoFormat Numeric Field
- Show Memo Text
*)
interface
uses Windows, IBCustomDataSet, IBDataBase, DB, SysUtils,
Classes, Variants, DBActns, Forms, VsrWindows;
type
TDataSetDelete = class(DBActns.TDataSetDelete)
public
procedure ExecuteTarget(Target: TObject); override;
end;
TIBDataBase = class(IBDataBase.TIBDataBase)
public
function QueryValue(sSQL:string;sParam:array of Variant):Variant;
function QueryValues(sSQL:string;sParam:array of Variant):Variant;
function Gen_ID(sGenID:string;iStep:Int64):Int64;
function Execute(sSQL:string;sParam:array of Variant):Boolean;
function GetServerTime:TDateTime;
end;
TIBDataSet = class(IBCustomDataSet.TIBDataSet)
private
procedure InternalCommit;
public
procedure AutoGenerateSQLs;
published
procedure DoAfterPost; override;
procedure DoOnNewRecord; override;
procedure DoAfterDelete; override;
procedure DoAfterOpen; override;
end;
TIBBCDField = class(IBCustomDataSet.TIBBCDField)
public
constructor Create(AOwner: TComponent); override;
end;
TMemoField = class(DB.TMemoField)
procedure GetText(var Text: string;
DisplayText: Boolean); override;
end;
{Global Variable}
var
IBX_AutoComit,
IBX_ShowID,
IBX_ShowBlob,
IBX_DefaultValue: Boolean;
implementation
{ TIBDataSet }
procedure TIBDataSet.AutoGenerateSQLs;
begin
(*
== Menyusul ... ==
*)
// InsertSQL.Text:='';
// DeleteSQL.Text:='';
// ModifySQL.Text:='';
// RefreshSQL.Text:='';
end;
procedure TIBDataSet.DoAfterDelete;
begin
inherited;
InternalCommit;
end;
procedure TIBDataSet.DoAfterOpen;
var
i: Integer;
begin
inherited;
for i:=0 to Fields.Count-1 do
with Fields[i] do
case DataType of
ftInteger: if ((FieldName='ID') or
(Copy(FieldName,Length(FieldName)-3,3)='_ID')) then
begin
DisplayWidth:=5;
if FieldName='ID' then
ReadOnly:=True;
Visible:=IBX_ShowID;
end;
ftBlob: Visible:=IBX_ShowBlob;
ftDate: EditMask:='99/99/9999';
end;
end;
procedure TIBDataSet.DoAfterPost;
begin
inherited;
InternalCommit;
end;
procedure TIBDataSet.DoOnNewRecord;
var
i: Integer;
s: string;
begin
if IBX_DefaultValue then
for i:=0 to FieldCount-1 do
begin
s:='SELECT F.RDB$DEFAULT_SOURCE ' +
'FROM RDB$RELATION_FIELDS F ' +
'WHERE F.RDB$RELATION_NAME=:X ' +
'AND F.RDB$FIELD_NAME=:Y ' +
'AND F.RDB$DEFAULT_SOURCE STARTING WITH ''DEFAULT''';
s:=TIBDataBase(Database).
QueryValue(s,[PSGetTableName,Fields[i].FieldName]);
System.Delete(s,1,8);
s:='SELECT '+Trim(s)+' FROM RDB$DATABASE';
try
Fields[i].Value:=TIBDataBase(Database).QueryValue(s,[]);
except
end;
end;
inherited;
end;
procedure TIBDataSet.InternalCommit;
begin
if IBX_AutoComit and
(Tag<>999) then
Transaction.CommitRetaining;
end;
{ TIBBCDField }
constructor TIBBCDField.Create(AOwner: TComponent);
begin
inherited;
DisplayFormat:='#,##0.00';
end;
{ TIBDataBase }
function TIBDataBase.Execute(sSQL: string; sParam: array of Variant): Boolean;
var
i: Integer;
begin
with TIBDataSet.Create(nil) do
begin
Database:=Self;
SelectSQL.Text:=sSQL;
Prepare;
if Length(sParam)>0 then
begin
for i:=0 to Length(sParam)-1 do
Params[i].Value:=sParam[i];
Prepare;
end;
ExecSQL;
InternalCommit;
Free;
end;
end;
function TIBDataBase.Gen_ID(sGenID: string; iStep: Int64): Int64;
begin
with TIBDataSet.Create(nil) do
begin
Database:=Self;
SelectSQL.Text:=Format('SELECT GEN_ID(%s,%d) ' +
'FROM RDB$DATABASE',[sGenID,iStep]);
Open;
Result:=Fields[0].AsInteger;
Close;
Free;
end;
end;
function TIBDataBase.QueryValue(sSQL: string;sParam:array of Variant): Variant;
var
i: Integer;
begin
with TIBDataSet.Create(nil) do
begin
Database:=Self;
SelectSQL.Text:=sSQL;
if Length(sParam)>0 then
begin
for i:=0 to Length(sParam)-1 do
Params[i].Value:=sParam[i];
Prepare;
end;
Open;
Result:=Fields[0].Value;
Close;
Free;
end;
end;
function TIBDataBase.QueryValues(sSQL: string;
sParam: array of Variant): Variant;
var
i: Integer;
begin
with TIBDataSet.Create(nil) do
begin
Database:=Self;
SelectSQL.Text:=sSQL;
if Length(sParam)>0 then
begin
for i:=0 to Length(sParam)-1 do
Params[i].Value:=sParam[i];
Prepare;
end;
Open;
Result:=VarArrayCreate([0,FieldCount-1],varVariant);
for i:=0 to Fields.Count-1 do
Result[i]:=Fields[i].Value;
Close;
Free;
end;
end;
function TIBDataBase.GetServerTime: TDateTime;
begin
with TIBDataSet.Create(nil) do
begin
Database:=Self;
SelectSQL.Text:='SELECT CURRENT_TIMESTAMP ' +
'FROM RDB$DATABASE';
Open;
Result:=Fields[0].AsDateTime;
Close;
Free;
end;
end;
{ TDataSetDelete }
procedure TDataSetDelete.ExecuteTarget(Target: TObject);
begin
if MessageBox(Application.Handle,'Yakin Dihapus ?','Konfirmasi',MB_YESNO)=IDYES then
inherited;
end;
{ TMemoField }
procedure TMemoField.GetText(var Text: string; DisplayText: Boolean);
begin
Text:=GetAsString;
end;
initialization
IBX_AutoComit:=True;
IBX_ShowID:=False;
IBX_ShowBlob:=False;
IBX_DefaultValue:=False;
end.
Untuk menggunakan unit ini cukup mudah, tambahkan IBXPlus pada klausa uses.
Yang perlu diperhatikan penulisan IBXPlus pada klausa uses harus diletakkan paling belakang atau setelah unit uses IBxxxx.
contoh:
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids,
DB, IBCustomDataSet, IBDatabase, IBXPlus;
Unit yang sudah siap pakai (khusus delphi 7 dan Delphi 2006/Turbo Delphi) dapat di download di:
Semoga bermanfaat
Procedure dan trigger sangat membantu sekali dalam melakukan optimasi pada database sehingga penggunakan query yang rumit dapat dikurangi dan tentunya akan meningkatkan performa.
Namun ada kalanya dalam sebuah procedure atau trigger kita menggunakan “resep rahasia” yang tidak boleh diketahui oleh orang lain.
Pada saat membuat procedure/trigger Interbase melakukan kompilasi dari source code yang kita buat menjadi sebuah binary code atau yang disebut BLR (Binary Language Representation), disisi lain akan mencadangkan source code aslinya untuk memudahkan bila kita ingin memodifikasi di kemudian hari.
Cara mengamankan supaya tidak dapat dilihat orang lain yaitu dengan menghapus source codenya.
Apakah dengan menghapus source codenya tidak berpengaruh pada database ? Tidak, Source code tidak dibutuhkan oleh Interbase, Interbase hanya membutuhkan code yang telah dikomplasi (BLR).
OK, langsung saja …
Sebelum melakukan hal ini ada baiknya membuat backup dalam bentuk metadata atau textfile agar bila suatu saat ingin mengedit procedure tidak kesulitan.
Untuk menghapus source code dari procedure …
UPDATE RDB$PROCEDURES
SET RDB$PROCEDURE_SOURCE = NULL
bila hanya ingin menghapus source code dari procedure tertentu bisa ditambahkan
WHERE RDB$PROCEDURE_NAME = 'blablabla';
Sedangkan untuk menghapus source code dari trigger …
UPDATE RDB$TRIGGERS
SET RDB$TRIGGER_SOURCE=NULL
WHERE UPPER(RDB$TRIGGER_SOURCE) STARTING WITH 'AS'
bila hanya ingin menghapus source code dari trigger tertentu bisa ditambahkan
AND RDB$TRIGGER_NAME = 'blablabla';
Semoga bermanfaat
Bagaimana caranya agar Firebird Server dapat jalan berdampingan dengan Interbase Server dalam satu komputer.
Tulisan berikut ini mungkin bisa  menjadi sebuah solusi bagi yang ingin mencoba Interbase namun belum bisa meninggalkan Firebird.
Seperti kita ketahui bersama Firebird dan Interbase secara default menggunakan alamat port (3050) dan nama library yang sama (gds32.dll).
Untuk alamat port  sebenarnya baik Interbase maupun Firebird sama2 bisa dirubah, namun karena tujuan akhir adalah menggunakan Interbase maka yang kita bahas dalam tulisan berikut ini adalah mengganti port firebird menjadi 3051 dan mengembalikan nama library firebird menjadi nama dia sendiri yaitu fbclient.dll (optional, bisa juga tidak dirubah tapi nantinya gds32 punya firebird harus dicopykan jadi satu folder dengan client aplikasi yang menggunakan firebird).
Ada sedikit perubahan untuk mengakses database firebird dari sisi client, jika sebelumnya data diakses menggunakan alamat 192.168.0.1:c:\data.fb\dataku.fdb maka untuk selanjutnya dipanggil dengan menggunakan 192.168.0.1/3051:c:\data.fb\dataku.fdb
kita mulai sajalah, cuman perlu beberapa langkah …
- buka file firebird.conf (ada di folder tempat firebird diinstall) dengan menggunakan notepad.
- cari baris #RemoteServicePort = 3050 (bisa gunakan Ctrl+F)
- buang tanda # dan rubah angka 3050 menjadi 3051
- sehingga setelah dirubah akan menjadi RemoteServicePort = 3051
- rubah file gds32.dll yang ada di windowssystem32 menjadi fbclient.dll
- Restart Firebird server atau sekalian restart komputernya jika kesulitan
- Install Interbase Server
Sekarang kita dapat menggunakan Interbase Server dan Firebird server dalam satu komputer.
Beberapa komponen koneksi vcl seperti FIBPlus/DBExpress memang memperbolehkan kita mendefinisikan client library yang berbeda, namun pada konenksi vcl seperti IBExpress dan Zeos kita tidak dapat merubahnya, kita dipaksa untuk menggunakan library standar yaitu gds32.dll.
Bila kita menggunakan vcl yang tidak mengijinkan client librarynya dirubah atau kita tidak mau compile ulang project Firebird yang sudah jadi solusinya adalah dengan mengcopy gds32.dll punya Firebird ke folder tempat projectnya berada, begitu juga dengan Project Interbase juga dicopykan gds32.dll punya Intebase ke folder tempat projectnya berada.
Jadi nantinya pemanggilan database dengan cara seperti ini …
192.168.0.1:c:\data.ib\dataku.ib => Interbase
 192.168.0.1/3051:c:\data.fb\dataku.fdb => Firebird
Online Dump atau Incremental backup merupakan salah satu variant backup dalam Interbase.
Yang membedakan dengan backup biasa adalah, pada Online Dump backupnya bisa nyambung tidak selalu dimulai dari awal, ini sangat berguna untuk data yang besar tapi harus sering backup.
Selain bisa nyambung hasil dari Online Dump bisa langsung dipakai hanya dengan merubah attributnya, tanpa harus ada proses restore yang memakan waktu lama.
Sebenarnya Interbase sudah menyediakan tool untuk melakukan Online Backup ini yaitu dengan commandline
gbak.exe -d 127.0.0.1:DATA_AKTIF d:\backupdata_aktif.dump -user SYSDBA -pass masterkey
Pada Delphi kita bisa langsung memanggil commandline diatas menggunakan WinExec, ShellExecute atau Create prosess.
Namun yang kita bahas kali ini adalah menjalankan Online menggunakan Interbase API, menggunakan Delphi tanpa bantuan VCL apapun.
Sebenarnya fitur ini sudah include di VCL IBExpress versi 10.11 keatas (VCL bawaan delphi yang dibundling dengan Interbase 2007), Â tapi gpplah itung belajar.
Dengan menggunakan API hasilnya akan lebih “bersih” karena user/password bisa diencrypt, tidak seperti menjalankan commandline yang parameternya masih bisa “di-intip” menggunakan software sejenis Proccess Explorer.
Untuk melakukan  Online dump kita menggunakan fungsi isc_attach_database yang ada di library gds32.dll.
Dalam melakukan pemanggilan Interbase API, sebelumnya kita perlu mengirimkan parameter dalam format block, dikirim berurutan dalam bentuk character/string.
Untuk Online Dump, parameter block yang dikirim sbb:
#01 1/isc_dpb_version1 sebagai tanda awal parameter block
#1C 28/isc_dpb_user_name sebagai tanda akan mengirim user
#06 6 adalah panjang user
'sysdba' nama user
#1D 29/isc_dpb_password sebagai tanda akan mengirim password
#09 9 adalah panjang password
'masterkey' ini passwordnya
#21 33/isc_dpb_online_dump proses yang akan dikerjakan
#01 panjang perintah = 1
#01 (1) nilainya selalu 1
#36 54/isc_dpb_overwrite disambung/ditindih
#01 panjang perintah = 1
#00 (0) diisi 0 untuk menyambung atau 1 untuk menindih
#24 36/isc_dpb_old_file_name sebagai tanda akan mengirim nama file tujuan backup
#0E 14 panjang nama file
'c:barang.dump' ini nama filenya
#22 34/isc_dpb_old_file_size jumlah filenya
#01 panjang perintah = 1
#01 diisi 1
Untuk lebih jelasnya dapat dilihat pada contoh coding berikut
program VsrOnLineDump;
uses
Windows;
const
ISC_SPB_CURRENT_VERSION = #2;
ISC_SPB_VERSION = #2;
ISC_SPB_USER_NAME = #28;
ISC_SPB_PASSWORD = #29;
ISC_DPB_VERSION1 = #1;
ISC_DPB_USER_NAME = ISC_SPB_USER_NAME;
ISC_DPB_PASSWORD = ISC_SPB_PASSWORD;
ISC_DPB_ONLINE_DUMP = #33;
ISC_DPB_OLD_FILE_SIZE = #34;
ISC_DPB_OLD_FILE_NAME = #36;
ISC_DPB_OVERWRITE = #54;
DLL = 'gds32.dll';
type
ISC_HANDLE = HWND;
TISC_DB_HANDLE = ^ISC_HANDLE;
ISC_STATUS = Longint;
PISC_STATUS = ^ISC_STATUS;
PISC_DB_HANDLE = ^TISC_DB_HANDLE;
var
FDPB: string;
FDBHandle: TISC_DB_HANDLE;
FStatus: PISC_STATUS;
FDBName, FTargetDB, FUser, FPass: string;
bOverwrite: Boolean;
function AddDPB(cKey: char; sItem: string): Integer;
begin
if sItem='' then
FDPB:=FDPB+cKey
else
FDPB:=FDPB+cKey+chr(Length(sItem))+sItem;
Result:=Length(FDPB);
end;
function isc_attach_database(status_vector:PISC_STATUS;
db_name_length:Short;
db_name:PChar;
db_handle:PISC_DB_HANDLE;
parm_buffer_length: Short;
parm_buffer:PChar):ISC_STATUS;
stdcall;external DLL;
begin
FDBName:='127.0.0.1:DATA_AKTIF';
FTargetDB:='d:\backupdata_aktif.dump';
FUser:='SYSDBA';
FPass:='masterkey';
bOverwrite:=False;
FDPB:=ISC_DPB_VERSION1;
AddDPB(ISC_DPB_USER_NAME,FUser);
AddDPB(ISC_DPB_PASSWORD,FPass);
FDBHandle:=nil;
AddDPB(ISC_DPB_ONLINE_DUMP,#1);
AddDPB(ISC_DPB_OVERWRITE,chr(Byte(bOverwrite)));
AddDPB(ISC_DPB_OLD_FILE_NAME,FTargetDB);
AddDPB(ISC_DPB_OLD_FILE_SIZE,#1);
if isc_attach_database(@FStatus,
0,PChar(FDBName), @FDBHandle,
Length(FDPB),PChar(FDPB))=0 then
// MessageBox jika diperlukan
;
end.
Dengan membuat coding sendiri menggunakan delphi kita dapat dengan leluasa mengatur jadwal Online Dump, misalnya kita buat per 10 menit, per 30 menit, dibuat perhari dibackup dengan tujuan beda-beda (ada 7 file tujuan sesuai dengan jumlah hari).
Selain itu dengan membuat coding sendiri akan sedikit lebih keren dan punya nilai sendri dimata pengguna (klien).
Dalam sebuah aplikasi database, keamanan dan duplikasi data merupakan sebuah kebutuhan pokok yang tidak bisa dianggap remeh.
Percuma ada aplikasi bagus tapi tidak ada jaminan keamanan, baik aman dari pencurian data atau hilang karena rusak.
1. Sekuritas pemakai (*)
Pada interbase daftar user dan hak akses user dapat di atur dengan menggunakan pola terpusat di server (seperti mysql) atau embeded pada masing-masing database (seperti access, paradox), tentunya ini mempunyai kelebihan dan kekurangan masing-masing.
Dengan menggunakan user terpusat, lebih mudah bila banyak user yang mengakses beberapa database, sehingga bila ingin menambah, menghapus, ganti password, cukup satu untuk semua.
Kekurangan/kelemahannya bila data tersebut dicuri orang, maka orang tersebut tinggal install server dengan user default, maka data tersebut dapat dibuka. Dengan menggunakan sekuritas menyatu dengan database (embed), data akan tetap aman seandainya dicuri orang selama sang pencuri tersebut tidak tahu master passwordnya (SYSDBA), si pencuri masih harus putar otak kalo tidak tahu user/passwordnya.
Dengan menggunakan embeded user kita bisa set password beda untuk tiap aplikasi walaupun nama usenya sama.
Lebih detail baca disini
2. Backup / Restore
Backup & Restore fungsinya untuk menyimpan data, biasanya dalam format compressed, yang mana bisa digunakan kembali bila ada kelihangan data.
Untuk melakukan backup/restore pada interbase bisa menggunakan commandline tool (gbak), atau menggunakan vcl (ibx/fibplus), atau bisa juga menggunakan API coding.
contoh Backup Interbase menggunakan tool gbak …
C:\DATA>GBAK -v DATA.IB DATA.IBK -user sysdba -pass masterkey
gbak: readied database DATA.IB for backup
gbak: creating file DATA.IBK
gbak: starting transaction
gbak: database DATA.IB has a page size of 4096 bytes.
gbak: writing domains
gbak: writing domain RDB$1
gbak: writing domain RDB$2
gbak: writing domain RDB$3
gbak: writing domain RDB$4
gbak: writing domain RDB$5
gbak: writing shadow files
........
gbak: writing privilege for user PUBLIC
gbak: writing privilege for user SYSDBA
gbak: writing privilege for user SYSDBA
gbak: writing table constraints
gbak: writing constraint INTEG_1
gbak: writing constraint PK_BIODATA
gbak: writing referential constraints
gbak: writing check constraints
gbak: writing SQL roles
gbak: writing users
gbak: writing user SYSDBA
gbak: closing file, committing and finishing. 15872 bytes written
C:\DATA>
contoh code Backup Interbase menggunakan komponen IBX …
uses IBServices;
procedure TForm1.Button1Click(Sender: TObject);
var
bak: TIBBackupService;
begin
Memo1.Clear;
bak:=TIBBackupService.Create(Self);
bak.DatabaseName:='c:\data\DATA.IB';
bak.BackupFile.Text:='c:\data\DATA.IBK';
bak.Params.Values['user_name']:='sysdba';
bak.Params.Values['password']:='masterkey';
bak.LoginPrompt:=False;
bak.Verbose:=True;
bak.Attach;
bak.ServiceStart;
while not bak.Eof do
Memo1.Lines.Add(bak.GetNextLine);
bak.Detach;
bak.Free;
end;
3. Online dump (sequential backup)
Online dump mirip dengan backup namun hasilnya tetap dalam format database (readonly) dan sifatnya menambah untuk proses berikutnya, bukan overwrite, sehingga prosesnya lebih cepat bila kita lakukan lebih sering (mirip fitur resume – kalo kita download file di internet).
Contoh Online Dump menggunakan tool gbak …
C:\DATA>gbak -d DATA.IB DATA_DUMP.IB -user sysdba -pass masterkey
gbak: WARNING: Dumped 196 pages of a total 196 database pages
gbak: WARNING: Dumped 0 pages to page appendix file
4. Shadow
Shadow adalah proses cloning database secara realtime (1:1), seperti teknologi RAID pada komputer server. kita bisa membuat shadow sebanyak mungkin.
Contoh membuat Shadow …
CREATE SHADOW 1 MANUAL 'D:\DATA_SHADOW_01';
CREATE SHADOW 2 MANUAL 'E:\DATA_SHADOW_02';
CREATE SHADOW 3 MANUAL 'F:\DATA_SHADOW_03';
5. Journaling (*)
Journaling fungsinya mirip dengan shadow namun menjadi potongan-potongan file kecil yang dapat kita set check pointnya, ini berguna bila ada suatu masalah kita bisa mundur beberapa langkah sesuai cek poin (mirip fitur system restore pada windows), kegunaan lain jika kita ingin membuat duplikasi database di lokasi lain jauh (kita file kirim potongan2 file kecil tadi via email/ftp) untuk di satukan kembali di tempat tujuan.
6.Replikasi (**)
Replikasi merupakan proses sinkronisasi antar database (bisa beda table/field dll), baik secara satu arah, dua arah atau banyak arah. yang sangat berguna untuk sinkronisasi data di beberapa server yang berjauhan dengan koneksi internet pas-pasan.
Inti dari Replikasi/sinkronisasi adalah membuat catatan/logging setiap aktifitas table2 terntentu dalam database kedalam sebuah table log, kemudian secara terjadwal memproses log tersebut kepada database lain.
Untuk menjamin akurasi data dalam proses Replikasi/sinkronisasi  ini membutuhkan fitur Transaction dan Two Phase Commit yang sepenuhnya di dukung Interbase.
Untuk menikmati fitur ini dapat menggunakan tool pihak ketiga yang siap pakai(seperti IbReplicator), atau kita bisa membuat sendiri dengan menggunakan vcl ibx/fibplus, dengan menerapkan fitur Transaction dan Two Phase Commit .
Catatan:
Fitur 1-5 adalah fitur standar/bawaan Interbase
tanda * (Fitur 1 & 5) merupakan fitur interbase yang sejauh saya tahu belum ada di saudara angkatnya (Fi** B** sampai versi saat ini 2.5)
tanda ** (Fitur 6) membutuhkan 3 party tool, namun kita juga bisa bikin sendiri
Yang aku suka dari Interbase …
(Ini hanya pengalaman pribadi menggunakan Interbase, bukan berarti database lain tidak bisa melakukan hal yg sama … CMIIW)
1. Footprint kecil, mudah instalasi
+/- 2MB untuk Server, +/- 500KB untuk client
2. Dual mode user security .. interbase 7.5 keatas
User bisa di server (seperti kebanyakan db client server)
User bisa embedded di database, sehingga mudah kalo misalnya hrs install ulang server, juga aman dan mudah pengaturannya karena tidak campur dengan user database lain, beda database bisa mempunyai nama user sama dengan password dan kewenangan berbeda.
3. User define function
Kita bisa dengan leluasa membuat fungsi sendiri menggunakan delphi untuk membuat fungsi2 sql yg tidak disediakan secara bulitin
4. Shadow
Kita bisa membuat realtime duplicate database pada folder/drive/harddisk lain dalam satu komputer, seperti teknologi RAID, misalnya tiba2 harddisk jebol/gak kebaca, kita tinggal install convert shadow ke main database. Jumlah shadow tidak dibatasi, dan proses shadow atau duplikasi berjalan otomatis tanpa perlu program lain seperti scheduller dll.
5. Journaling … interbase 2007 keatas
Realtime logging yg bermanfaat untuk point to point recovery (mirip system restore windows), kita bisa rollback ke cek point yg tersedia, berguna kalo misalnya karena gak sengaja atau ada sabotase yang merubah atau menghapus data (seharusnya tidak terjadi kalo pengaman point (2) sudah bagus).
6. Online dump / Incremental backup … interbase 2007 keatas
Kita bisa membuat backup secara incremental berdasarkan jadwal
misalnya per 10 menit, per 1 jam, per 1 hari, dsb
artinya mengupdate backup yang ada bukan overwrite sehingga proses backup lebih cepat.
“Proses backup bisa dilakukan walaupun database sedang dipakai”
7. Konsumsi memory untuk alokasi pemakaian database bisa kita atur
Misalnya memory server 4GB kita bisa alokasikan untuk database max 1GB
sehingga jika database kita kurang dari 1GB, pada saat query server akan membaca data yg dimemory bukan di disk sehingga proses lebih cepat.
8. Event alert
kita bisa mengirim pesan ke seluruh client/atau client yang diinginkan, pesan bisa juga di picu oleh trigger/prosedur, tidak perlu menggunakan timer yg secara berkala membaca database
contoh pemakaian :
Misalnya kita ingin pada saat stock untuk barang tertentu, dibawah limit akan ada pesan untuk komputer client bagian pembelian.
Misalnya kita ingin ada pemberitahuan ke komputer manajer mana kala ada entry yang perlu diotorisasi.
9. Posisi data bisa diletakkan di folder/drive mana saja asal dalam komputer server,
data tidak perlu disharing, hak akses bisa diset hanya “SYSTEM”, sehingga aman dari virus atau di otak-atik orang yang tidak bertanggungjawab.
Untuk pengamanan maksimum kita bisa menaruh data di harddisk/partisi tertentu dengan mengeset security hanya bisa dibaca SYSTEM dan user kita, sementara user lain termasuk Administrator dibuang, firewall juga ditutup, hanya port tertentu (termasuk port interbase 3050) yang dibuka.
10. Perubahan metadata, misalnya penambahan field, atau memperbesar ukuran field, kecuali menghapus field bisa dilakukan sekalipun data sedang dipakai.
Ini akan membantu sekali bila dipakai di klien yg super sibuk, tidak memungkinkan untuk off saat kita mau update database.
11. Spanning data
Misalnya kita mempunyai HDD 60GB, awal penggunaan data masih kecil sehingga HDD 60GB lebih dari cukup, lama2 data berkembang sehingga HDD 60GB tidak mencukupi lagi.
Biasanya bila mengalami hal itu kita ganti hdd yg lebih besar, kita copy database ke HDD yang baru, ini akan membutuhkan waktu yg lama bila datanya cukup besar.
Dengan interbase kita bisa menambahkan HDD baru tanpa membuang HDD lama, kita cukup mengconfigurasi agar data dilanjutkan di HDD baru bila ukuran data sudah mencapai batas yang kita tentukan (bisa menghemat waktu dan biaya).
12. Mendukung replikasi/sinkronisasi data (membutuhkan 3 party tool seperti IBReplicator)
Misalnya gini ada kantor pusat ,9 kantor cabang, dan 1 server backup (semua beda lokasi)
Server pusat berisi data pusat plus seluruh data cabang
Server cabang hanya berisi cabang yang bersangkutan
Server backup berisi 100% identik dengan server pusat
Dengan Interbase+IBReplicator kita bisa dengan mudah melakukan sinkronisasi data secara berkala (mungkin tiap 5-30 menit, tergantung kecepatan koneksi yg dipakai).
Dengan fitur Two Phase Commit, maka akurasi data akan tetap terjamin walaupun misalnya ada ganguan koneksi (putus).
Sinkronisasi data menggunakan table logging sehingga proses sinkronisasi dapat berjalan dengan cepat karena berdasar pada table logging (yg diisi oleh trigger), tidak perlu membandingkan database/table record demi record.
Segala perubahan insert, update, delete otomatis akan di sinkronisasi
Sinkronisasi bisa berlaku 2 arah, perubahan pusat update ke cabang dan sebaliknya.
13. Global temporary table (GTT)
Global temporary table merupakan sebuah table yang dipakai bersama2 namun isinya hanya dapat dilihat oleh sesion yg aktif, tidak dapat dilihat user lain walaupun dalam satu komputer dan login menggunakan user yang sama.
Saya biasanya menggunakan Global temporary table ini untuk menyimpan parameter seperti periode laporan dll, bermanfaat untuk aplikasi yang menggunakan periodik seperti program accounting.
contoh :
misalnya saya bikin GTT dengan nama session yg mempunyai field tgl_awal dan tgl_akhir
setelah login, atau setelah memilih periode aktif ..
insert into session(tgl_awal,tgl_akhir) values ('01.07.2012','31.07.2012');
nanti querynya tinggal ..
select t.id,t.tgl,t.kode,.....
from trans t
left join session s on (t.tgl between s.tgl_awal and s.tgl_akhir)
lebih mudah kalo di bikin view misalnya dengan nama vw_trans_aktif
jadi manggil di delphinya tinggal select * from vw_trans aktif gak perlu memasukkan parameter setiap kali query
…. dan masih banyak lagi ….
Embedded User Authentication merupakan fitur yang ada sejak Interbase 7.5, yaitu management user yang dikemas menyatu dalam database.
Pada Interbase versi sebelumnya atau pada saudara sepupunya Firebird (setidaknya sampai versi 2.5 saat dokumen ini ditulis), management user masih menempel di Interbase Server.
Sejak Interbase versi 7.5 keatas kita diberi keleluasaan untuk memilih apakah management usernya tetap nempel di Server atau menyatu di database.
Dengan menggunakan Embedded User Authentication akan diperoleh beberapa kelebihan diantaranya:
Data akan tetap aman seandainya dicuri orang selama sang pencuri tersebut tidak tahu master passwordnya (SYSDBA), berbeda jika user nempel di Server, dengan install ulang server berarti master password akan kembali ke default.
Tidak perlu kerjaan tambahan untuk mengatur ulang daftar user jika suatu ketika server jebol dan harus install ulang
Kita dapat mengeset orang dengan login yang sama namun dengan password yang berbeda untuk aplikasi/database yang berbeda pada server yang sama.
Untuk membuat database yang support Embedded User Authentication cukup dengan menambahkan klausa “with admin option”
contoh membuat database dengan tool isql …
C:\>cd ib2007\bin
C:\ib2007\bin>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'c:\data_eua.ib' user 'sysdba' password 'masterkey' with admin option;
SQL> quit;
selanjutnya untuk menambahkan user …
C:\ib2007\bin>isql c:\DATA_EUA.IB -u sysdba -p masterkey
Database: c:\DATA_EUA.IB, User: sysdba
SQL> create user bagong set password '123';
SQL> create user gareng set password '456';
SQL> create user semar set password '789';
SQL> quit;
untuk lebih aman kita dapat mengganti master passwordnya …
C:\ib2007\bin>isql c:\DATA_EUA.IB -u sysdba -p masterkey
Database: c:\DATA_EUA.IB, User: sysdba
SQL> alter user sysdba set password 'gatutkoco';
SQL> quit;
Bila kita masuk lagi dengan password standar akan terjadi error ..
C:\ib2007\bin>isql c:\DATA_EUA.IB -u sysdba -p masterkey
Statement failed, SQLCODE = -902
Your user name and password are not defined. Ask your database administrator to
set up an InterBase login.
Use CONNECT or CREATE DATABASE to specify a database
SQL>
=== YANG PERLU DIINGAT, INTERBASE TIDAK MENYEDIAKAN TOOL UNTUK MERESET PASSWORDNYA JIKA LUPA ==
Buatlah password yang mudah diingat anda sendiri namun susah diingat orang lain.
Seperti buah simalakama, namun .. berdasarkan survey ke beberapa klien, sebagian besar klien lebih memilih mengentry ulang datanya daripada data penting perusahaan jatuh ke tangan pihak lain yang tidak bertanggungjawab.
Beberapa teman pernah nanya kepada saya apakah Interbase itu sama dengan Firebird?
Memang banyak orang yang beranggapan bahwa Interbase sama dengan Firebird atau Firebird adalah versi gratisnya Interbase.
Sesungguhnya anggapan diatas adalah tidak benar.
Sekilas sejarah tentang lahirnya Firebird
Pada pertengahan tahun 2000, Borland Corp (sekarang Embarcadero) merelease source code dari Interbase 6.0 untuk umum.
Beberapa waktu kemudian salah seorang yang pernah terlibat dalam team pengembangan Interbase bersama dengan berberapa teman mulai membangun Firebird berdasarkan kode yang direlease Borland.
Perkembangan versi
Pada versi-versi awal memang banyak kesamaan antara Firebird dengan interbase, termasuk ekstensi file database,port,library dll
Setelah sempat berhenti, Interbase mulai dikembangkan lagi, muncullah Interbase 6.5, kemudian Interbase 7.5 yang merupakan versi pertama yang menggunakan pengaturan user pada database (sekedar informasi, sampai pada saat artikel ini ditulis, pengaturan user pada firebird terbaru (2.5) masih gabung diserver, sementara Interbase memberi 2 pilihan).
Selanjutnya Interbase dan Firebird berkembang sendiri-sendiri dengan fitur masing-masing pula.
Database juga sudah tidak kompatible (tidak bisa dengan mudah konversi Interbase < => menggunakan backup/restore seperti versi2 sebelumnya).
Sejarah perkembangan versi (release sebelum 6.0 & SP update diabaikan)
Interbase : 6.0, 6.5, 7.0, 7.1, 7.5, 2007, 2009, XE, XE3
Firebird: 1.0, 2.0, 2.1, 2.5.0, 2.5.1
Persamaan yang masih ada dan ini yang kadang membuat user bingung adalah:
Sama-sama menggunakan port standar 3050 (gds_db)
Sama-sama menggunakan gds32.dll sebagai library
Oleh karena itu sering kali terjadi masalah/crash jika Interbase dan Firebird diinstall pada komputer yang sama.
Sebenarnya masih ada solusi untuk mengganti port (pada interbase) dan menggunakan library fbclient.dll (untuk firebird).
Untuk lebih amannya sebaiknya di install di beda komputer.
Untuk fitur2 apa yang ada pada Intebase bisa dibaca di ..
http://www.facebook.com/groups/delphi.interbase/doc/432442213467182/
http://www.facebook.com/groups/delphi.interbase/doc/435036439874426/
http://www.facebook.com/groups/delphi.interbase/doc/444659148912155/
http://www.facebook.com/groups/delphi.interbase/doc/421114931266577/
dan artikel-artikel lainnya
Interbase adalah salah satu database RDBMS yang menggunakan teknologi client server.
Gambaran perbedaan aplikasi yang menggunakan database desktop (file sharing) dengan aplikasi yang menggunakan database client server dapat dilihat pada ilustrasi gambar berikut :
Pada database desktop proses baca tulis terhadap database dilakukan langsung oleh aplikasi sedangkan untuk database client server proses baca tulis terhadap database dilakukan oleh database server, aplikasi hanya mengirimkan perintah dan membaca hasil dari query dan dihasilkan database server.
Pada aplikasi remote yang mana database terletak di komputer lain apalagi datanya cukup besar, dengan database client server mempunyai keunggulan dari segi kecepatan karena lebih sedikit data yang dikirim melalu jaringan.
Contoh database yang berbasis desktop/file sharing :
Dbase, FoxPro, Paradox, Access, dll
Contoh database yang berbasis client server :
Interbase, Firebird, Blackfish SQL, MS SQL Server, MySQL, Oracle, SQL Anywhere, Postgresql, dll
Interbase merupakan database client server yang dapat berjalan di banyak platform diantara Windows, Linux, Mac, Solaris.
Salah satu kelebihan Interbase adalah foot print yang kecil, instalasi mudah dan hampir tidak perlu perawatan, sehingga dalam pendistribusiannya tidak mewajibkan seseorang dengan pengetahuan khusus untuk instalasi dan perawatan.
Referensi tentang Interbase dapat dibaca di …
http://en.wikipedia.org/wiki/InterBase
http://www.embarcadero.com/products/interbase