WordPress 2.5.1 yüklendi
6 May 2008 – 12:14sql.manyaklari.org’yi wordpress son veriyonuna yükselttik. Patlama çatlama olmaması dileğiyle ![]()
Yemeği “select yemek from tencere where yemek=’mantı’ union select ’sarımsaklı yoğurt’” diye sipariş edenlerin sitesi
sql.manyaklari.org’yi wordpress son veriyonuna yükselttik. Patlama çatlama olmaması dileğiyle ![]()
Sybase ASE’nin pek kullanılmayan özelliklerinden biri de Java sınıflarını çalıştırabilme özelliğidir. Sybase veritabanı sunucusuna Java sınıflarını kullanarak veri erişimi ve MD5 hesaplayabilme yeteneği ekleyeceğiz.
Sybase’de Java’nın özellikleri sınırlı bir kullanıma sahiptir. Kullanılan sanal makina Java 1.1 ile derlenmiş kodları çalıştırabilir. Bunun anlamı yüklenecek sınıfların 1.1 olarak derlenmiş olması gerektiğidir. Bu sanal makine içerisinde java.io paketi (GÇ fonksiyonları) kullanılamaz, Thread açılamaz, grafiksel gösterimler yapılamaz. Buna karşılık JDBC kullanılarak veriler değiştirilebilir ve tabii ki hesaplamalar yapılabilir.
İlk örneğimiz JDBC’nin üzerinde çalıştığı sunucuya bağlanması ile kullanımı. Bu sayede bir sorgu içerisinde kullanmak için normalde prosedür ve cursor kullanarak yapacağımız işlemleri daha basitleştirmiş oluyoruz:
public class Test {
public static java.sql.Timestamp sistemTarihi() throws java.sql.SQLException {
java.sql.Connection con = java.sql.DriverManager.getConnection("jdbc:default:connection");
java.sql.Statement stmt = con.createStatement("select sistemTarihi from sistemTablosu");
java.sql.ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return rs.getTimestamp(1);
}
return null;
}
Manyak Not: Bu sınıfta sadece URL değişimi yapıp Jconnect URL’i yazarsak başka bir sunucuya da bağlanabiliriz.
Yazdığımız kodu sunucuya önce derleyip, jar halinde yüklüyoruz. Yükleme işlemi tek tek sınıf halinde de yapılabilir. Derleme işini daha önce de belirttiğimiz gibi Java 1.1′e göre özel parametrelerle yapmamız gerekir. Jar haline getirme işi ise her zaman yaptığımız gibi:
javac.exe -source 1.3 -target 1.1 *.java
jar.exe cf0 test.jar Test.class
%SYBASE%\%SYBASE_OCS%\bin\instjava -STESTSERVER -Usa -P -Dtestdb -f test.jar -j test
Yazdığımız kodu sunucuya tanıtıyoruz:
create function sistemTarihi() returns datetime
called on null input nondeterministic exportable
language java parameter style java
external name 'Test.sistemTarihi()'
Bu tanımlama ile artık şu sorguyu yazabiliyoruz:
select * from islemler where islemTarihi = sistemTarihi()
Sybase ASE’ye statik bir fonksiyonu kullanmayı öğrendik. Şimdi ise durum bilgisi tutabilen bir sınıf yükleyeceğiz. Bu sayede istenilen sayıda veri üstüste eklenerek bir MD5 hesaplanabilecek.
İlk iş olarak Java 1.1 ile derlenebilen bir MD5 fonksiyonu bulmamız gerekiyor. Bunun için bir MD5 uygulaması indiriyoruz. Bu uygulama içerisinden MD5 ve MD5State sınıflarını kullanacağız. Bu sınıflardaki dosya okuma işlemlerini ve geri kalan sınıfları ise silebiliriz. Bu java dosyalarının aynı dizinde olduğunu düşünerek derleme, paketleme ve yüklemeyi yapıyoruz:
javac.exe -source 1.3 -target 1.1 *.java
jar.exe cf0 test.jar com/*
Bir sınıfı kullanmak için fonksiyonlarını tanımlamaya gerek yoktur. Hemen kullanabiliriz:
declare @md5 "com.twmacinta.util.MD5"
select @md5 = new "com.twmacinta.util.MD5"()
select @md5 = @md5>>"Update"('a')
select @md5>>Final()
Yukarıdaki kod a harfinin MD5 hesaplamasını yapıp select eder. Eğer MD5 hesaplamasını bir fonksiyon halinde yapmak istersek Test sınıfımıza bir metod ekleyerek bunu hesaplatabiliriz:
public static byte[] calcMD5(String s) {
MD5 md5 = new MD5();
md5.update(s)
return md5.Final();
}
Bu fonksiyonu sorgularımızda tanımlama yaparak ya da yapmayarak kullanabiliriz. Tanımlamazsak:
select convert(varchar(50), "Test".testString('aa'))
Bir SQL fonksiyonuna tanımlamak için ise:
create function MD5(s varchar(255)) returns varbinary(32)
called on null input deterministic exportable
language java parameter style java
external name 'Test.calcMD5(String)'
Son olrak referans olmak üzere Java sınıflarına karşılık gelen Sybase veri tiplerinin listesini çıkartalım:
| SQL type | Java type |
| char, varchar, text, nchar, nvarchar, unichar, univarchar, unitext |
String |
| numeric, decimal, money, smallmoney | java.math.BigDecimal |
| bigint, unsigned bigint, | java.math.BigInteger |
| bit | boolean |
| tinyint | byte |
| smallint | short |
| integer, unsigned smallint | int |
| unsigned int | long |
| real | float |
| float, double | double |
| date | java.sql.Date |
| time | java.sql.Time |
| datetime, smalldatetime | java.sql.Timestamp |
| binary, varbinary | byte[] |
| image | java.io.InputStream |
Yüklenilen jar sql üzerinden kaldırılabilir. Tanımladığımız fonksiyonları drop function ile sildikten sonra şu komut ile kaldırılabilir:
remove java jar test
MD5 hesaplamasını gerçekleştirdik ve Sybase’de henüz bulunmayan stored function özelliğini ekledik.
Manyak mutlu kodlamalar…
Vinnie
toddy daha önce Sybase’de bu komutu kullanmayı bize öğretmişti. Bu yazımızda ise karşılaşacabileceğimiz sorunlara değineceğiz.
Server Message: Number 10330, Severity 14
Procedure ‘xp_cmdshell’, Line 2:
EXECUTE permission denied on object xp_cmdshell, database sybsystemprocs, owner dbo
(return status = -4)
Bu sorun komutu veren kullanıcının bu komutu çalıştırma yetkisi olmadığını gösterir. Çalıştırmak için bu yetkinin “sa” kullanıcısı tarafından verilmesi gerekir:
use sybsystemprocs go grant exec on xp_cmdshell to public
Manyak Not: Burada örnek olarak çalıştırma hakkını herkesin üye olduğu “public” adlı gruba vermiş olduk. Bu pek güvenli birşey değildir.
Server Message: Number 11488, Severity 10
Server ‘XP Server’, Line 0:
User access denied. Not a member of NT administrators group.
(return status = 1)
Windows sistemlerde bu komutu çalıştırırken sybase sistemde çalıştıran login adı ile aynı isimli bir kullanıcıya geçerek komutu çalıştırır. Bu hatayı alma neden ise ya böyle bir kullanıcının olmaması ya da kullanıcının “Administrators” grubuna dahil olmamasıdır. Kullanıcıyı tanımlayıp bu gruba eklediğimizde ise başarıyla çalıştırıyoruz.
İşletim sisteminin kontrol parametrelerinden bu kontrolün yapılamamasını da sağlayabiliriz. Bunun için de şu komutu vermemiz yeterli:
sp_configure ‘xp_cmdshell context’, 0
Bu adresten Sybase 15.0.3 ASE Geliştirici versiyonunu indirebilirsiniz. Production sistemlerinde kullanılamaz ama Sybase ile geliştirme çalışmalarında kullanılabilir. Tüm lisanslanması gereken özellikleri açık şekilde geliyor.
Oracle’da cursor kullanımı
declare
vRC1 SYS_REFCURSOR;
vTemp acc_def%rowtype;
begin
OPEN vRC1 FOR SELECT * from acc_def;
loop
fetch vRC1 into vTemp;
exit when vRC1%notfound;
dbms_output.put_line(':'||vTemp.id_no || '-'||vTemp.description);
end loop;
end;
Sql ile çalışırken yapılan işlem sonucunda kaç kayıdın etkilendiğini bilmek isteyebiliriz.
Sybase / MsSQL:
delete from Table
select @@rowcount
Oracle:
begin
delete from Table;
DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
end;
mySQL (version 5.0.1′den sonrası):
delete FROM Table;
select row_count();
Veritabanındaki nesne, kullanıcı, grup ya da rollerin yetkilerini gösterir.
Kullanımı:
sp_helprotect [name [, username [, "grant" [,"none"|"granted"|"enabled"|role_name]]]]
Örnek:
sp_helprotect manyak_tablo — bu tabloya verilmiş olan tüm yetkileri gösterir
sp_helprotect toddy — toddy kullanıcısına verilen tüm yetkileri gösterir.
sp_helprotect manyak_rol — manyak_rol rolünün yetkilerini gösterir.
sp_helprotect toddy, null, null, ‘granted’ — toddy kullanıcısına ‘grant’ edilmiş tüm nesneleri gösterir
java.manyaklari.org sitemizde güzel bir yazı yayınlanmış. Eğer Javada Oracle stored prosedürleri ile kayıt toparlamak istiyorsanız buyurun buradan yakın:
dsync nedir?
Sybase devicelarının bir özellği olan dsync; veritabanına gelen tüm işlemlerin diske yazılma garantisini sağlamak için kullanılır. Unixteki “raw device” lar için geçerli olmayıp fiziksel disk için geçerlidir.
ne işe yarar?
Eğer bu seçenek açık ise o an veritabanına birşey olduğunda diskte son bilginin yazılı olması garantidir. Fakat performans kayıplarına sebep olması ihtimali vardır. Ttempdb’lerde “off” olması ve hayati veri olan veritabanında “on” olması tavsiye ediliyor.
nasıl ayarlanır?
1. disk init, disk reinit:
normal komutun sonuna “,dsync=false|true” yazın.
2. sp_deviceattr:
sp_deviceattr <device_adi>, dsync, false|true
Verilen bir tablo, view veya veritabanı nesnesi için kaç sayfalık(page) yer ayırıldığını verir.
Notasyon:
reserved_pgs(object_id, {doampg | ioampg})
object_id: nesnenin sysobjects tablosunundaki numarası
doampg tabloyu, ioampg ise index’leri gösterir.
Örnek:
select reserved_pgs(manyak_tablo, doampg) -- bize manyak_tablo'nun tablosu için kaç sayfa ayırıldığı bilgisini verir.
Dikkat:
Bu komuta verdiğiniz nesnenin yer aldığı veritabanında olmanız gerekiyor. Aksi halde nesneyi bulamaz.