Tuesday, June 2, 2009

TRIGGER HAKKINDA KISA NOTLAR VE ÖRNEKLER

Kısaca en kaba tanımı veritabanıyla ilgili bir olay meydana geldiğinde veritabanının yapması gereken işleri tanımlar.
nedir bu olaylar birkaç örnek vereyim. Aşağıdaki örnekler arttırılabilir sadece ne amaç ile kullanıldığını anlamak için örneklerdir.
1-Tablolarda
  • insert
  • update
  • delete

2-Şemlarda

  • create table
  • alter table
  • drop table autid
  • rename
  • truncate
  • revoke

3- veri tabanı

  • login
  • logoff
  • shutdown
  • startup

TRIGGER KULLANMAK İÇİN YETKİLER

Triggerları kullanmak içi yetkilerinz olması gerekir bunlar nelerdir

  • tablo üzerinde işlem yapacaksanız ya tablonun sahibi yada tabloda ALTER yetkisi olması gerekir.
  • tablo bağlantılı ise ALTER ANY TABLE yetkisi olması gerekir. (trigger tabloda değişiklik yapacak onun için gerekli)
  • CREATE TRIGGER yetkisine sahip olmalı , başkasının şemalarını kullanacak isenizde CREATE ANY TRIGGER yetkisi gerekir. (yaratmak için de sistem yetkisne ihtiyacınız var herkezde olması sacma olmaması kacınılmaz bi durum . :)))

ayrıca önemli bir not belirtek gerekiyor.trigger lar için yetkileri rollerden veremezsiniz. yetkilendirme işlemini tetikleyici oluşturan tarafından yapılmalıdır.

TRIGGER TİPLERİ

Satır düzeyinde

INSTEAD OF triggerları

şema triggerları

BEFORE ve AFTER triggerları

yordam düzeyinde

diye gruplamak mümkündür.

ÖRNEKLER

--önce tabloyu oluşturalım

CREATE

TABLE EMPLOYEE

(

ID

VARCHAR2(4 BYTE) NOT NULL,

FIRST_NAME

VARCHAR2(10 BYTE),

LAST_NAME

VARCHAR2(10 BYTE),

START_DATE

DATE,

END_DATE

DATE,

SALARY

NUMBER(8,2),

CITY

VARCHAR2(10 BYTE),

DESCRIPTION

VARCHAR2(15 BYTE)

)

-- tabloyu görelim

select

* from Employee ;

-- triger yarayalim

CREATE

OR REPLACE TRIGGER HR.emp_biu BEFORE INSERT OR UPDATE of salary on employee for each row

declare

v_error

VARCHAR2(2000); begin if :new.salary > 10000 then

v_error

:=:old.first_name||' cannot have that much!'; raise_application_error(-20999,v_error); end if;

end;

/

-- bir veri ekleyelim

insert

into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('08','James', 'Cat', to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 11232.78,'Vancouver', 'Tester');

--bunu ekleyince trigger calişacak ve uyarı verecek maaş cok fazla diye

insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('08','James', 'Cat', to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 1000.78,'Vancouver', 'Tester');

-- maaş değerini düşürürsek eklemeyi düzgun yapacaktir.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

tabloya daha fazla ekleyelim insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values ('01','Jason', 'Martin', to_date('19960725','YYYYMMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto', 'Programmer'); insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('02','Alison', 'Mathews', to_date('19760321','YYYYMMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver','Tester'); insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('03','James', 'Smith', to_date('19781212','YYYYMMDD'), to_date('19900315','YYYYMMDD'), 6544.78, 'Vancouver','Tester');

insert

into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('04','Celia', 'Rice', to_date('19821024','YYYYMMDD'), to_date('19990421','YYYYMMDD'), 2344.78, 'Vancouver','Manager');

insert

into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('05','Robert', 'Black', to_date('19840115','YYYYMMDD'), to_date('19980808','YYYYMMDD'), 2334.78, 'Vancouver','Tester');

insert

into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('06','Linda', 'Green', to_date('19870730','YYYYMMDD'), to_date('19960104','YYYYMMDD'), 4322.78,'New York', 'Tester');

insert

into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('07','David', 'Larry', to_date('19901231','YYYYMMDD'), to_date('19980212','YYYYMMDD'), 7897.78,'New York', 'Manager'); insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description) values('08','James', 'Cat', to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 1232.78,'Vancouver', 'Tester');

bu veriler üzerinde trigger denemelaeri yapacağiz.

tablodan veriler silmek istiyoruz ama hangilerini sildiğimi görmek de istiyoruz silme işlemi tamamlandıktan sonra. bu işlem için aşağidaki triggerı kullanabilriz.

SET SERVEROUTPUT ON aktif hale getiriniz.


CREATE
OR REPLACE TRIGGER SilGoster -- trigger a SilGoster diyelim

BEFORE DELETE ON employee -- employee tablosu üzerinde silme iþleminden önce çaliþ FOR EACH ROW --her satiri etkilemesini istiyoruz. DECLARE

v_Silinen

employee%ROWTYPE; BEGIN

-- teker teker silinenleri v_Silinen içine aliyoruz

v_Silinen

.first_name := :old.first_name;

v_Silinen

.last_name := :old.last_name;

DBMS_OUTPUT

.put_line(v_Silinen.first_name);

DBMS_OUTPUT

.put_line(v_Silinen.last_name); END SilGoster; /

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

triggerların UPDATE INSERT VE DELETE işlemlerinde nasıl çaliştiğini gösteren genel bir örnek. yuakrıdaki tablo yapısını kullanınız.

create or replace trigger deg_goster
before update or delete or insert on employee
for each row
declare
v_ChangeType CHAR(1);
BEGIN

IF INSERTING THEN
v_ChangeType := 'I';
ELSIF UPDATING THEN
v_ChangeType :='U';
ELSE
v_ChangeType :='D';
END IF;
DBMS_OUTPUT.put_line(v_ChangeType || ''|| user||''||sysdate);
END deg_goster;
/

No comments: