1. Anar Godjaev
http://anargodjaev.wordpress.com/
VERİTABANI VE KULLANICI YÖNETİMİ
Oracle güvenlik konusunu çok ciddi olarak ele almaktadır.Hem kullanıcılar bazında hemde system bazında
yeterli seviyede korunma birimleri vardır.
Bir veri tabanı ilk yaratıldığında bilinmesi gereken en önemli iki kullanıcı vardır.Biri SYSTEM diğeri
SYS‟dir.İkiside veritabanını yönetmek için full haklara sahiptir.Sys kullanıcısoyla bağlanabilmek için
bağlantı cümlemizin sonuna AS SYSDBA eklemek zorundayız.Dediğimiz gibi SYS ve SYSTEM arasında
veritabanını yönetmek açısından hiçbir fark yoktur.Tek fark sys user‟ı sysdba haklarıyla bağlandığı için
veritabanını kapatabilmekte fakat system user‟ı kapatamamktadır.
İlk olarak güvenliğin en önemli prensibi olan kullanıcı yönetiminden başlamalıyız.
Bir kullanıcı nasıl yaratılır ve neler önemlidir diye bakacak olursak,
*Kullanıcının unique bir ismi olmalıdır.30 karakteri geçmemeli,özel karakterler kullanılmamalı yalnızca harf
kullanılmalıdır.
*Authentication metodu dediğimiz hangi şekilde bağlanacağı belirlenmelidir.
*Kullanıcının Default data ve temp tablespace „i belirlenmelidir.
*Kullanıcı için profil belirlenmeldiir.
*Bir kullanıcı yaratılıp ,bu kullanıcı ile bir obje oluşturulursa artık bu kullancının bir SCHEMA „sı oluşur.Artık
bundan sonra kullanıcınn objeleri değil,schemanın objeleri kavramını kullanacağız.
2. Anar Godjaev
http://anargodjaev.wordpress.com/
SQL >CREATE USER user_name IDENTIFIED BY password;
SQL >CREATE USER deneme IDENTIFIED BY deneme;
SQL > CREATE USER user IDENTIFIED {BY password |
EXTERNALLY |GLOBALLY AS 'external_name'}
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[ { QUOTA {n [K|M] | UNLIMITED} ON
tablespace } [, ... ] ]
[PROFILE profile]
} [ ... ];
Create user sysntax‟ını yazdıktan sonra 3 alternatifimiz var,ya kullanıcya password verebilir,external
seçeneğini seçip işletim sistemi yada 3.party bir sevisin haklarıyla bağlandırabilir yada global seçeneğini
seçip,enterprise directory service hakları ile bağlandırabiliriz.
Şimdi bunun örneklerine sıra ile bakarsak,
Normal bir şekilde yani password kullanarak user yaratılması şu şekildedir.
SQL >CREATE USER deneme IDENTIFIED BY deneme;
Bunun dışında externally yani işletim sistemi yada 3. Part tooların verdiği haklarla user yaratmak istersek,
3. Anar Godjaev
http://anargodjaev.wordpress.com/
İlk olarak bakmamız gereken bir paramere olan os_authent_prefix „dir.
SQL> SHOW PARAMETER os_authent_prefix
NAME
TYPE
VALUE
------------------------------------ ----------- -----------------------------os_authent_prefix
string
ops$
SQL>
Buradaki ops$‟ın anlamı user yaratırken ön takı olarak başına ops$ koyacağımız nalmaına geliyor.
Daha sonra "%ORACLE_HOME%networkadminsqlnet.ora" dosyasını açtığımızda ,
SQLNET.AUTHENTICATION_SERVICES= (NTS) satırının kesinlikle olması gerekmektedir.
Artık veritabanı kullanıcımızı yaratabiliriz.Fakat burada ikinci olarak dikkat edeceğimiz,Windows
sistemlerde eğer makinamız domain‟e bağlıysa bu domain name‟ini kullanacağız,eğer bağlı değil ise
makine ismini kullancağız,unix sistemlerde buna gerek yoktur.
Şimdi hem unix hemde windows istemler için örneklerimizi görelim,
UNIX
SQL >CREATE USER ops$USER_NAME IDENTIFIED EXTERNALLY;
SQL >CREATE USER ops$DENEME IDENTIFIED EXTERNALLY;
SQL >GRANT CONNECT TO ops$DENEME;
-- Windows
SQL >CREATE USER "OPS$domain_nameTIM_HALL" IDENTIFIED EXTERNALLY;//domain ise
SQL >CREATE USER "OPS$computer_nameTIM_HALL" IDENTIFIED EXTERNALLY;//domain değilse
SQL >CREATE USER "OPS$MAKINA1DENEME" IDENTIFIED EXTERNALLY;
SQL >GRANT CONNECT TO "OPS$ MAKINA1DENEME ";
Burada dikkat ettiyseniz user isimleri kesinlikle büyük harfle tanımlanmalıdır.
Windows sistemlerde kafamız domain mi kullancam yoksa local computer name kullanacağım diye karışsın
istemiyorsanız,sqlplus “/as sysdba” ile bağlandığınızda aşağıdaki sorguyu çalıştırısanız size ne şekilde
bağlanmanız yada kullanıcı yaratmanız gerektiğini söyleyecektir.
SQL> select UPPER(sys_context('userenv','os_user')) from dual;
UPPER(SYS_CONTEXT('USERENV','OS_USER'))
------------------------------------------------------------------MAKINA1Administrator
Bu işlemleri bitirdikten sonra artık işletim sistemi tarafında kullanıcı yaratmamız gereklidir.Yine aynı
şekilde unix ve windows sistemler için durum farklıdır.Kullanıcı isimlerini mümkünse yine büyük harfle
tanımlıyoruz.
4. Anar Godjaev
http://anargodjaev.wordpress.com/
Yukarıdaki örnek windows sistmeler içindir.Unix sistemlerde ise /etc/passwd altına bir user eklemek
yeterlidir.
Bundan sonraki adım ise hangi user‟ı yarattıysak o user ile işletim sistemine login oluyoruz.Daha sonra
command‟ı açıp sadece sqlplus / yada sqplus /@service_name(bu isim tnsnames.ora daki isimdir) yazmak
yeterlidir.
5. Anar Godjaev
http://anargodjaev.wordpress.com/
Windows sistemlerde eğer domain kullanıcılarının uzaktan bağlanabilmeleri isteniyorsa
remote_os_authent parametresinin değeri TRUE olmalıdır.Default‟u false tur
SQL>ALTER SYSTEM SET REMOTE_OS_AUTHENT=TRUE SCOPE=SPFILE ;
SQL>SHUTDOWN IMMEDIATE ;
SQL>STARTUP;
Bir diğer authentication şekli olan GLOBALLY kavramına bakarsak bu tamamen enterprise directory
service hakları ile bağlanmayı gerektirir.Genellikle OID dediğimiz Oracle Internet Directory yapısında
kullanılır.Bunun için NETCA tanımlarında ya Oracle Internet Directory yada Microsft active directory
yapısını kullanabiliriz.Önemli bir konudur fakat çok uzun anlatılması gerekir.
Bunun için bir kullancı tanımına bakacak olursak,
SQL>CREATE USER DENEME
IDENTIFIED GLOBALLY AS 'CN=analyst, OU=division1, O=oracle, C=US'
DEFAULT TABLESPACE example
QUOTA 5M ON example;
Authentication konusunu tamamladıktan sonra kullanıcı tanomlarken gerekli olan diğer konulara
bakabiliriz.
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
Default tablespace yaratacağımız kullanıcının objelerini muhafaza etmek için hangi tablespace‟i
kullanacağını belirlememize yarar.Çoğu iyi tasarlanmış sistemlerde ilk önce tablespace daha sonra
kullanıcı tanımlandığı için user yaratma aşamasında rahatlıkla belirtebiliriz.Diğer‟i ise TEMPORARY olarak
hangi tablespace‟i kullanacağıdır.Eğer boş bırakırsak Veirtabanının default temp tablespace‟ini kullanır
ama istenirse yeni bir temp tablespace yaratılıp bu kullanıcı için kullanılsın denilebilir.Genellikle ilgili luser
yaptığı sıralama işlemlerinde kullanılacaktır.
Önceki gördüklerimizle bir karşılaştırma yapacak olursak,bir database‟de aktif olarak birden fazla TEMP
Tablespace kullanılabilir,ama tüm kullanıcılar için undo tablespace tektir.Bunu unutmamaka gerekir.
SQL>CREATE USER DENEME
IDENTIFIED BY SIFRE
DEFAULT TABLESPACE DENEME_TAB
TEMPORARY TABLESPACE TEMP;
Sırada göreceğimiz profile ve kota kavramları var,
[ { QUOTA {n [K|M] | UNLIMITED} ON
tablespace } [, ... ] ]
[PROFILE profile]
QUOTA‟nın anlamı oluşturacağımız kullanıcının ilgili tablespace üzerinde ne kadarlık bir obje barındırma
hakkı olsun dediğimizde kullanıyoruz,Eğer unlimeted verirsek sınırsız olarak kullanabilir.
6. Anar Godjaev
http://anargodjaev.wordpress.com/
Profile ise sistem üzerinde default profiller olduğu gibi biz kendimiz profile tanımlayarak kullanıcının
oturumunu yönetebiliyoruz.Örneğin kullanıcı kaç sefer yanlış şifre girdiğinde lock lansın,şifre uzunluğu ne
olsun,ne kadar süre bağlı kalabilsin gibi.Bir çok senaryo mevcuttur.Gerçekten kullanışlı bir opsiyondur.
Örneğin yeni bir profile oluşturma olayına bakacak olursak,
Resource parameters
Password parameters
Yukarıda görüldüğü gibi birçok parametre baz alınarak profile tanımı yapılabilir.
Veritabanı ilk kurulduğunda default isimle gelen profilin yapısı şu şekildedir.
SQL > CREATE PROFILE DEFAULT LIMIT
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
CONNECT_TIME UNLIMITED
IDLE_TIME UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
COMPOSITE_LIMIT UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
7. Anar Godjaev
http://anargodjaev.wordpress.com/
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;
Sırayla Resource parametrelerinden başlıyarak bakacak olursak,
SESSIONS_PER_USER
Eşzamanlı olarak kullanıının açabileceği sssion sayısı
CPU_PER_SESSION
Saniyenin 100 de biri kadar biri süre içinde kullanıcının limitliyebileceği CPU zamanı.
CPU_PER_CALL
parse, execute, fetch gibi işlemler için Saniyenin 100 de biri kadar kullanıcya verilecek limit.
CONNECT_TIME
Kullanıcının bir session içinde geçirebileceği zaman ,dakika cinsinden.
IDLE_TIME
Uzun sorgular için kullanışlıdır,yapılan işlemin ne kadar süre bekleneceğini saniye cinsinden gösterir
LOGICAL_READS_PER_SESSION
Bir session içinde ne kadarlık data bloğu okunabileceğini limitler
LOGICAL_READS_PER_CALL
parse, execute, fetch anında ne kadarlık databloğu okunacağını limtler
PRIVATE_SGA
İstenirse kullanıcı için byte cinsinden özel bir SGA alanı tahsis edilebilir.
Passowrd paramerelerine bakacak olursak,
FAILED_LOGIN_ATTEMPTS
Kullanıcın login olmadan önce lock olana kadar kaç deneme yapabileceğini gösterir
PASSWORD_LIFE_TIME
Gün cinsinden parolanın ne kadar süre geçerli olacağını gösterir.
PASSWORD_LOCK_TIME
Parolanın ne kadar gün sonra lock edileceğini belirler.
SQL > CREATE PROFILE new_profile
PASSWORD_LIFE_TIME 10
FAILED_LOGIN_ATTEMPTS 5;
SQL > CREATE PROFILE app_user LIMIT
SESSIONS_PER_USER
UNLIMITED
CPU_PER_SESSION
UNLIMITED
CPU_PER_CALL
3000
CONNECT_TIME
45
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL
1000
PRIVATE_SGA
15K;
Daha sonra ise kullanıcı tanımlarken bu profilleri kullanıcıya atayabiliyoruz.
8. Anar Godjaev
http://anargodjaev.wordpress.com/
SQL > CREATE USER app_user1
IDENTIFIED by oracle
DEFAULT TABLESPACE example
QUOTA 5M ON example
PROFILE app_user;
SQL > CREATE USER new_user_orakleci
IDENTIFIED by oracle
DEFAULT TABLESPACE example
QUOTA 5M ON example
PROFILE new_profile;
Bunuda gördükten sonra user yaratırken iki kavram daha kalıyor ACCOUNT LOCK yada UNLOCK ve
PASSWORD expire kavramı.
Kullanıcı yaratırken istersek kitli yaratıyoruz,isetersek kilitsiz yaratbiliyoruz.Kilitli ise kullanıcı login
olduğunda oturum kilitli lütfen kilidi açın gibi bir uyarı alınır.Kullanıcı kendi kilidini açamayacktır.Bunu
yetkili bir başka kullanıcı açtıktan sonra kilitli kullanıcı artık bağlanabilecektir.Bu paramrenin default‟u
UNLOCK olarak tanımlıdır.
Pasword expire seçeneğini aktif hale getirisek kullanıcı login olduğunda şirefsini değiştirmesi istenecek ve
kullanıcıda bunu değiştirecektir.
SQL> create user deneme identified by deneme password expire;
SQL>connect deneme/deneme
ERROR:
ORA-28001: the password has expired
Changing password for deneme
New password:
Yukarıdaki örnekte görüldüğü gibi kulalncıdan yeni şifre girmesi istenmiştir.
Alttaki örnek ise kilitli olarak yaratılan bir kullanıcının nasıl kullanılacağı ile ilgilidir.Kullanıcı kilitlidir ve
bağlanmak istediğinde hata almıştır.Başka bir yetkili kullanıcıyla bu kilidi açıyoruz ve kullanıcı tekrar
denediğinde artık bağlanabiliyor.
SQL> create user deneme identified by passw0rd account lock;
SQL>connect deneme/passw0rd
ERROR:
ORA-28000: the account is locked
SQL>alter
user deneme account unlock;
SQL>connect deneme/passw0rd
Connected.
Buraya kadar anlatılan işlemlerle bir kullanıcının nasıl yaratılacağını gördük.Peki oluşturulan kullanıcı
sisteme nasıl bağlanıyor diye bakacak olursak.
9. Anar Godjaev
http://anargodjaev.wordpress.com/
$sqlplus kullanici/sifre [as sysdba/sysoper]
Örneğin denem isimli bir kullanıcı ve şifresi deneme_sifre olan bir kullanıcı ile bağlanmak isteyelim.
$sqlplus deneme/deneme_sifre
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL >
Bağlantı bu şekilde sağlanacaktır.Peki buradaki as sysdba yada as sysoper nedir diye bakacak
olursak.SYSDBA hakkı sistemde sysdba hakkına sahip olan kullanıcların bağlanma şeklidir.Bu hakka SYS
kullanıcısı sahiptir.SYS kullanıcısı SYSDBA opsiyonu dışında normal olarak bağlanamaz.SYSDBA ile
bağnalıldığında sistem üzerinde yapılamayack işlem yoktur.Her kullanıcı SYSDBA opsiyonu ile bağlanamaz
sadece bu hakka sahip olanlar bağlanabilir.Bu hakta SYSDBA hakkına sahip olan bir kullanıcı ile başka bir
kullanıcıya şu şekilde verilir.
SQL > grant sysdba to kullanici_adi;
Şimdi SYSDBA hakkı ile SYSOPER arasında ne gibi farklar var diye bakacak olursak,
SYSDBA
STARTUP ve SHUTDOWN işlemini gerçekleştirebilir.
ALTER DATABASE komutu ile beraber : open, mount, back up, yada change character set
yapabilir.
CREATE DATABASE yapabilir.
DROP DATABASE yapabilir.
CREATE SPFILE yapabilir.
ALTER DATABASE ARCHIVELOG yapabilir.
ALTER DATABASE RECOVER yapabilir.
SYSOPER
STARTUP ve SHUTDOWN işlemini gerçekleştirebilir.
CREATE SPFILE yapabilir.
ALTER DATABASE OPEN/MOUNT/BACKUP yapabilir.
ALTER DATABASE ARCHIVELOG yapabilir.
ALTER DATABASE RECOVER (Yalnızca tam recovery dediğimiz işlemi yapabilir. INCOMPLATE
RECOVERY dediğimiz UNTIL TIME|CHANGE|CANCEL|CONTROLFILE işlemlerini yapamaz,bunları
yapabilmek için SYSDBA olmak gereklidir.)
Görüldüğü üzere aralarında birkaç ciddi fark vardır.
Bazen dikkat edilirse işletim sisteminden aşağıdaki komutu kullanarak kullanıcı adı şifre girmeden ama
sysdba yada sysoper ile veritabanına connect olabilmekteyiz.Peki bu nasıl olmaktadır.
Mesela,
$ sqlplus “/as sysdba” yazdığımızda bağlanabilmekteyiz.Bunu yapabilmemizi sağlayan işletim sistemine
connect olduğumuz kullanıcının windows sistemlerde ORA_DBA unix sistemlerde ise DBA grubuna dahil
olmasınla olur.sysoper için ise windows sistemlerde ORA_OPER ,unix sistemlerde OPER grubu ile
gerçekleşmektedir.Bu gruba dahil olunmayan işletim sistemi kullanıcılarınla bağlanıldığında bu işlemi
gerçekleşitiremeyiz.
10. Anar Godjaev
http://anargodjaev.wordpress.com/
Peki bunun dışında uzaktaki bir sistemden bir veritabanına / as sysdba haklarıyla nasıl bağlanırız diye
bakacak olursak bu biraz daha farklıdır.
Buna Oracle dilinde REMOTE_LOGIN_DATABASE diyoruz.
SQL > CONNECT /@net_service_name AS SYSDBA
SQL > CONNECT /@net_service_name AS SYSOPER
Yukarıdaki bağlantı şekliye bağlanabilmemiz için veritabanı üzerinde çeşitli parametrelerin aktif olması
gereklidir.
REMOTE_LOGIN_PASSWORDFILE adını verdiğimiz parametrenin değerinin EXCLUSIVE olması
gereklidir.Veritabaında default olarak bu şekildedir fakat NONE yada SHARED ise bu değere set edilmesi
gereklidir.
Tabi ki bunu yapmakta yetmeyecektir bunun dışında Passwordfile adını verdiğimiz bir file vardır.Bu file‟ın
yaratılmış ve düzgün ayarlanmış olması gereklidir.Eğer yoksa şu şekilde ayarlayabiliriz.
$ ORAPWD FILE=filename PASSWORD=password ENTRIES=max_users force=<y/n>
Buradakilerin anlamı,
FILE = Passord file‟ın ismi,direk olarak dosya ismi verilebileceği gibi bir path‟le de birlikte
verilebilir.Girilmesi zorunludur.
PASSWORD=sys user‟ı için password belirlenir.Eğer daha öneden bir password file‟ımız var ve
kullanılıyorsa ALTER USER komutu ile sys kullanıcısının şifresini değiştirdiğimizde password file danda şifre
güncellenir.İlk defa password file yaratacaksak burada verdiğimiz şifre veritabanı içinde
geçerlidir.Girilmesi zorunludur.Eğer veritabanı üzerinde REMOTE_LOGIN_PASSWORDFILE parametresi
SHARED ise sys kullanıcısının şifresi değiştirilemez.
entries – Farklı olarak DBA yada operlardan max ne kadar kabul edileceği
force – Mevcut dosyanın üzerine yazılıp yazılmayacağı
Dikkat edilmesi gereken = karakterlerinden sonra boşluk olmamalıdır.
Veritabanı üzerinde REMOTE_LOGIN_PASSWORDFILE parametresi için üç tip bilgi set edileebilir.Bunlar ve
özelliklerine bakacak olursak,
NONE: parametre değerinin bu şekilde olması ile güvenli olmayab hiçbir bağlantıya izin verilmeyecektir.
EXCLUSIVE: Parametrenin bu değeri ile password file „ın ve içindeki kullanıclarla güvenli şekilde
bağlanabileceği anlamına gelir.
SHARED: Genellike birden fazla instance „ın olduğu RAC sistemlerinde kullanılır.Aslında amaç password
file‟ın paylaşılmasıdır.Hiçbir şekilde SYSDBA yada SYSOPER hakkına sahip kullanıcıların(sys dahil) şifresi
değiştirilemez,yeni Özel haklara sahip olacak(SYSDBA,SYSOPER) kullanıcı eklenemez.Yapabilemk için
parametreyi EXCLUSIVE‟e çevirmeli işimiz bitiiğinde tekrar SHARED konumuna alınabilir.
11. Anar Godjaev
http://anargodjaev.wordpress.com/
Veritabanına yeni bir SYSDBA yada SYSOPER hakkına sahip olacak kullanıcı eklendiği zaman otomatik
olarak password file‟a yazılır.
Password file içinde tanımlı kullaıcılar ve haklarını görmek için V$PWFILE_USERS view‟ı kullanılabilir.
Şimdi artık kullanıcılarımızı düzgün şekilde yarattığımıza gore kullancıların sisteme ve system objelerine
hangi haklarla bağlandığına ve bu hakların nasıl ayarlandığına bakabiliriz.
Bu hakların ilk adımı olan privileges kavramına bakabiliriz.Privileges system privileges ve objects privileges
olarak ikiye ayrılır.
System privileges system üzerinde bazı işlemleri yapabilmeyi kullanıcılara sağlar.Başlıca privilegeslara
bakacak olursak,
– CREATE SESSION = En önemli haklardan biridir,bu hakka sahip olmayan bir kullanıcı veritabanına
bağlantı kuramaz.
– CREATE TABLE = Kendi Scheması ve tablespace‟I dahilinde tablo yaratabilme iznidir.
– CREATE ANY TABLE = Kendi scheması ve diğer schemalar için tablo yaratabilme iznidir.Bir iznin önünde
ANY varsa kendi scehamsı ve diğer schemalar içinde anlamına gelir.
– CREATE SEQUENCE = Artan sırada ardaşık sayı grubu oluşturmak için gereken haktır.
– CREATE VIEW = View oluşturabilmek için gereken haktır.
– CREATE INDEX = Index oluşturabilmek için gerekli haktır.
– CREATE PROCEDURE = Kendi scheması içinde procedure oluşturabilmek için gerekli haktır.
– CREATE ANY PROCEDURE = Kendi scheması ve diğer schemalarda procedure oluşturabilmek için
gerekli haktır.
– CREATE ROLE = Role yaratabilmek için gerekli haktır.
– CREATE USER = Kullanıcı yaratabilmek için gerekli haktır.
– CREATE TRIGGER = Trigger yaratabilmek için gerekli haktır.
– CREATE PROFILE = Profile yaratabilmek için gerekli haktır.
– ALTER USER = Kullanıcı ile ilgili değişiklik yapacağımız zaman gerekli olan bir izindir.
– ALTER ANY TABLE = Tablolarla ilgili bir değişiklik yapacağımız zaman gerekli olan bir izindir.
– DROP ANY TABLE = bir tabloyu sileceğimiz zaman gerekli olan bir izindir.
– EXECUTE ANY PROCEDURE = Bir prosedürü çalıştırabilmek için gerekli haktır.
– SELECT ANY TABLE = Kendi scheması ve diğer schemalar için sorgulama yapabilme iznidir.
Burada örnek olarak verdiğimiz izinlerin dışında yaklaşık olarak 160-170 arası system izinleri vardır.Bu
İzinler nelerdir diye görmek istersek,
SQL >select distinct(PRIVILEGE) from Dba_sys_privs order by PRIVILEGE;
Sorgusunu kullanabiliriz.
Şimdide bu hakların kullanıclara nası verildiğine bir bakarsak,
SQL >create user deneme identified by deneme;
SQL >grant create session to deneme;
SQL >grant create table to deneme;
$ sqlplus deneme/deneme
Connected
12. Anar Godjaev
http://anargodjaev.wordpress.com/
SQL> create table hh(aa varchar2(20));
Table created.
SQL> create table baska_schema.hh(aa varchar2(20));
create table baska_schema.hh(aa varchar2(20))
*
ERROR at line 1:
ORA-01031: insufficient privileges
Görüldüğü gibi başka bir kullanıcının schemasına obje yaratmak istediğimizde hata aldık.O yüzden yetkili
bir kullanıcı ile deneme kullanıcısına CREATE ANY TABLE hakkı verip tekrar deniyoruz.
SQL >exit;
$ sqlplus “/as sysdba”
Connected
SQL >grant create table to deneme;
SQL >exit;
$ sqlplus deneme/deneme
Connected
SQL> create table baska_schema.hh(aa varchar2(20));
Table created.
Görüldüğü gibi bu örnekten ANY ile ve ANY siz olarak izinlerin farkını anlayabiliriz.
Bir kulalncıya toplu olarak system izinlerini vermek istiyorsak,
SQL >grant create table,alter any table,drop user,execute any procedure to deneme;
Şeklinde kullanabiliriz.
Buraya kadar anlatılanlar system üzerinde var olan izinlerdi,bir diğer izin şeklide obje privilige‟I olarak
adlandırıyoruz.Oda şu şekilde oluyor,Örneğin bizim kullanımızın ismi firstu olsun,başka bir kullanıcı daha
belirleyelim onun ismide secondu olsun.Normalde eğer obje izinleri yoksa bir kullancı başka bir kullancının
objelerine erişemez.Şu şekidle bir örnekle anlatmaya çalışırsak.
1)İlk olarak yetkili bir kullancı ile sisteme bağlanıyoruz
$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 14 15:42:07 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
13. Anar Godjaev
http://anargodjaev.wordpress.com/
With the Partitioning, OLAP and Data Mining options
2)İlk kullanıcımızı yaratıyoruz.
SQL> create user firstu identified by firstu;
User created.
3)Kullanıcıya sisteme bağlanabilmesi için create session hakkı veriyoruz.
SQL> grant create session to firstu;
Grant succeeded.
4)Daha sonra ikinci kullanıcımızı yaratıyoruz.
SQL> create user secondu identified by secondu;
User created.
5)İkinci kullanıcıya tablo yaratbilme hakkı olan create table,oturum açabilme hakkı olan
create session ve bağlı olduğu tablespace’te yazabilme hakkı olan resource veriyoruz.
SQL> grant create session,create table,resource to secondu;
Grant succeeded.
6)sqlplus tan çıkmadan ikinci kullanıcı ile bağlanıyoruz.
SQL> conn secondu/secondu;
Connected.
SQL> show user
USER is "SECONDU"
7)ikinci kullanıcı ile bir tablo yaratıp içine bir staırlık bir bilgi giriyoruz.
SQL> create table xx(aa varchar2(5));
Table created.
SQL> insert into xx values ('HH');
1 row created.
SQL> commit;
Commit complete.
8)Daha sonra birinci kullanıcı ile bağlanıyoruz sqlplus tn çıkmadan.
SQL> conn firstu/firstu;
Connected.
SQL> show user
14. Anar Godjaev
http://anargodjaev.wordpress.com/
USER is "FIRSTU"
9)Aşağıdaki sorguyu çalıştırmasını istiyoruz,kullanıcı bunu çalıştıryor fakat hata alıyor çünkü
birinci kullanıcının ikinci kullanının tablosunda select izni yok.
SQL> select * from secondu.xx;
select * from secondu.xx
*
ERROR at line 1:
ORA-00942: table or view does not exist
10)İkinci kullanıcı ile bağlanıp kendi tablosuna birinci kullanıcının bağlanıp select
yapabilmesi için gerekli izni veriyoruz.
SQL> conn secondu/secondu
Connected.
SQL> show user
USER is "SECONDU"
SQL> grant select on xx to firstu;
Grant succeeded.
11)birinci kullanıcı ile tekrar bağlanıp aynı sorguyu tekrar denediğimizde artık select
yapabildiğimizi görüyoruz.
SQL> conn firstu/firstu
Connected.
SQL> show user
USER is "FIRSTU"
SQL> select * from secondu.xx;
AA
----HH
12)Bu sefer birinci kullanıcı ile ikinci kullanıcının tablosuna insert yapmayı denedğimizde
hata alıyoruz bunun sebebide birinci kullanıcının ikinci kullanıcının tablsounda insert
yapmaya hakkı olmadığını görüyoruz.
SQL> insert into secondu.xx values ('JK');
insert into secondu.xx values ('JK')
*
ERROR at line 1:
ORA-01031: insufficient privileges
12)Bu sefer ikinci kullanıcı ile bağlanıp hem insert hemde delete hakkı verip bu işi
bitiriyoruz.Denemesinide size bırakıyorum.
SQL> conn secondu/secondu
Connected.
SQL> show user
USER is "SECONDU"
SQL> grant select,insert,delete on xx to firstu;
15. Anar Godjaev
http://anargodjaev.wordpress.com/
Obje ve system bazında nasıl izinlerin verildiğini gördük ,komutumuz grant idi,peki verilen izinleri geri
almak istersek ne yapmamız gerekir,bunun komutuda REVOKE tur.
Örnek olarak bakarsak,
SQL>revoke create any table from deneme1;
SQL>revoke execute any procedure from deneme;
SQL>revoke select on xx from firstu;
Kullanım şekli yukarıda görüldüğü kadar basittir.
Obje ve system izinlerini gördük,bunları kullanmak aslında hiç te kolay değil,bunları tek tek kullanıcılara
vermek biraz zahmetli olabilir.Oracle‟I yazanlar role diye bir kavram düşünmüşler.Örneğin bir şirketimiz
var,yaklaış 100 adet kullanıcı olsun,ve şirketin 5 departmanı olsun.Bu 5 departmanın görevleri farklı olsun
ama aynı departmanda çalışanların görevleri aynı olsun.Şimdi Oracle‟da bu 100 kullanıcyı yaratıp her
kullanıcı için tek tek bu izinleri vermek zahmetli olabileceği gibi gözden kaçacak şeylerde olabilir.İlerleyen
günlerde bu 100 kullancıya yeni bir görev vermek istersek tek tek yazmamız gerekir.Yada kullanıcı
departman değiştirecekse once bütün hakları geri alıp daha sonra diğer departmanın haklarını vrmek
gerekir.
Bunun çok zahmetli olacağı bellidr.Onun için ROLE denen kavramı kullanmak daha akılcıdır.
Privillege larda olduğu gibi role lar içinde system tarafından hazırlanmış olan ROLE ler ve bizim
tanımlayacağımız olan ROLE ler mevcuttur.
Örneğin system tarafından hazırlanmış ROLE‟ler nelerdir diye bakacak olursa birkaç örnekle üzerinden
geçebiliriz.
CONNECT = içinde connect session iznini barındırır.
DBA = Hemen hemen tüm izinleri bünyesinde barındırır.Bu role‟e sahip olan kullanıcı hemen hemen
herşeyi yapabilir.O yüzden çok tehlikelidir.
RESOURCE = Bu ise içinde CREATE TABLE,CREATE TYPE.. gibi iznleri barındırır.Bu roel önemlidir zira ilgili
tablespace üzerind eyazma yapabilemk için gereklidir.
Peki bir system role‟ü kullanıcya nasıl verilir.
16. Anar Godjaev
http://anargodjaev.wordpress.com/
SQL> grant connect,resource to deneme;
Kullanımı aynı privillege‟ta olduğu gibidir.Peki system role‟lerinin dışında kendimize ait role nasıl
tanımlayabiliriz diye bakarsak ilk olarak kullanıcının ihtiyacı olan create role hakkına sahip olmasıdır.Bunun
dışındakileri bir örnekle sıralayacak olursak,
1-)İlk olarak yetkili bir kullanıcı ile bağlanıyoruz.
$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 14 17:15:37 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
2-)Daha sonra bir kullanıcı yaratıyoruz.
SQL> create user newu identified by newu;
User created.
3-)Kullanıcıya çeşitli role ler için hak tanımlıyoruz.
SQL> grant connect,resource,create role,create user,create procedure to newu;
Grant succeeded.
4-)Tanımladığımız kullanıcı ile bağlanıp ,bu kullanıcı ile yeni bir role yaratıyoruz.
SQL> conn newu/newu
Connected.
SQL> show user
USER is "NEWU"
SQL> create role newrole;
Role created.
5-)Daha sonra kullanıcımız ile sahip olduğumuz haklardan iki tanesini role’e atamak istiyorz
fakat hata alıyoruz.Bunun sebebi kullanıcı o haklara sahip fakat sahip olduğu hakları başka
bir role’e yada kullanıcıya atama hakkına sahip değil.Bunuda şu şekilde hallediyoruz.
SQL> grant create user,create procedure,connect to newrole;
grant create user,create procedure to newrole
*
ERROR at line 1:
ORA-01031: insufficient privileges
17. Anar Godjaev
http://anargodjaev.wordpress.com/
6-)Ytekili sys kullanıcısı ile bağlanıp newu userına sahip olduğu hakları dağıtabilmesi için
admin option veriyoruz.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Pr
oduction
With the Partitioning, OLAP and Data Mining options
$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 14 17:18:49 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> grant create user,create procedure,connect to newu with admin option;
Grant succeeded.
7-)Aynı işlemi newu user’I ile tekrar denediğimizde işlemin başarılı olduğunu
görüyoruz.Artık newu user’I bir role oluşturdu ve sahip olduğu izinleri bu role’e atayabildi.
SQL> conn newu/newu
Connected.
SQL> show user
USER is "NEWU"
SQL> grant create user,create procedure,connect to newrole;
Grant succeeded.
SQL> show user
USER is "NEWU"
8-)Daha sonra newu user I ile yeni bir kullanıcı tanımlıyoruz ve tanımlanan role’U yeni
tanımlanacak kullanıcya atıyoruz.
SQL> create user xxu identified by xxu;
User created.
SQL> grant newrole to xxu;
Grant succeeded.
9-)Aşağıdaki sorgularla NEWU ve XXU kullanıcları için sahip olunan privilege ve role’leri
görebiliriz.
18. Anar Godjaev
http://anargodjaev.wordpress.com/
SQL> select * from user_sys_privs where username = 'NEWU';
USERNAME
-----------------------------NEWU
NEWU
NEWU
NEWU
PRIVILEGE
ADM
---------------------------------------- --CREATE USER
YES
UNLIMITED TABLESPACE
NO
CREATE ROLE
NO
CREATE PROCEDURE
YES
SQL> conn xxu/xxu;
Connected.
SQL> select * from user_sys_privs where username = 'XXU';
USERNAME
PRIVILEGE
ADM
------------------------------ ---------------------------------------- --XXU
CREATE SESSION
NO
SQL> select * from user_role_privs where username ='XXU';
USERNAME
GRANTED_ROLE
ADM DEF OS_
------------------------------ ------------------------------ --- --- --XXU
NEWROLE
NO YES NO
SQL> conn newu/newu
Connected.
SQL> select * from user_role_privs where username ='XXU';
no rows selected
Bu komutlar dışında çeşitli alter komutlarıyla kullanıcılar için işlemler yapabiliriz.
Örneğin bir kullanıcının şifreisni değiştirmek istedik diyelim.
SQL > alter user newu identified by yeni_sifre;
Yada bir kullanıcıyı lock layalım yada lock‟ını kaldıralım.
19. Anar Godjaev
http://anargodjaev.wordpress.com/
SQL > alter user newu account lock;
SQL > alter user newu account unlock;
Kullanıcının default tablespace‟ini değiştirmek isteyelim.
SQL > alter user newu default tablespace DENEME;
Bunun dışında birçok etkili komut kullanılıp denenbilir.
Bunların dışında en dikkat edeceğimiz konulardan biride SYS schemasına ait data dictionary dediğimiz
objelerin UPDATE edilememsidir.bu tablolara dokunulmasını istemiyorsak
O7_DICTIONARY_ACCESSIBILITY adlı parametrenin değerini FALSE olarak ayarlamalıyız.