Posts tagged ‘database administration’

Oracle Database: Rumah Oracle di Windows XP

Saat meng-otak atik registry di Windows, aku menemukan bahwa Oracle menambahkan entry registry baru setiap kali aku memasukkan Oracle Home baru saat instalasi melalui Oracle Universal Installer. Padahal, di tengah proses wizard, aku telah memilih untuk membatalkan instalasi. Entry tersebut dapat ditemukan di HKEY_LOCAL_MACHINE\sOFTWARE\ORACLE.

Aku sering mendengar apa yang disebut variabel ORACLE_HOME. Tapi variabel ini tidak pernah di-set di environment, dan tidak direkomendasikan untuk melakukan hal tersebut. Lalu bagaimana aku bisa mengetahui nilai ORACLE_HOME? Ternyata aplikasi Oracle akan mencari file oracle.key di ORACLE_HOME\bin. Misalnya jika aku menjalankan:


c:\oracle\product\10.1.0\db_Latihan\bin\sqlplus.exe

maka Oracle akan mencari file berikut:


c:\oracle\product\10.1.0\db_Latihan\bin\oracle.key

dan di sistem-ku, isi file tersebut adalah:


SOFTWARE\ORACLE\KEY_OraDb10g_homeLatihan

baru kemudian Oracle mengambil informasi ORACLE_HOME di registry Windows.

07 Januari 2009 at 7:23 AM Tinggalkan Komentar

My FAQ: Sekedar Catatan dan Review

Bagaimana cara melihat isi server parameter file?

Login ke SQL*Plus, kemudian ketik perintah SHOW PARAMETERS nama_parameter. Contoh:


SHOW PARAMETERS DB_NAME

  • Bagaimana cara mematikan database Oracle melalui SQL*Plus?Login ke SQL*Plus sebagai SYSDBA, lalu berikan perintah SHUTDOWN IMMEDIATE.
  • Bagaimana cara menyalakan kembali database Oracle melalui SQL*Plus?Login ke SQL*Plus sebagai SYSDBA, lalu berikan perintah STARTUP.
  • Bagaimana cara menutup session koneksi ke database?Tentukan terlebih dahulu SID dan Serial Number (SERIAL#) dari session yang akan di-terminate dengan memeriksa isi V$SESSION. Setelah itu, berikan perintah ALTER SYSTEM KILL SESSION ‘nomorSID,nomorSerial’, seperti:


    ALTER SYSTEM KILL SESSION '147,11';

  • Bagaimana membuat tabel temporary yang isinya selalu dihapus setiap kali commit?Buat tabel dengan perintah DDL seperti berikut:


    CREATE GLOBAL TEMPORARY TABLE tbl_temp (
      user_id CHAR(10),
      no# NUMBER(10)
    ) ON COMMIT DELETE ROWS;
  • O ya, aku menemukan instalasi Oracle dalam sistem-ku secara otomatis membuat job dalam scheduler-nya, yaitu PURGE_LOG dan GATHER_STATS_JOB (untuk mengumpulkan statistik yang berguna bagi query optimizer). Job PURGE_LOG dijadwalkan berjalan setiap hari pada jam 03:00:00 AM. Tapi karena aku tidak pernah meninggalkan Oracle-ku menyala setiap jam 3 pagi, maka job ini akan dikerjakan setiap kali aku pertama kali menyalakan komputer di pagi hari. Job GATHER_STATS_JOB dijadwalkan pada predefined window WEEKNIGHT_WINDOW (jam 10:00:00 PM dari Senin s/d Jumat) dan WEEKEND_WINDOW (tengah malam pada hari Sabtu). Pada log history untuk GATHER_STATS_JOB, aku melihat job tersebut beberapa kali gagal di-eksekusi mengingat alokasi memori di SGA yang aku berikan memang sangat terbatas.

    06 Januari 2009 at 9:15 AM Tinggalkan Komentar

    Sekilas Info: Tips Menjelang Tahun Baru

    Selamat merayakan tahun baru di malam tahun baru ini!!! Saat ini aku sedang membaca dan mengetik di depan notebook sambil mendengar suara kembang api saling meramaikan tiada henti. Aku yakin saat ini jalanan sedang penuh sesak dengan orang-orang yang tidak ingin melewatkan momen pergantian tahun malam nanti. Aku juga tidak ingin membiarkan semangat tahun baru ini berlalu begitu saja… Aku akan menghabiskan malam tahun baru ini dengan penuh semangat bersama…Oracle 10g ;)

    O ya, aku pernah menuliskan bahwa pada instalasi default, aku bisa connect ke SQL*Plus melalui user OS, dengan perintah seperti berikut:

    sqlplus / as sysdba

    Bila aku tidak suka, aku bisa membuka Oracle Net Manager, lalu memilih Local, Profile, kemudian pada dropdown yang ada, aku memilih Oracle Advanced Security. Setelah itu aku memindahkan item NTS yang ada di selected methods ke bagian available methods.

    Ingin memakai SQL*Plus berbasis Windows tapi hendak login sebagai SYSDBA? Caranya gampang saja, buka SQL*Plus for Windows, lalu saat diminta mengisi data logon, isi user name dengan SYS AS SYSDBA. Jangan mengisi bagian password, tetapi langsung tekan tombol OK. Setelah itu akan muncul Enter password:. Isi password dan selamat ber-SQL ria!!

    31 Desember 2008 at 7:19 AM Tinggalkan Komentar

    Application Context: Namespace USERENV

    Pada artikel sebelumnya, aku pernah mencoba memakai Virtual Privadate Database (VPD) dengan bantuan fungsi DBMS_RLS.ADD_POLICY. Dalam hal ini, aku membuat sebuah function yang menghasilkan predicate. Contoh function yang aku buat masih sangat sederhana sekali. Sekarang bagaimana jika aku ingin memeriksa nama user yang sedang login, di dalam function yang menghasilkan predicate? Aku bisa memakai application context. Dalam kasus ini, aku akan memakai namespace USERENV, yang menyediakan atribut SESSION_USER yang berisi nama user. Contoh fungsi yang menghasilkan predicate dengan memanfaatkan application context:


    create or replace
    FUNCTION simple_predicate (
      schm IN VARCHAR2, name IN VARCHAR2)
    RETURN VARCHAR2 AS
      predicate VARCHAR2(2000);
      cur_user VARCHAR2(2000);
    BEGIN
      cur_user:=sys_context('userenv', 'session_user');
      IF cur_user='SYS' THEN
        predicate := '1=1';
      ELSE
        predicate := 'tingkat_keamanan = 1';
      END IF;
    
      RETURN predicate;
    END;
    /

    Sekarang, jika aku login dengan user SYS, aku bisa melihat seluruh isi tabel PROJEK, tetapi bila aku login sebagai user lain, aku hanya bisa melihat baris dengan tingkat_keamanan = 1.

    31 Desember 2008 at 12:02 AM Tinggalkan Komentar

    Oracle User: Latihan Membuat User Baru

    Aku akan mencoba membuat sebuah user baru di database Oracle-ku. User tersebut akan memakai tablespace default “EXAMPLE”, dan tablespace temporary “TEMP”. Aku akan memberinya quota 50 MB untuk tablespace “EXAMPLE”. Berikut adalah contoh perintah SQL yang aku berikan:


    CREATE USER jocki
    IDENTIFIED BY jockihendry
    DEFAULT TABLESPACE EXAMPLE
    QUOTA 50M ON EXAMPLE
    TEMPORARY TABLESPACE TEMP;
    

    Setelah user dibuat, aku harus memberikan role atau priviledge, minimal berupa CREATE SESSION agar bisa connect ke database. Ada sesuatu yang menarik mengenai role disini. Secara default, pada saat instalasi, Oracle membuat sebuah role baru di sistem operasi Windows XP-ku (istilah “group”) dengan nama ORA_DBA. Dan ini menyebabkan aku bisa connect ke SQL*Plus dengan:


    sqlplus jocki as sysdba

    User sistem operasi-ku yang sedang login di XP memiliki role ORA_DBA (sebenarnya sudah di-set oleh Oracle waktu instalasi pertama kali). Karena role sistem operasi berupa ORA_DBA di Windows XP cocok dengan role DBA di Oracle, maka semua priviledge DBA akan di-assign ke user yang login ke database. Wew, ini berarti aku bahkan punya hak akses DBA dengan user scott:


    sqlplus scott as sysdba

    Atau dengan kata lain, tidak peduli user database-nya siapa saja. Berhubung user sistem operasi-ku memiliki role ORA_DBA, aku bisa login sesuka hati sebagai DBA:


    sqlplus / as sysdba

    Kembali ke user jocki, aku akan membuat sebuah role untuk user-user yang memiliki hak akses serupa, dengan SQL seperti berikut:


    CREATE ROLE TRAINING;

    Lalu akan mengatur hak akses untuk role training tersebut:


    GRANT CREATE SEQUENCE, CREATE SESSION, 
      CREATE SYNONYM, CREATE TABLE, 
      CREATE VIEW 
    TO TRAINING;
    

    Setelah itu, aku akan memasukkan user jocki kedalam role training:


    GRANT TRAINING TO JOCKI;

    Setelah itu, user jocki dapat dipakai untuk operasi database normal seperti manipulasi tabel dan view.

    30 Desember 2008 at 9:00 AM Tinggalkan Komentar

    DBMS_RLS: Fine-grained Access Control

    Tanggal 26 Desember 2007 kemarin, aku tepat mengakhiri masa kerjaku selama 1 tahun 2 bulan di tempat kerja pertamaku. Sebagai seorang yang baru pertama kali kerja, aku mendapatkan banyak pengalaman yang menarik. Aku merasakan bagaimana lingkungan kerja yang ideal dalam bayanganku ternyata pada praktek-nya tidak sesuai. Aku melihat banyak orang yang berpendidikan, memiliki gelar S1 dan S2, lulus dari universitas ternama, bahkan dari luar negeri, tetapi bertindak tanpa pertimbangan matang (pemikirin scientific) dan landasan teori yang dapat dipertanggungjawabkan, tak beda jauh dengan anak-anak SMU. Aku melihat bagaimana sebuah masalah yang sederhana menjadi kompleks karena dikerjakan begitu saja. Tapi aku juga melihat bagaimana solusi sederhana bisa menjawab permasalahan yang kompleks.

    Kembali ke topik, package DBMS_RLS menyediakan fungsi-fungsi untuk mengatur security policies. Salah satunya, ia menyediakan access control yang memanfaatkan dynamic predicate.

    Dynamic predicate diperoleh saat sebuah statement DML dan SELECT dikerjakan. Misalnya, query berikut ini:

    SELECT * FROM EMP;

    akan diterjemahkan menjadi:

    SELECT * FROM EMP WHERE p1;

    dimana P1 adalah predicate yang dihasilkan oleh sebuah function yang didaftarkan melalui DBMS_RLS.ADD_POLICY.

    Sebagai latihan, aku akan membuat tabel dan isi-nya sebagai berikut:

    CREATE TABLE PROJEK (
      NO_PROJEK CHAR(20),
      NAMA_PROJEK NVARCHAR2(200),
      TINGKAT_KEAMANAN NUMBER(1)
    );
    
    INSERT INTO PROJEK VALUES (
      'PJ-1', 'Loan Origination System', 1);
    
    INSERT INTO PROJEK VALUES (
      'PJ-1A', 'LOS For Another Bank', 1);
    
    INSERT INTO PROJEK VALUES (
      'PJ-2', 'Middleware Improvement', 2);
    
    INSERT INTO PROJEK VALUES (
      'PJ-3', 'Top Secret', 3);

    Setelah itu, aku membuat sebuah fungsi sederhana yang akan menghasilkan predicate, seperti:

    CREATE OR REPLACE FUNCTION simple_predicate (
      schm IN VARCHAR2, name IN VARCHAR2)
    RETURN VARCHAR2 AS
    BEGIN
      RETURN "tingkat_keamanan = 1";
    END;
    /

    Berikutnya, aku mendaftarkan fungsi di atas melalui ADD_POLICY setelah login sebagai SYSDBA:

    begin
      dbms_rls.add_policy(
        object_schema => 'SCOTT',
        object_name => 'PROJEK',
        policy_name => 'POLICY_TINGKAT_KEAMANAN',
        function_schema => 'SCOTT',
        policy_function => 'SIMPLE_PREDICATE',
        statement_types => 'SELECT',
        sec_relevant_cols => 'no_projek, nama_projek, tingkat_keamanan');
    end;
    /

    Sekarang, setiap kali siapa saja men-query tabel, seperti dengan SQL berikut:

    select * from projek;

    29 Desember 2008 at 10:52 AM Tinggalkan Komentar


    Arsip


    Ikuti

    Get every new post delivered to your Inbox.