31 Aralık 2007
2007'nin Bıraktıkları
Veritabanı ve Pazarlama
İnternetin pazarlama faaliyetlerinde kullanılmaya başlanmasının ülkemiz için yeni olduğunu söyleyebiliriz. Bilgi toplama konusunda zamanla daha doğru düzgün yöntemler kullanılmaya başlanıyor. Ama hala buradaki en ciddi problem bu tarz işlerin teknik olmayan veya yeterli düzeyde donanıma sahip olmayan kişiler tarafından üstlenilip yönlendirilmesi.
Web 3.0 ve Servis Odaklı Mimari
Burada tekrarlamak istediğim şey, bu standartların bir moda gibi düşünülüp kendi başında değerlendirilmemeleri. Kullanım alanına uygun olarak bu parçalardan doğru olanları uygulamalara yerleştirmemiz.
Web 3.0 yazılımcısı olmak
Artık kaliteli uygulamalar için web platformunda web yazılımcılarının değil daha nitelikli yazılımcıların çalışması gerektiğinden bahsetmiştim. Aslında o günlerde piyasada nitelikli yazılımcı bulmanın zorlaştığı bir döneme girdik. Böyle bir ortamda bu ne kadar mümkün olacak tartışılır.
Programlanabilir Web
Google'ın Open Social ile Facebook un karşısındaki gövde gösterisi Türkiye için kayda değer bir sonuç vermedi aslında. Facebook için geliştirilen uygulamalar hızla artıyor. Zamanla artık ayakta kalabilen saman alevi gibi olmayan uygulamarın daha revaçta olacağını düşünüyorum. Ama bunun da ne kadar süreceğini yine bekleyip göreceğiz.
Herkese mutlu yıllar :)
11 Aralık 2007
Veritabanı İsimlendirme Kuralları
Tablo isimlendirmesi:
- Tablo isimleri çoğul olmalıdır şeklinde bir kural var. Fakat çift kelimeli tablolar kullandığımızda bir sıralama problemi yaşamamız mümkün. Yani Users ve UserAnswers şeklinde bir sıralamada UserAnswers daha önde olur. Bu yüzden şahsi görüşüm temel tabloları tekil olarak isimlendirmenin daha doğru olduğu yönünde.
- Birden fazla kelimeli tablo isimlerinde sadece son kelime çoğul olmalıdır. Örneğin UserAnswers.
- tbl gibi bir prefix hiç bir anlam ifade etmediği için kullanılmamalıdır. Prefix olarak projenin kısaltılması kullanılabilir. Örneğin Google Analytics projesi için GaUser şeklinde bir isimlendirme olabilir.
- Tablo isimlerinde _ kullanılmamalıdır
- SQL cümlelerinde SQL terimlerinin tamamı büyük harfle kullanılmalıdır
- Developer dışında kişilerin de database i kullanma ihtiyacı olacağı için hiç bir kısaltma kullanılmamalıdır
- Çoka çok ilişkilerde iki tablo ismi de çoğul kullanılması önerilir. Ama son kelimenin çoğul kullanılma kuralı ile karmaşa yaratacağı için bu durumda da son kelimeyi çoğul olarak kullanmak daha tutarlı olacaktır. Örneğin EmployeeCustomers
Kolon isimlendirmesi
- User tablosu için UserId alanı key alan için kullanılabilir. Fakat SQL Server'da I küçük harfle i nin karşılığı olmadığı için dilimize özgü olarak tüm Id ifadelerinin id olarak yazılmasını öneriyorum. Örneğin Userid,Cityid.
- Yabancı anahtarların isimleri ana tablodaki alan isimleriyle aynı olmalı. Örneğin City tablosunda alan Cityid olarak kullanıldıysa id değerin tutulduğu User tablosunda da Cityid olarak kullanılmalıdır.
- Birden fazla alanın PK olduğu tablolarda id isiminde bir alan kullanılmamalıdır.
- Kolon isminde kln, fld gibi prefixler kullanmak gereksizdir. Sadece alan IntUserid şeklinde alan tipi prefix olabilir ama bu da pek önerilen bir şey değildir.
- Vw prefix iyle başlamalıdır.
- İki tablo join edilerek bir view oluşturuluyorsa isimde iki tablo da kullanılmalıdır.
- Create,Get,Update,Delete,Set gibi fiil ifadeler isimde prefix olarak kullanılabilir. Örneğin GetUserInformation.
- "sp_", "xp_" veya "dt_" gibi prefixler kullanıldığında önce master tabloya bakılıp aranacağı için bir performans kaybı yaratır. Kesinlikle kullanılmamalıdır.
18 Kasım 2007
Full Text Index
Yani
şeklinde 4 kullanımı var.
textcolumn kolonu üzerinde "bugün" geçen tüm kayıtları listeleyebiliriz. Diğer komutlarla daha farklı seçenekler mevcut.
02 Kasım 2007
Programlanabilir Web
Çok geriye gitmeden herhangi bir web tabanlı uygulamasında döviz bilgilerini göstermek için harcadığımız çabayı ele alalım. Bir bankadan bu bilgiyi almamız arada bir iş ortaklığı yoksa hala zor gibi görünüyor. Burada aslında kritik nokta verinin değerli olmasıydı. İçerik sağlayıcı bu içerik için bir maliyet harcıyor ve doğal olarak bunu ücretsiz vermiyordu. Web 2.0 ın içeriği kullanıcının yaratması özeliğiyle aslında maliyeti çok da fazla olmayan bir veri topluluğuna sahip olunabiliyor.
Bir facebook uygulamasından örnek verelim. Siz benim yazdığım bir facebook uygulamasını kullanmaya başlarsanız ben geliştirici olarak sizin ve arkadaşlarınızın profil bilgilerini alabiliyorum. Burada insanların facebook kullanırken açık olma özelliğini varsayarsak bu ayrıntı çok da önemli değil. Yani CRM kapsamında insanların çok büyük maliyetlerle elde ettiği profil bilgilerine ulaşmak mümkün oluyor. Bunu sadece sosyal ağ ile sınırlandırmazsak business anlamında çok daha fazla açılım yapması muhtemel görünüyor.
İdris Cin'in belirttiği şekilde sadece programlanabilir web uygulamaları için uygulama geliştiren yazılımcılar oluşmaya başlayacak. Diğer taraftan veriyi elde etme maliyetlerinin düştüğünü varsayarsak bu verilerin bilgiye dönüşme ve bunların gerçek uygulamalarda bir aksiyon olarak kullanılma konusu daha da önem kazanacak. Aslında şu aralar her şeyin daha hızlandığı ve belirsizliğin arttığı, stratejilerin anlık olarak değişebileceği bir döneme giriyoruz. Daha fazlasını bekleyip göreceğiz.
28 Ekim 2007
Assocıatıve (Çağrısımsal) Model Database
Aslında ilişkisel veritabanı modelinin daha katı kuralları olan ve net veriler söyleyen bir model olduğunu söyleyebiliriz. Semantic web in doğası da aslında metadataya (veri hakkında veri) dayanmakta. Yani herşeyin siyah ve beyaz olmayıp gri tonların değerlendirilmesi; bir nevi bulantık mantık yaklaşımı.
Bir giriş niteliğinde fikir oluşması açısından Mike Griffiths 'in 2001 yılında yazdığı makaledeki örnekler üzerinde duracağım.
Verilerimiz aşağıdaki cümleler olsun.
"Red is a Colour"
"Mary is a Vegetarian"
"Vegetarians eat Plants"
"Cardiff is located in Wales"
"Wales is part of the UK"
Bu verileri ilişkisel bir veritabanında tutmak isteseydik çeşitli unsur tablolarına ve özelliklerinin tutulacağı ilişkisel tablolara ihtiyaç duyacaktık. Ama 5 cümlenin de birbirinden alakasız fiil ve özellikler içermesi sebebiyle ilişkisel model bir hayli zahmetli olacaktı.
Associative model kullanarak bu cümleleri saklamak istediğimizde 2 tabloya ihtiyacımız olacak. İlki nesne, fiil ve özelliklerin saklandığı Items tablosu, İkincisi ise bu item ların ilişkilerinin tutulduğu Links tablosu
Items
Items (1. tablo)
Identifier Name (Tablo alanları)
12 Red
41 Is a
76 Colour
14 Mary
81 Vegetarian
43 Eats
82 Plants
15 Ski Lessons
39 Start at
83 08:00
42 On
85 Sunday
Links (2. tablo)
Identifier Source Verb Target (Tablo alanları)
101 12 41 76
103 14 41 81
124 81 43 82
105 15 39 83
107 105 42 85
Burada göze çarpan en önemli nokta link tablosundaki bir elemanın farklı bir elaman içerinde bir kaynak olarak kullanılabilmesi. Verileri dikkatli bir şekilde incelediğinizde sanırım bu model hakkında bir miktar fikir sahibi olacaksınız.
Note:This picture has been taken from flickr.
01 Ekim 2007
Web 3.0 Yazılımcısı Olmak
Ben web 3.0 ile birlikte bu 2. grubun işlevselliğinin azalacağını düşünüyorum. Çünkü servis odaklı mimarilerde web sayfaları sistemin merkezi değil bir parçası konumuna geliyor. Bu modelde işleyen yapıların görünmeyen kısmının görünen kısmından daha etkili olacağı düşünülürse web sayfalarının kullanım oranının düşmesi beklenen bir sonuç olacaktır.
Ülkemizde hala yükselmekte ve yaygınlaşması sürmekte olan bir konu olduğu için bu trendlerin işleyisi zamansal olarak biraz farklılık gösterecektir.
Artık bir web yazılımcısından çok iyi bir database tasarımı, performanslı ve güvenilir servisler ile bunların çerçevesinde ciddi altyapılar beklenecektir. Bu beklenti de sanırım birinci gruptaki yazılım odaklı kişilerin yöneleceği bir boşluk olacaktır.
Son günlerin trend sitesi Facebook'u web 3.0 ve bu geçiş süreci için örnek kabul edebiliriz. Facebook bir web sitesi, ama aynı zamanda bir uygulama geliştirme platform altyapısı sunuyor. web 3.0'ın programlanabilir web tanımlaması da aslında bunu gerektiriyor.
Web 3.0'ın bir diğer odağı semantic web için de durum aynı şekilde. Artık database işlemleri kayıt ekle, sorgula sürecinden çok fazla uzaklaşıyor. Geliştiriciden ihtiyaca çözüm olacak algortimaları öğrenmesi ve kullanması beklenecektir. Üzerinde biraz daha kafa yorulması bir gereklilik olacaktır.
Aslında burada bahsettiğimiz konu büyük web uygulamalarının gideceği bir yol gibi görünse de zamanla her web uygulamasından servis beklentisi olacaktır. Örneğin başka platformlara servis vermeyen bir e-ticaret sitesinden bahsedemeyeceğiz. Kişisel web sitelerinde dahi rss benzeri hizmetlerin olması kaçınılmaz. Bu durumda da tüm bu servislere uygun derli toplu altyapılar olacaktır. Aslında web sitelerinin veritabanlarına ve bunun etrafındaki servislere dönüşeceğini söyleyebiliriz.
Bir çoğumuzun programcılığı öğrendiği lokal uygulamaların artık büyük ölçüde değerlerini yitirmesi gibi web uygulama geliştirmenin de zamanla değerini yitireceğini söyleyebiliriz.
İşin ilginç yanı bunları hala web uygulamalarının daha yeni yeni oturduğu ve büyüyen bir trend izlediği bir ülkeden söylememiz. Web 2.0 'ın "geldi, yaşandı, bitiyor" veryansınları arasında hala anlaşılamaması ve hala yeni bir yaklaşım gibi sunulup insanları heyecanlandırması gibi.
Note:This picture has been taken from flickr.
28 Eylül 2007
Newid Ve Newsequentialid Arasındaki Fark
Database'in GUID üretmesi için kullandığımız NewId ile, default değeri artan sayı olan durumların birleşimi olarak düşünebiliriz. Yani sıralı Guid üreten bir fonksiyon.
Bu fonksiyon sadece default değer olarak kullanılabilir. Kullanımı aşağıdaki şekildedir.
create table test(
colA uniqueidentifier DEFAULT NEWSEQUENTIALID(),
colB varchar(20)
)
insert into test (ColB) values ('aa')
insert into test (ColB) values ('bb')
insert into test (ColB) values ('cc')
insert into test (ColB) values ('dd')
eklemeleri sonucunda ColA varsayılan değer olarak aşağıdaki şekilde oluştu.
6EAF72CF-E96D-DC11-BD20-0011D8A6F316
6FAF72CF-E96D-DC11-BD20-0011D8A6F316
F0D309E7-E96D-DC11-BD20-0011D8A6F316
F817F4F1-E96D-DC11-BD20-0011D8A6F316
Fakat bu fonksiyon güvenlik gerektiren bir uygulamada kullanılamamalıdır. Çünkü değerler sıralı olduğu için kolayca tahmin edilebilir. Bu durumda NewId daha doğru bir tercih olacaktır.
24 Eylül 2007
And Operatörü ile Sorgulama
Örnek verecek olursak;
Bazı durumlarda bir değerin bulunan kayıta göre iki farklı alandan alındığı durumlar olabilmekte. Örneğin müşteri tablomuzda name,surname ve firmname isimli alanlar olsun.
Name ve surname alanları boşsa müşteri ismi firmname kolonundan alınsın.
Eğer biz A ile başlayan müşterileri sorgulamak istersek;
(name like 'A%' and firmname is null) or (firmname like 'A%' and name is null)
şeklinde yazabildiğimiz sorguyu ;
(firmname is null and name like 'A%' ) or (name is null and firmname like 'A%')
şeklinde yazarsak daha performanslı çalışır. Performans kazancı koşulların çok olduğu cümlelerde artacaktır.
19 Eylül 2007
Web 3.0 ve Servis Odaklı Mimari
Burada bir parantez açmak gerekirse bunlar zaten hepimizin bir şekilde uyguladığı ve kullandığı yapılar. Web 2.0, Web 3.0 veya herhangi bir yaklaşımı sıfırdan oluşan şeyler olarak düşünmemek gerekiyor. Sadece benzer özelliklerin bir grupta toplanıp ortak standartların yakalanması olarak düşünebiliriz. Yoksa siz zaten web 2.0, web 3.0 veya herhangi bir standart özelliğini kullanıyor olabilirsiniz. Ayrıca uygulamanın sadece bir standart özellikleri de taşıması şart değil.
SOA kavramı ile beraber ikinci büyük yeniliğin semantic web olduğunu söyleyebiliriz. Semantic web, Hakia arama motoru ile bilinirlik kazanan mantıksal arama yaklaşımı. İçeriğin anlamını anlamaya odaklı bir yöntem. Klasik indeksleme ile bir web sayfası içerdiği kelimelere göre indekslenirken, bu yaklaşımda web dökümanının tümü düşünülerek bir indeksleme yapılmaktadır. Yani herhangi bir kelime, sadece gerçek anlamıyla değil bulunduğu konum itibariyle de anlamlandırılımaktadır. Semantic web için temel veri modeli olarak RDF (Resource Description Framework) kullanılabilir.
17 Eylül 2007
Oracle'da Triggerlar
15 Eylül 2007
Microsoft Terminolojisi
Bir kısmı sadece Microsoft'a özel kelime grupları olmakla beraber büyük bir kısmı uluslararası yazılım geliştiren firmalar için faydalı olacaktır. Aslında her yazılım üreten firma için en azından bir kaç dilde bir terminoloji hazırlamak uygulama kalitesini arttıracaktır. Özellikle sektör spesifik yazılım üreten firmalar için bu çok daha önemli.
14 Eylül 2007
Tafiti Arama Motoru
Microsoft Tafiti adıyla Silverlight teknolojisinin kullanımını göstermek amacıyla live search ile entegre çalışan bir arama motoru geliştirdi. Microsoft klasik bilinirlik arttırma yaklaşımıyla görsel öğeleri ön plana çıkarmış. Ayrıca sonuçların ağaç yapısı ile gelmesi ilginç bir özellik olmuş. Silverlight ile uygulama geliştirmenin .net geliştiricileri için bir avantaj olduğundan daha önce bahsemiştim. Bunlar iyi tarafları.
Fakat kullanıcı olarak bu arama motorununun Google'a alternatif olabileceğini zannetmiyorum.
Nedenleri;
* Arama motoru için görsellik ne kadar önemlidir?
* Live Search arama motoru ve Google ile arasında ciddi performans farkları var.
* 1 sn nin altı sonuçlar getiren bir uygulama için ilk sayfa açılışının bir kaç sn sürmesi ne kadar uygun.
Son olarak da eğer Google böyle bir siteyle çıksaydı acaba bu kadar yaygın kullanılabilir miydi?
Ben Microsoft'un bu girişiminin sadece Silverlight bilinirliğini arttırmaya yönelik olduğu kanısındayım.
28 Ağustos 2007
Bir Servis Olarak Business Intelligence
Günümüz BI uygulamalarına baktığımızda çoğunlukla canlı olmayan ve işlenmiş verilerden raporlama yapılıyor. Gerçek zamanlı BI mimarisindeki hedef verilerin canlı olarak gelmesi.
Aslında klasik BI çözümlerine bir alternatif olarak sunulması pek de olanaklı değil. Belki uygulamalarının bir kısmının SaaS olarak sunulması düşünülebilir.
Tasarım ve uygulama aşamasının ay mertebesinden günler mertebesine inmesi sektör ve kurum bazlı özel analiz süreci dolayısıyla yine sıkıntı yaratacaktır.
Kurulum takımının son kullanıcı olarak oluşması yine son kullanıcıların gelişimiyle alakalı. Şu anki Türkiye şartlarında bunu son kullanıcıdan beklemek pek de olabilir gelmiyor.
Özet olarak şahsi görüşüm SaaS mimarisindeki BI çözümlerden önce raporlanan datanın tam zamanlıya çok yaklaşması aşaması doğru bir geçiş olacaktır.
25 Ağustos 2007
Veritabanı Tarafında Sayfalama (Paging)
Oracle için;
select * from (
select rownum rnum from (
select * from table
) t1
) where rnum between 101 and 200
Sql Server 2005 için (AdwentureWorks veritabanını kullandık)
select AddressLine1,City, ModifiedDate
from (select AddressLine1,City,ModifiedDate,row_number() over (order by
ModifiedDate desc)
as rnum from Person.Address) as RnumAdress
where rnum >= 101 and rnum <= 200
Fakat bu yapıların tek dezavantajı raporlama anında kayıt değişiklikleridir.
Örnek verecek olursak;
Sitede bir panelde online 100 kişi 10'arlı sayfalar halinde siteye giriş sırasına göre gösteriliyor. Eğer bu gezinme esnasında siteye yeni kişiler girerse bu kayıtlarda kaymalar olacaktır. Sayfalarda ilerlemeye devam ettikçe bir önceki sayfanın sonundaki kayıtların bir sonraki sayfanın ilk kayıtları olarak eklendiğini görürüz. Genellikle bu çok da zararlı olmayan durum performansı etkileyecek diğer yöntemlere tercih edilmektedir.
21 Ağustos 2007
Saas (Software as a Servıce)
Büyük iki S harfi arasına sıkıştırılmış 2 küçük a dan oluşan simetrik kısaltma; Software as a Service. Aslında direk yeni olmayan bazı yazılım davranışlarının bir jargon altında toplanması olarak tanımlayabiliriz. Müşterinin donanım ve yazılım ücreti ödemeden sadece üyelik ve düzenli servis ücretiyle hizmet aldığı bir model. SaaS modelinin yaygın kullanım alanları daha çok CRM,ERP, İnsan Kaynakları, B2B, B2C, İçerik Yönetim Sistemleri.
SaaS mimarideki CRM hizmeti konusunda pazar lideri durumunda Salesforce firmasının demosu size gerçek uygulamalar için bir fikir verecektir.
Gartner verilerine göre 2006 yılında 6.3 milyar $ olan SaaS pazarının 2011 yılında 19.3 milyar $'a çıkacağı varsayılıyor.
Microsoft'un bu mimari ile ilgili olarak .net 3.0 ve Sql Server 2005 teknolojilerinde geliştirdiği LitwareHR isimli bir örnek İnsan Kaynakları uygulaması mevcut.
Müşteri açısından değerlendirildiğinde SaaS mimarisinin klasik yazılım uygulamalarına bir kaç avantajını aşağıdaki şekilde sıralayabiliriz;
- Kurulum süresi
- Kurulum maliyeti
- Genel bir uygulama olması nedeniyle kendilerini etkileyecek bir problemin muhtemelen genel bir problem olması.
- Lokal uygulamalardaki teknik destek için müşteri ofisindeki destek gereksiniminin kalmaması.
- Versiyon değişikliklerinin müşteriden bağımsız gerçekleşmesi
Daha önce büyük ölçüde SaaS mimarisinde değerlendirebileceğimiz email marketing ve mobil marketing uygulamalarının analiz ve yazılım geliştirme aşamalarında bulunmuştum. Yazılım üreten ve sağlayıcı konumundaki firmamız açısından yaşanan en büyük sorunun müşterinin kendi verilerini sağlayıcı server ında tutmak istememesiydi. Data güvenliği ve datanın sağlayıcı tarafındaki teknik kişiler tarafından bile görülemeyeceği bir model mutlaka sağlanmak durumunda. Bu nedenle özellikle CRM ve bu çerçevedeki Müşteri Veritabanı Yönetim projelerinin SaaS mimarisinde uygulanması bir miktar daha zorlaşmakta.
Daha detaylı bilgi için SaaS'in farklı açılardan ele alındığı SaaSblog u incelemenizi tavsiye ederim.
Note : This picture has been taken from http://www.tistory.com/ web site.
17 Ağustos 2007
Tabloda Tekrar Eden Kayıtların Tekilleştirilmesi
16 Ağustos 2007
Where Kosulunu Devre Dışı Bırakmak
Bir listeleme kontrolünüz olsun. (Treeview, Combo, Listbox ..).
Bu kontrolün elemanları bir sorguyla dolsun ve seçilen elemanın değerini başka bir listelemede kullanalım.
Örneğin ismin ilk harfine göre listeleme olsun ve hangi harf seçilirse diğer listede bu harfle ilgili bir içerik gelsin.
İlk listeyi aşağıdaki sorguyla dolduralım.
select 'A','A'
union select 'B','B'
union select 'C','C'
Diğer listelemede de
Select * from User where username like '@content%'
Buraya kadar herşey normal görünüyor. Fakat bir de bunların en üstünde 'Tüm Kullanıcılar' şeklinde bir durum istenirse nasıl olacak?
Burada sıkıntı olacak 2 durum sözkonusu. Birincisi bu seçeneğin en üstte çıkma gerekliliği, ikincisi ise diğer listeleme sorgusunu kullanarak where koşulunu es geçmek. Eğer like yerine = koşulu olsaydı klasik injection yöntemiyle 'aaa or 1=1' değeriyle çözüme ulaşabilirdik.
Bu durumu ise bir kaç deneme sonucu content değeri için '%' vererek çözebildim. Hem listede en üstte çıktı hemde where koşulunda sınırlama koymadı. Yani (where kolon like '%%') şeklinde where koşulunu işlem dışı yapabiliyoruz.
Belki bir yerlerde işinize yarayabilir.
15 Ağustos 2007
Yeni Nesil Google
Aradığını bulamamak problemi için en büyük neden olarak eşsesli kelimelerin kargaşasını örnek verebiliriz. Temel bir çözüm olarak kullancı deneyimlerini baz alarak yapılan indekslemeler bu problemi biraz azaltacaktır. Her aramada binlerce sonuç yerine bana özel sonuç kümesi gelmeli. Örneğin ben daha çok yazılımla alakalı kelimeler arıyorsam "structure" kelimesi yazdığımda muhtemelen inşaat görmek istemiyorumdur. Diğer taraftan bu özellik de benim gerçekten inşaatla alakalı bilgi aradığım durumlarda problem yaratacaktır.
Olaya farklı bir açıdan bakalım. Bir çok kişinin iş görüşmesi öncesi adayın ismini google da aradığını biliyoruz. Arayan kişinin aday hakkında çıkan sonuçları aslında kendi deneyimleri sonucu geleceği için o kişiye ne kadar yakın veya uzak olduğu hakkında da bir fikir verebilir. Aynı şekilde iki kişinin birbiriyle yakınlığı hakkında da bir fikir verebilir. Diğer taraftan çalışan da iş görüşmesi yapacağı genel müdürün ismini googleda aratıp, onun bir röportajını okuyup, bu bilgileri iş görüşmesinde kullansa sanırım doğru bir iş yapmış olur.
Daha da ileri gidersek medeni kanuna google aramalarında belli oranda uyumluluk şartı getirilebilir:) Birbirinizi çok seviyorsunuzdur ama aranızda ne yazık ki google vardır. Google hayatımıza daha fazla girmeye devam edecek mi acaba?
14 Ağustos 2007
Birleşmiş Milletler ve Sql Injection
Note : This picture has been taken from http://www.bobnewell.net/ web site.
13 Ağustos 2007
Tablo ve Kolon Listesi
Oracle:
Tablo listesi
select * from tab
select * from tabs
Kolon listesi
select * from col
select * from cols
SQL Server
Tablo listesi
select * from sysobjects where xtype='U',
select * from INFORMATION_SCHEMA.TABLES
Kolon listesi
select * from syscolumns
select * from INFORMATION_SCHEMA.COLUMNS
31 Temmuz 2007
Union All Kayıt Setinden Gruplamak
Örneğin bir satış sitesi olsun ve aynı ürüne ait satış bilgileri farklı 3 tabloda tutulsun. Biz bu 3 tablodan ürün koduyla sorgulama yapıp toplamlarını çekelim. Son olarak da hepsinin toplamını almamız istensin.
select UrunKod,Sum(Fiyat) from
(
select UrunCode,Sum (UrunFiyat) as Fiyat
from table1
where UrunCode=x
union all
Select UrunCode,Sum(UrunFiyat) as Fiyat
From table2
Where UrunCode=x
union all
Select UrunCode,Sum(UrunFiyat) as Fiyat
From table3
Where UrunCode=x
)
group by UrunKod
Bu şekilde tek sorguyla istediğimiz sonucu elde edebiliriz. Hem kod içerisinde ekstra koda ihtiyacımız kalmaz hem de bir miktar performans sağlamış oluruz.
25 Temmuz 2007
Haftanın Gününü Veren Fonksiyon
Amerikan ingilizcesi dil ayarlarında default değer 7 yani Pazar'dır.
SELECT @@DATEFIRST ile tanımlı değeri alabiliriz
SET DATEFIRST 1 (İlk günü Pazartesi olarak tanımlayabiliriz)
CREATE FUNCTION DayOfWeek(@date DATETIME)
RETURNS VARCHAR(9)
AS
BEGIN
DECLARE @defDayofWeek VARCHAR(10)
DECLARE @dofWeek int
SET @dofWeek= (@@DATEFIRST + DATEPART(weekday,@Date)-1)%7
SELECT @defDayofWeek=CASE @dofWeek
WHEN 0 THEN 'Pazar'
WHEN 1 THEN 'Pazartesi'
WHEN 2 THEN 'Salı'
WHEN 3 THEN 'Çarşamba'
WHEN 4 THEN 'Perşembe'
WHEN 5 THEN 'Cuma'
WHEN 6 THEN 'Cumartesi'
END
RETURN (@defDayofWeek)
END
SET @dofWeek= (@@DATEFIRST + DATEPART(weekday,@Date)-1)%7
ifadesinde ilk günün her zaman Pazartesi olmasını sağladık.
24 Temmuz 2007
Union All Kullanarak Toplu Insert
Sorgumuz aşağıdaki şekilde oluşur;
Kayıt sayısının çok fazla olduğu durumlarda işlem süresindeki kazancımız ciddi oranda artacaktır.
21 Temmuz 2007
Silverlight Flash'a Karşı
Tetris örneğini oynamak için öncelikle Silverlight 1.1 Alpha eklentisini kurmanız gerekecektir.
Microsoft'un zengin interaktif uygulamalar için tarayıcı eklentisi olarak Adobe Flash'a alternatif olarak çıkardığı Silverlight üzerinde bir çok örnek uygulama yapılmaya başlandı. Şu an % 98 oranında yaygınlığa sahip flash a rakip olması ilk bakışta biraz zor görünüyor. Fakat Microsoft'un uyguladığı çapraz ürün bağımlılığı stratejisi onun en büyük avantajı. Örneğin bir .net uygulama geliştiricisi hakim olduğu platformda interaktif uygulama geliştirmeyi flash öğrenmeye/kullanmaya tercih edecektir.
Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz
Bekleyelim ve görelim.
19 Temmuz 2007
Sql Server'dan Oracle'a Geçiş
Öncelikle çok kullanılan bir kaç fonksiyona bakalım;
GETDATE() - sysdate
ISNULL - nvl
CONVERT(VARCHAR,x) - to_char(x)
CONVERT(DATETIME,x) - to_date(x)
LEN - length
+ -
SELECT * INTO NEW_TABLE FROM TABLE şeklindeki SELECT INTO kalıbı yerine Oracle'da create table new_table as select * from table ifadesini kullanabiliriz.
İki tarih arasındaki fark için kullandığımız DATE_DIFF in direk karşılığı Oracle'da yok. date_diff_month(date1,date2) fonksiyonuyla ay farkını alabiliriz. Ayrıca date2-date1 ifadesi direk olarak gün cinsinden sonuç vereceği için gün farkı için bunu kullanabiliriz.
Değişken tanımlamada
DECLARE @a
INTEGER SET
@a=3
şeklindeki ifade Oracle'da
declare a number;begin a := 3;end;
Sql Server'da bir objeden bağımsız olarak SELECT 1 şeklinde bir sorgulama yapabiliriz. Oracle'da ise dummy table olarak adlandırılan DUAL tablosundan sorgulama yapmamız gerekecektir.
select 1 from dual
17 Temmuz 2007
Kurumsal Veri Yönetimi
Data Yönetiminin Planlanması
- Data gizliliğinin sağlanması
- Data giriş işlemlerinde doğrulama yapılması
- Data arşivlemesinin düzenli olarak yapılması
- Bilgi güvenliğinin sağlanması
IT altyapısının basitleştirilmesi
- Sürekli data büyümesinin kontrolü ve yönetiminin yapılması.
- Sürekli depolama stratejilerinin belirlenmesi
- Uygulama içerisinde data temizliği ve tekilleştirme işlemlerinin yapılması
- Uygulamanın optimize edilmesi
İş Devamlılığının Sağlanması
- Yükseltim ve aktarımlarda riskin minimuma indirilmesi
- Hızlı yedekleme ve hızlı geri dönüş
- Uygulama ulaşılabilirliğinin arttırılması
Kurumsal Değerlere Odaklanmak
- Uygulamanın iş ihtiyaçlarına göre verimliliğinin arttırılması
- İş zekası ve içerik Yönetimi nin entegre edilmesi
- Doğru data yönetim çözümlerinin kullanılması
- Performans optimizasyonu yapılması ve maliyetlerin kontrol edilmesi
11 Temmuz 2007
Veritabanı ve Pazarlama
Ana sınıflandırma olarak hayatın doğal akışıyla oluşan veriler ve özel olarak alınan veriler olarak iki tip veriden bahsedebiliriz. Örneğin Turkcell için benim yaptığım tüm aramaların numaraları, konuşma süreleri,tercih ettiğim saatler, mesaj çekme yoğunluğum, hangi şebekeleri kullandığım doğal akışımda oluşan bilgilerdir. Hat almak için doldurduğum sözleşmedeki bilgilerse 2. kategoridedir. Aynı şekilde marketten aldığım ürünler de doğal akışla oluşan veriler. Başka bir gruplamayı da kişilerin özlük bilgileri, tercihleri ve aktiviteleri olarak tanımlayabiliriz. Bu gruplamada bazı durumlarda aktivite tercihler hakkında bilgi sahibi verebilir.
Bu durumlar için en güzel örnek Google Analytics aracı olacaktır. Bir kaç yıl öncesine kadar sitelere konulan sayaçlar belki de sitenin istatistik ihtiyacını gideriyordu, fakat günümüzde tarih, saat, lokasyon, sitede kalma süresi, internete bağlandığı ağ, tarayıcı tipi, javascript desteğinin olup olmadığı, arama motorlarından geldiyse hangi kelimelerle arandığı gibi çok sayıda veri alınıyor.
Peki bu yöntemle elimizde çok değerli! bilgiler oluştu. Bu bilgileri saklayabilmek için veri depolama maliyetlerimiz arttı. Veri çoğaldığı için yorumlamak daha da zorlaştı. Kritik olan nokta bu verilerin ne kadarını kullandık. Attığımız taş ürküttüğümüz kurbağaya değdi mi?
Bir kaç önemli kuralı sıralayacak olursak;
* Esnek bir veritabanı tasarımı yapılıp bu tasarıma göre veri alınmalıdır.
* Her veri önemli değildir. Bilgiye dönüşmeyen verinin bir faydası yoktur.
* Veri alındığı anda değerlidir. Bir süre sonra veri önemini kaybeder.
* İnsanlar bilgi vermekten hoşlanmıyor veya isteksiz veriyor.
Çehov'un "Duvarda asili silah oyunun sonunda mutlaka patlar" kuralına gönderme yaparak "veri alındıysa mutlaka değerlendirilmelidir" dersek çok katı olmayız sanırım :)
04 Temmuz 2007
Oracle'da Kill Process İşlemi
ORA-00054 resource busy and acquire with NO WAIT specified
Bu durumda hata oluşan prosesi kill etmek yoluyla kaynağı boşaltabiliriz.Öncelikle aşağıdaki sorguyla lock oluşan işlemleri listeleyelim.
SELECT o.object_id,s.sid,s.serial#,o.object_type,o.object_name,
l.oracle_username,os_user_name,locked_mode,s.program
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id = o.object_id AND l.session_id=s.sid
Daha sonra da istediğimiz sessionları aşağıdaki sorguyla bitirebiliriz.
ALTER SYSTEM KILL SESSION 'sid,serial'
30 Mayıs 2007
Son Çalışan Sorguların Listesi
CREATE PROCEDURE [dbo].[sp_qryStats]
SELECT
Prosedür sonucunda alacağımız çıktı aşağıdaki şekilde olacaktır.
29 Mayıs 2007
SSIS Kullanarak Veri Tekilleştirmesi
--Örnek tablomuzu yaratalım,
CREATE TABLE [dbo].[user](
[userid] [int] IDENTITY(1,1) NOT NULL,
[ad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[soyad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[email] [varchar](100) COLLATE Turkish_CI_AS NULL,
[gsm] [varchar](20) COLLATE Turkish_CI_AS NULL,
[insertDate] [smalldatetime] NOT NULL CONSTRAINT [DF_user_insertDate] DEFAULT (getdate())
) ON [PRIMARY]
--Test kayıtlarımızı ekleyelim,
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Zinedine','Zidane','zinedine@zinedine.com','5321234567')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Samuel','Eto','samuel@eto.com','5329876543')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Erik','Cantona','eric@cantona.com','5321111111')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('ZINEDIN','ZIDAN','zinedine@zidan.com','')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Samuel','Etho','samuel.eto@eto.com','')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Eric','Cantona','eric@cantona.com','5321111111')
Visual Studio 2005 kullanarak Business Intelligence Projects tipi projelerden bir Integration Services Project yaratalım. Data Flow sekmesindeki linke tıklayarak yeni bir Data Flow yaratalım. Data Flow Sources panelinden bir tane OLE DB Source kontrolü ekleyelim. Gerekli bağlantı ayarlarını yapıp, "Table or View" seçeneğini aktif bırakıp "user" tablomuzu seçelim. Bu şekilde kaynak datamız hazırlanmış oldu. Data Flow Transformations panelinden Fuzzy Grouping kontrolünü Data Flow'a ekleyelim. Bu kontrolü kaynak kontolden çıkan yeşil okla birleştirelim. Fuzzy Grouping kontrolünün Columns sekmesine tıklayarak, tekilleştirme yapmak istediğimiz kritik alanları ve benzeşim katsayılarını seçmemiz gerekecektir.Örnek olarak ad ve soyad alanlarının solundaki chkbox ları seçip, Minimum Similarity değerlerini 0,7 yapalım. Bunun anlamı ad ve soyad değerleri %70 oranında benzeyen satırlar aynı kabul edilecektir. Data Flow Transformations panelinden Conditional Split kontrolünü önceki kontrolün yeşil okuna ekleyelim. Bu kontrolde kritik olan _key_in ve _key_out kolonlarıdır.
_key_in : Satırın tablodaki sıra değeridir.
_key_out: Satırın verdiğimiz kriterlere göre benzeşim sıra değeridir
.
Burada 2 durum sözkonusu olsun. Tekil ve diğer kayıtları ayırmak isteyelim.
Case 1 : _key_in == _key_out
Case 2 : _key_in != _key_out
şeklinde 2 durum yaratalım.
Son olarak bu iki durumdan çıkan kayıtları farklı tablolara atmamız gerekecek.Bunun için de Data Flow Destinations panelinden 2 tane OLE DB Destination kontrolü ekleyelim. Bir önceki kontrolün yeşil okunu hedef kontrole bağlamaya çalıştığımızda bize hangi durumun çıktısını alacağımızı sorar. Projeyi çalıştırdığımızda örnek 6 kaydın 3 er kayıt olarak 2 tabloya eklendiğini görebilirsiniz. Veri kolonlarına ek olarak benzerlik oranlarının da ek kolonlar olarak eklendiğini göreceksiniz.
Sonuçta aşağıdaki şekilde bir Sql Server Integration Service paketimiz oluşacaktır,
Yazıyı fazla uzatmamak için detaylara çok fazla inmedim. Bu projeyi aşağıdaki linkten indirirek detayları inceleyebilirsiniz.
http://www.harunpeksen.net/CodeSample/SSISTest1.rar
Not: Projeyi kendi sisteminizde çalıştırmak için Sql Server bağlantı değerlerini güncellemeniz gerekecektir.
08 Nisan 2007
Sql Server'da Case Fonksiyonu
25 yaşından büyük veya evli bayanları; Hoşgeldiniz Ebru Hanım,
25 yaşından büyük veya evli erkekleri; Hoşgeldiniz Emre Bey,
18-25 yaş arası ve evli olmayan kişileri; Merhaba Ahmet/Ayşe,
18 yaşından küçükleri de; Sevgili Ebru/Emre,
olarak karşılamak isteyelim.
Önce üye tablomuzu yaratalım
CREATE TABLE [dbo].[Uye](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[Ad] [varchar](50) NOT NULL,
[Soyad] [varchar](50) NOT NULL,
[Yas] [smallint] NOT NULL,
[Cinsiyet] [char](1) NOT NULL,
[MedeniHal] [char](1) NOT NULL,
CONSTRAINT [PK_Uye] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)
)
Sonra örnek kayıtlarımız girelim
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Ebru','Kaya',29,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Emre','Aslan',29,'E','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Aslı','Doğan',23,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Selim','Kutlu',17,'E','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Sibel','Ayaz',24,'K','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Nilay','Kalaycı',14,'K','B')
Daha sonra sql cümlemizi aşağıdaki şekilde oluşturalım.
SELECT [UserId],[Message] = CASE
WHEN Cinsiyet='K' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Hanım'
WHEN Cinsiyet='E' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Bey'
WHEN Yas>18 THEN 'Merhaba ' + [Ad]
ELSE 'Sevgili ' + [Ad]
END
FROM Uye
Sorgu sonucumuz aşağıdaki şekilde olacaktır.
17 Mart 2007
Normalizasyon
Proje bilgileri tablomuzu oluşturup gerekli kayıtları ekleyelim.
Normalize etmek için öncelikle tekrarlanan sütunları bulalım. Bu datayı normalize ettiğimiz zaman 5 tablomuz olacaktır. Bunlar.
Proje (ProjeId,ProjeAd)
Calisan(CalisanId,CalisanAd,CalisanMaliyet,CalisanUlke)
Maliyet(MaliyetId,MaliyetTutar)
Ulke(UlkeId,UlkeAd)
ProjeBilgileriN(ProjeId,CalisanId,CalismaGunu)
Normalize ettiğimiz tablolara aynı verileri girelim.
Bu tasarımda önemli bir kaç normalizasyon kuralını kullandık. Aşağıdaki linkte 5 normalizasyon kuralı bir afiş olarak yer alıyor. İlginç.
http://www.marcrettig.com/poster/rettigNormalizationPoster.pdf
07 Mart 2007
Sql Server Best Practices Analyzer Aracı
Daha açık olarak;
* SQLBrowser servisinin LocalSystem accountu altında çalıştığını ve bunu önermediklerini belirtmiş
* Bulk Insert işleminde bazı problemler yaşanabilir, 8.00.2187 (Service Pack 4) yüklemeyi önermiş
* Automatic checkpoint özelliğini kullanabilmek için 8.00.2187 (Service Pack 4) yüklemeyi önermiş
* Şu an Mixed modda çalıştığımı, güvenlik sebebiyle "Windows Authentication" modda kullanmayı önermiş
* Çok sayıda kullanıcının SysAdmin rolünde bulunduğunu, 2'den fazla olmaması gerektiğini belirtmmiş
* Service Pack 4 'e geçmeyi ayrıca önermiş
* SQLAgent servisinin LocalSystem accountu altında çalıştığını ve bunu önermediklerini belirtmiş
* Memory Scribbler probleminin Service Pack 4 öncesinde yaşanabileceğini belirtmiş
* Strong bir şifre kullanmam gerektiğini söylemiş
* Northwind'in hiç backup ının alınmadığını belirtmiş
* Northwind üzerinde Guest accountunun yetkisi olduğunu belirtmiş, önermemiş
Özetle "Service Pack 4 yükle rahat et" mesajını aldım:)
Belki karmaşık database lerde daha yönlendirici sonuçlar çıkacaktır, denemek lazım.
Aşağıdaki linkten download edebilirsiniz:
http://www.microsoft.com/downloads/details.aspx?FamilyId=B352EB1F-D3CA-44EE-893E-9E07339C1F22&displaylang=en
01 Mart 2007
Business Intelligence
Son yıllarda "Business Intelligence" kavramını sıkça duymaya başladık. Bu kavram ilk olarak 1989 yılında Gartner Inc. firmasında analist olarak araştırma yapan Howard Dresner tarafından kullanılmıştır. O tarihe kadar DSS (decision support system) ve EIS (executive information system) gibi karışıklık yaratan kavramlar kulanılmaktaydı. Kelime olarak iş zekası şeklinde tanımlanan ama aslında bence şu an için zekadan bahsedemeyeceğimiz bir kavram. Merkezinde veri madenciliği var aslında. Klasik veri madenciliğinde temel olan konu verileri çeşitli yöntemlerle analiz ederek bilgiye dönüştürmektir. Business Intelligence kavramını veri analizinin yanında ETL (Extract, Transform, Load) işlemlerini ve Raporlama ihtiyaçlarını daha geniş bir açıdan bakarak sağlayan çözümler olarak düşünebiliriz. Business Intelligence uygulamaları sayesinde karar vericiler,stratejik ve operasyonel kararlarında daha doğru ve hızlı adımlar atabilmektedirler. Burada zekadan çok aslında bir yönlendirme söz konusu. Bu nedenle karar destek sistemleri tanımı bana biraz daha doğru geliyor.
Dünyadaki BI çözümlerine baktığımızda;
3 database devi:
IBM DB2 Business Intelligence
Oracle Business Intelligence Solutions
Microsoft SQL Server: Business Intelligence Solutions
Database ürünü olmayan yazılım devleri:
SAP Business Intelligence
Business objects
SAS - Business Intelligence Software Solutions
Microstrategy
Cognos
Hyperion
Business Intelligence ın geleceği konusunda Gartner için araştırma yapan Andreas Bitterer ın tespitleri ise şu yönde;
* BI bir çok kurumdaki deneyimli IT Manager'ın kafasında ilk planda yer alıyor
* BI'ın bir proje olmayıp devamlı bir süreç olarak düşünülmesi gerekir.
* Sık karşılaşılan bir durum da data kirliliği. Fakat "bu gezegende data kirliliği problemini yaşamayan bir firma yok"
* Kurumların data çalışanlarına ihtiyacı var. Bu kişiler kurum içerisinde çok deneyimli kişiler olmayabilir ama datayı nasıl yöneteceğini bilen kişiler olmalı.
SQL Server Business Intelligence Solutions çözümlerini inceleme fırsatım oldu. 3 temel servis bulunmakta. Integration Services, Analysis Services, Reporting Services. .net kullanıcıları 2005 ortamında kendi Business Intelligence projelerini yaratıp data işlemlerinde kod parçacıkları yazabilmekteler. Kısmen incelediğim Sql Server Integration Service projesi içerisinde kullanabileceğimiz hazır 11 bulanık mantık algoritması kullanan fuzzy lookup kontrolleri ETL işlemlerinde bir hayli işe yarar gibi görünüyor.
05 Şubat 2007
Soundex ve Difference Fonksiyonları
Sorgulamalarda text alanlara ait arama işlemlerinde like metodunu sıklıkla kullanırız. Like güzel hoş ama, bilhassa büyük hacimli datalarda veya cleanbase olmasını istediğimiz sistemlerde bazen işimizi görmez. Bu gibi durumlarda çok basit iki string fonksiyonu kullanarak işimizi görebiliriz.Bunlar SOUNDEX ve DIFFERENCE fonksiyonları.
SOUNDEX basit anlamda bizim string ifademizi 4 haneli bir koda dönüştürür.Bu kodun ilk harfi string değerimizin ilk harfi olur. Daha sonraki harflerse aşağıdaki eşleştirme tablosundan o harfe karşılık gelen sayı olur.
- 1 : B,F,P,V
- 2 : C,G,J,K,Q,S,X,Z
- 3 : D,T
- 4 : L
- 5 : M,N
- 6 : R
- Kod yok : A,E,H,I,O,U,Y,W
Select SOUNDEX('Chris'),SOUNDEX('Chrys') ifadesinden bize dönen değerler;
C620 ve C620 olacaktır.
Where koşulunda aşağıdaki şekilde kullanabiliriz:
SELECT ad FROM tableX WHERE SOUNDEX(ad)=SOUNDEX('Chris')
Bu sorgu sonucu benzerlik kodu 'Chris' ile aynı olan isimler döner.
DIFFERENCE fonksiyonu da bize bu 4 haneli kodlardan iki string arasındaki benzerliği vermektedir.
SELECT ad FROM tableX WHERE SOUNDEX(ad)=SOUNDEX('Chris')
Bu sorguyla da adı 'Chris' ile % 75 veya daha fazla benzer olan kayıtları sorguladık.
17 Ocak 2007
Aspnet_Profile Tablosundan Alanları Sorgulamak
aspnet_Profile.PropertyNames : Profil alanların isim ve pozisyonlarının tutulduğu sütun
aspnet_Profile.PropertyValuesString : Profil değerlerinin tutulduğu sütun
CREATE FUNCTION [dbo].[GetProfileProperty](
@profileName varchar(50),
@PropertyNames varchar(8000),
@PropertyValuesString varchar(8000)
)
RETURNS varchar(500)
AS
BEGIN
DECLARE @MyOutput varchar(1000)
SET @MyOutput=substring (
@PropertyValuesString,
convert(int,(substring(@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3,
(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3)- charindex(@ProfileName,@PropertyNames,1) - len(@ProfileName) - 3))
)) + 1,
convert(int,(substring(@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1,
((charindex(':',@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1))-(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1)
))))
)
RETURN @MyOutput
END
Bu fonksiyonu kullanarak,
SELECT dbo.GetProfileProperty('Firma',PropertyNames,PropertyValuesString)
FROM dbo.aspnet_Profile
cümlesiyle tüm kullanıcıların firma bilgisini alabiliriz.
05 Ocak 2007
Tabloda Email Kontrollü Kolon Yaratmak
Önce bir C# fonksiyona ihtiyacımız var. RegEx kullanan basit bir fonksiyon.
public class clsEmailValidator
{
public static int ValidatePostaFormat(string email)
{
string regExPattern = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$";
System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex(regExPattern);
if (email.Length != 0 & !regEx.IsMatch(email))
{
return 0;
}
{
return 1;
}
}
}
Daha sonra Sql Server 2005'te bir assembly oluşturalım;
CREATE ASSEMBLY EmailValidator
FROM 'C:\Documents and Settings\harunp\My Documents\Visual Studio 2005\Projects\EmailValidator\EmailValidator\bin\Debug\EmailValidator.dll'
Sonra bu assembly i kullanan bir email validasyon fonksiyonu yaratalım.
CREATE FUNCTION ValidateEmail
(
@email nvarchar(80)
)
RETURNS int
AS EXTERNAL NAME EmailValidator.clsEmailValidator.ValidatePostaFormat
Sonra bu fonksiyonu kullanacağımız bir tablo yaratalım. Tek yapmamız gereken fark email alanını yaratırken bir koşul eklemek.
CREATE TABLE [dbo].[tblUser](
[ad] [nvarchar](80),
[soyad] [nvarchar](80),
[email] [nvarchar](80) CHECK ([dbo].[ValidateEmail]([email])=(1))
)
INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','test@test.com')
(1 row(s) affected)
INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','testtest.com')
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK__tblUser__email__412EB0B6". The conflict occurred in database "Test", table "dbo.tblUser", column 'email'.
The statement has been terminated.
Değer email formatında olmadığı için tabloya insert edilemedi. Bu yöntemle geçersiz bir email adresinin veritabanına girişini son noktada kontrol etmiş oluruz.