number to_tıme() metodu hazırlama

 

Çok defa başıma gelmiş ancak her seferinde farklı kodlarla çözdüğüm bu işi 
metoda dökmek istedim.

Elimizde bir numara var ve biz bunu saniye cinsinden; time formatında bir değere
kolay bir şekilde çevirmek istiyoruz. 
Öncelikle IN parameter olarak numara alan ve geriye tarih ve saat döndüren 
bir metod yazalım ve bunun çağrılışına bir örnek verelim. 


create or replace Function NumberToTime(p_number in Number) return date is
  v_time   varchar2(8) := '00:00:00'; -- ilk değer atamalarımızı yapalım...
  v_Result date := to_date(trunc(sysdate) ||' '||  v_time, 'dd.mm.yyyy hh24:mi:ss');
begin
  -- gelen parametre dolu ise kodumuz çalışmalı
  -- sıfırdan büyük rakamlar için çalışmalı
  if p_number is not null and p_number > 0  then
    select to_char(trunc(p_number / 3600), 'FM9900') || ':' || 
           to_char(trunc(mod(p_number, 3600) / 60), 'FM00') || ':' ||
           to_char(mod(p_number, 60), 'FM00')
      into v_time
      from dual;
  end if;

  v_Result := to_date(trunc(sysdate) ||' '|| v_time, 'dd.mm.yyyy hh24:mi:ss');
  Return(v_Result);
Exception
  When Others Then
    -- herhangi bir hata olursa, 
    -- sysdate dönecektir.
    Return(v_Result);
end NumberToTime;


------------------------------------
-- call
select NumberToTime(121) from dual;
20.09.2014 00:02:01

------------------------------------

Metodumuza 121 diye bir rakam gönderdim; geriye 2 dakika 1 saniye olarak dönmüş oldu.
Bu şekilde bir numaranın, nasıl date time'a çevrildiğini öğrenmiş olduk.

 

Oracle Logon Trigger

Bir Database'in olmazsa olmazı,
Loglama, Güvenlik...

Bu yazımızda oracle logon triggerından bahsedeceğiz. 
Yapı itibariyle diğer triggerlardan çokta farkı yok aslında(syntax aynı) 
sadece tablo yerinde database'e bağlandığında bir iş yapmasını istiyoruz. 
Yazımı aşağıdaki şekildedir.

create or replace trigger trg_logonDB
after logon on database
declare
  Cursor c is
    Select * from v$session where audsid = userenv('sessionid');

  cp         c%rowtype;
  rp         logonhistory%rowtype;
  v_ipadress varchar2(1000);
  v_host     varchar2(1000);
  v_module   varchar2(1000);
begin
  -- Cevheri 13.09.2014
  -- db'ye login olan tum userlari takip edelim

  open c;
  fetch c
    into cp;
  close c;

  -- oracle'in kendi baglantilarini es gecelim..... 🙂
  if cp.type != 'BACKGROUND' then

      ---------------------------------------------------------------------
      select SYS_CONTEXT('USERENV', 'IP_ADDRESS') into v_ipadress from dual;
      select SYS_CONTEXT('USERENV', 'HOST')       into v_host     from dual;
      select SYS_CONTEXT('USERENV', 'module')     into v_module   from dual;



      ---------------------------------------------------------------------
      -- Rapor icin log tutmaya gerek yok
      -- Forms icin log tutmaya gerek yok
      if upper(v_module) not in('FRMWEB.EXE', 'REPORTS.EXE') then

        rp.kullaniciad      := cp.username;
        rp.username         := cp.osuser;
        rp.ip_address       := v_ipadress;
        rp.host_name        := v_host;
        rp.operating_system := v_module;
        rp.language         := userenv('LANG');
        rp.time_zone        := null;
        rp.logondate        := sysdate;
        rp.logoutdate       := null; -- logof triggerinda dolduracağız 🙂
        rp.dbusername       := user;
        rp.sid              := cp.sid;

        insert into logonhistory values rp;
        commit;

      end if;
  end if;

-- Güvenlik kısmına geçelim. 🙂 istediğine izin ver 
begin
  if sys_context('userenv', 'ip_address') ='192.168.1.1' then
    DbHata('Giriş Yasak .....');
  elsif sys_context('userenv', 'session_user') in ('PATRON') then
    DbHata('Şifreniz Bloke Olmuş :(');
  end if;
end;


exception
  when others then
    DbHata(sqlerrm);
end tr_logonDB;

işte bu kadar... logon triggerımız artık db'ye kim bağlanırsa bağlansın
loglama, güvenlik işlemlerini yapacaktır.