Ana içeriğe atla

Asp.Net Firebird MemberShip Security -1

Asp.Net Web uygulamalarınızda Firebird Database kullanmanızı kesinlikle destekleyen ve bununla ilgili onlarca yazı yazarak web üzerinden en çok ve en çabuk ulaşılan bir blog olarak.Bu blogtaki Firebird konumuzun "Asp.Net ile kullanmaya alıştığınız Ms Sql MemberShip" özelliğini bu kez Firebird Database ile yapabileceğinizi söylemek isterim.

Genelde Asp.Net web uygulamalarında Ms Sql ve AspNet Security her zaman tercih edilir.Sanırım bunun asıl nedeni Visual Studio serisinin kullanıcıya AspNet Configration ile bir kaç tıkla sağladığı provider desteği ile uygulama güvenliğinizin hazır hale getiriliyor olmasıdır.Sizin kodlara dahil olmanız gerekmeden hazırlanan uygulama dizin güvenliğiniz için yapmanız gereken users ve admin dizinlerinize basitçe Visual Studio serisinin login araçlarını uygulamanıza alarak yolunuza devam edebilmenizdir.Ms Sql ve Asp.Net için bu ne kadar konforlu bir sonuçtur.Fakat Firebird veritabanını kullanmak ve Ms Sql lisansını, kapladığı alanı düşünürsek hayli verimli ve güzel bir deneyimdir.Eğer sizde benim gibi düşünüyorsanız bu blogla Asp.Net ve Firebird Database MemberShip için ilk bilgilere hemen geçelim...

Bunun kolay ve hızlı bir sonuç olmayacağını blogun başında söyliyeyim ki okumaya devam ederken canınız sıkılıp kim uğraşacak bununla diyerek blogu terketmeyesiniz.Peki neden zor çünkü Firebird veritabanınızı kendiniz hazırlayacaksınız, webconfig düzenleyeceksiniz.Elbette bazı kısımlarda Visual Studio 2008-2010 size yardım edecek ama işin çoğunluğunu siz yapacaksınız.Webte bu kaynağa iki yerde rastlamanız münkündür Firebird 1.0 ve Firebird 2.0 serisi için bunu yapabiliyoruz.bende bu kaynaklardanda faydalanmak isteyebileceğiniz için her ikisinede yeri geldiğinde atıfta bulunarak işinizi biraz daha kolaylaştıracağım.Şimdi gerekli yazılımlarımızı, Firebird sürüm ve dll dosyalarımızın listesine bakalım...Herşeyi adım adım yapacağız...

Gereksinimler ve açıklamaları
- Visual Studio ile yapacağız
- Firebird 2.5 Server kurulumu yapmış olmamız gerekir.
- FirebirdSql Web.Provider.dll 2.5.0.0 gerekir (NetProvider kurmalısınız)
- FirebirdSql ADO.Net Data Provider.dll 2.5.2.0
- IBEXPERT Dabase Manager kullanmamız gerekir.(Interbase ve Firebird için ben bunu kullanıyorum)

Tüm bunlar hakkında bilgileri Firebird bloglarımdan ve yandaki listedeki konuları sırasıyla okuyarak olabildiğince faydalanabilirsiniz.Şimdide bu yukardaki gereçler gibi ilgili web adreslerini vererek arayacaklarınızı bulmanızı biraz daha kolaylaştırayım.

- Firebird Org Conectivity ile ihtiyaclarınızı sürüme uygun olarak bu adresten alabilirsiniz.
- Firebird-Sql ve başlangıç bilgilerini yine benim blogum olan Firebird-Sql Blog yada
- Bu blog içeresinde ayrıntılı olarak anlattığım Asp.Net ve Firebird blog sayfasından okuyabilirsiniz.
- IBEXPER Database Manager ile ilgili bilgileride sayfanın sağında bulunan listeden göz atabilirsiniz.

Diğer başvuru kaynakları
- FirebirdMembership Security ile ilgili en eski kaynak Codemuch.com adresinde mevcuttur.
- FirebirdMembership Security konulu diğer bir yazı ise todormihailov.com adresindedir.
- Ayrıca bu konuyla ilgili en kapsamlı bilgiyi şuanda okuduğunuz SerkanŞenyüz blogları verir. Biraz megolamanlık her zaman iyidir.

Evet bu kadar detaydan sonra ilk yapacaklarımız sırasıyla Firebird veritabanımızı hazırlamak olacak.Burada şunuda belirtmeliyim bu konuyu sadece bir blogta anlatmamız pek münkün değil bu yüzden bu konuyu bir seri haline getirerek yazacağım.Bu blogta öncelikle veritabanımızı oluşturacağız.

1-Firebird MemberShip Security Database FirebirdSql Kod
IBEXPERT Manager açın ve Sql Executive yada Ctrl 12 ile aşağıdaki kodları yapıştırın...
SET SQL DIALECT 3;

SET NAMES NONE;

CREATE DATABASE 'C:\AspNetSecurityTest.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET UNICODE_FSS;

CREATE TABLE ROLES (
    ROLENAME         VARCHAR(255) NOT NULL,
    APPLICATIONNAME  VARCHAR(255) NOT NULL
);

CREATE TABLE USERSINROLES (
    USERNAME         VARCHAR(255) NOT NULL,
    ROLENAME         VARCHAR(255) NOT NULL,
    APPLICATIONNAME  VARCHAR(255) NOT NULL
);

CREATE TABLE SESSIONS (
    SESSION_ID        VARCHAR(80) NOT NULL,
    APPLICATION_NAME  VARCHAR(100) NOT NULL,
    CREATED           TIMESTAMP,
    EXPIRES           TIMESTAMP,
    LOCK_DATE         TIMESTAMP,
    LOCK_ID           INTEGER,
    TIMEOUT           INTEGER,
    LOCKED            SMALLINT,
    SESSION_ITEMS     BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
    FLAGS             INTEGER
);

CREATE UNIQUE INDEX SESSIONS_IDX1 ON SESSIONS (SESSION_ID, APPLICATION_NAME);

CREATE DOMAIN BOOL AS
SMALLINT
DEFAULT 0
NOT NULL
CHECK (value=1 or value=0 or value is null);

CREATE TABLE Users
(
    PKID                        CHAR(36) CHARACTER SET OCTETS NOT NULL PRIMARY KEY,
    USERNAME                    VARCHAR(255) character set UNICODE_FSS NOT NULL,
    APPLICATIONNAME             VARCHAR(255) character set UNICODE_FSS NOT NULL,
    EMAIL                       VARCHAR(128) character set UNICODE_FSS NOT NULL,
    COMMENT                     VARCHAR(255) character set UNICODE_FSS,
    USERPASSWORD                VARCHAR(128) character set UNICODE_FSS NOT NULL,
    PASSWORDQUESTION            VARCHAR(255) character set UNICODE_FSS,
    PASSWORDANSWER              VARCHAR(255) character set UNICODE_FSS,
    ISAPPROVED                  BOOL,
    LASTACTIVITYDATE            TIMESTAMP,
    LASTLOGINDATE               TIMESTAMP,
    LASTPASSWORDCHANGEDDATE     TIMESTAMP,
    CREATIONDATE                TIMESTAMP,
    ISONLINE                    BOOL,
    ISLOCKEDOUT                 BOOL,
    LASTLOCKEDOUTDATE           TIMESTAMP,
    FAILEDPASSWORDATTEMPTCOUNT  INTEGER,
    FAILEDPASSWORDATTEMPTSTART  TIMESTAMP,
    FAILEDPASSWORDANSWERCOUNT   INTEGER,
    FAILEDPASSWORDANSWERSTART   TIMESTAMP
);

CREATE TABLE PROFILES (
    PKID                  CHAR(36) CHARACTER SET OCTETS NOT NULL,
    PROPERTYNAMES         BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    PROPERTYVALUESSTRING  BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    PROPERTYVALUESBINARY  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    LASTUPDATEDDATE       TIMESTAMP,
    LASTACTIVITYDATE      TIMESTAMP,
    ISUSERANONYMOUS       BOOL /* BOOL = SMALLINT DEFAULT 0 CHECK (value=1 or value=0 or value is null) */,
    APPLICATIONNAME       VARCHAR(256) CHARACTER SET UNICODE_FSS
);

ALTER TABLE PROFILES ADD CONSTRAINT PK_PROFILES PRIMARY KEY (PKID);

SET TERM ^ ;

CREATE PROCEDURE PROFILES_DELETEINACTPROFILES (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    PROFILEAUTHOPTIONS INTEGER,
    INACTIVESINCEDATE TIMESTAMP)
AS
begin
 DELETE FROM  Profiles  WHERE APPLICATIONNAME = :applicationname AND (LastActivityDate <= :InactiveSinceDate)
                        AND (
                                (:ProfileAuthOptions = 2)
                             OR (:ProfileAuthOptions = 0 AND IsUserAnonymous = 1)
                             OR (:ProfileAuthOptions = 1 AND IsUserAnonymous = 0)
                            ) ;
end^

CREATE PROCEDURE PROFILES_DELETEPROFILE (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    USERNAME VARCHAR(256) CHARACTER SET UNICODE_FSS)
AS
declare variable userid char(36) character set octets;
begin
  userid = null;
  select pkid from users where applicationname = :applicationname and username = :username into :userid;
  if (userid is null) then
   userid = :username;
  delete from profiles where pkid = :userid;
end^

CREATE PROCEDURE PROFILES_GETNBOFINACTPROFILES (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    PROFILEAUTHOPTIONS INTEGER,
    INACTIVESINCEDATE TIMESTAMP)
RETURNS (
    NB INTEGER)
AS
begin
 nb = 0;
  SELECT  COUNT(*) FROM    Profiles
  WHERE Applicationname = :applicationname
        AND (LastActivityDate <= :InactiveSinceDate)
        AND ((:ProfileAuthOptions = 2)
              OR (:ProfileAuthOptions = 0 AND IsUserAnonymous = 1)
              OR (:ProfileAuthOptions = 1 AND IsUserAnonymous = 0))
  INTO :nb;
  suspend;
end^

CREATE PROCEDURE PROFILES_GETPROFILES (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    PROFILEAUTHOPTIONS INTEGER,
    USERNAMETOMATCH VARCHAR(256) CHARACTER SET UNICODE_FSS,
    INACTIVESINCEDATE TIMESTAMP,
    PAGEINDEX INTEGER,
    PAGESIZE INTEGER)
RETURNS (
    USERNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    ISANONYMOUS SMALLINT,
    LASTACTIVITYDATE TIMESTAMP,
    LASTUPDATEDDATE TIMESTAMP)
AS
declare variable pkid char(36) character set octets;
declare variable spkid char(16) character set octets;
declare variable pagelowerbound integer;
declare variable pageupperbound integer;
BEGIN
  pagelowerbound = pagesize * pageindex;
  PageUpperBound = pagesize;

  FOR SELECT  FIRST(:pageupperbound) SKIP(:pagelowerbound) pkid,isuseranonymous,lastactivitydate,lastupdateddate FROM Profiles
  WHERE (applicationname = :applicationname)
  AND (:inactivesincedate IS NULL OR LastActivityDate <= :InactiveSinceDate)
  AND ((:ProfileAuthOptions = 2) OR (:ProfileAuthOptions = 0 AND ISUSERANONYMOUS = 1)
  OR (:ProfileAuthOptions = 1 AND ISUSERANONYMOUS = 0))
  INTO :pkid,:IsAnonymous,:lastactivitydate,:lastupdateddate
  DO
  BEGIN
   username = NULL;
   IF (:IsAnonymous = 1) THEN
    username = pkid;
   ELSE
   BEGIN
    spkid = CAST(:pkid AS CHAR(16));
    SELECT userName FROM users WHERE pkid = :spkid INTO :username;
   END
   IF (usernametomatch IS NOT NULL) THEN
   BEGIN
    IF (UPPER(username) LIKE :usernametomatch) THEN
     SUSPEND;
   END
   ELSE
    SUSPEND;
  END
END^

CREATE PROCEDURE PROFILES_GETCOUNTPROFILES (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    PROFILEAUTHOPTIONS INTEGER,
    USERNAMETOMATCH VARCHAR(256) CHARACTER SET UNICODE_FSS,
    INACTIVESINCEDATE TIMESTAMP)
RETURNS (
    TOTALRECORDS INTEGER)
AS
declare variable pkid char(36) character set octets;
declare variable spkid char(16) character set octets;
declare variable isanonymous smallint;
declare variable username varchar(256) character set unicode_fss;
BEGIN
  totalrecords = 0;

  IF (usernametomatch IS NOT NULL) THEN
   FOR SELECT pkid,isuseranonymous FROM Profiles
       WHERE (applicationname = :applicationname)
       AND(:inactivesincedate IS NULL OR LastActivityDate <= :InactiveSinceDate)
       AND ((:ProfileAuthOptions = 2) OR (:ProfileAuthOptions = 0 AND ISUSERANONYMOUS = 1)
       OR (:ProfileAuthOptions = 1 AND ISUSERANONYMOUS = 0))
   INTO :pkid , :isanonymous
   DO
   BEGIN
     username = NULL;
     IF (:isanonymous = 1) THEN
        username = pkid;
     ELSE
     BEGIN
      spkid = CAST(:pkid AS CHAR(16));
      SELECT userName FROM users WHERE pkid = :spkid INTO :username;
     END
     IF (UPPER(username) LIKE :usernametomatch) THEN
      totalrecords = totalrecords + 1;
   END
  ELSE
   SELECT COUNT(1) FROM Profiles
                   WHERE (applicationname = :applicationname)
                   AND (:inactivesincedate IS NULL OR LastActivityDate <= :InactiveSinceDate)
                   AND ((:ProfileAuthOptions = 2) OR (:ProfileAuthOptions = 0 AND ISUSERANONYMOUS = 1)
                   OR (:ProfileAuthOptions = 1 AND ISUSERANONYMOUS = 0))
   INTO :totalrecords;
  SUSPEND;
END^

CREATE PROCEDURE PROFILES_GETPROPERTIES (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    USERNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    CURRENTTIMEUTC TIMESTAMP)
RETURNS (
    PROPERTYNAMES BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROPERTYVALUESSTRING BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROPERTYVALUESBINARY BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
declare variable userid char(36) character set octets;
begin
  userid = null;
  PropertyNames = null;
  PropertyValuesString = null;
  PropertyValuesBinary = null;
  userid = null;
  select pkid from users where applicationname = :applicationname and username = :username into :userid;
  if (userid is null) then
   userid = :username;
  if (userid is not null) then
  begin
   select first(1) PropertyNames, PropertyValuesString, PropertyValuesBinary from profiles
   where pkid = :userid into :propertynames,:propertyvaluesstring,:propertyvaluesbinary;
   if (propertynames is not null) then
   begin
    suspend;
    UPDATE profiles set profiles.lastactivitydate = :currenttimeutc where profiles.pkid = :userid;
   end
  end
end^

CREATE PROCEDURE PROFILES_SETPROPERTIES (
    APPLICATIONNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    PROPERTYNAMES BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROPERTYVALUESSTRING BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROPERTYVALUESBINARY BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    USERNAME VARCHAR(256) CHARACTER SET UNICODE_FSS,
    ISUSERANONYMOUS SMALLINT,
    CURRENTTIMEUTC TIMESTAMP)
RETURNS (
    ERRORCODE INTEGER)
AS
declare variable userid char(36) character set octets;
begin
  userid = null;
  errorcode = 0;
  userid = null;
  select pkid from users where applicationname = :applicationname and username = :username into :userid;
  if (userid is null) then
   userid = :username;
  if (userid is not null) then
  begin
   IF (EXISTS( SELECT * FROM   Profiles WHERE  profiles.pkid = :UserId)) then
        UPDATE Profiles
        SET    PropertyNames=:PropertyNames, PropertyValuesString = :PropertyValuesString,
               PropertyValuesBinary = :PropertyValuesBinary, LastUpdatedDate=:CurrentTimeUtc , LastActivityDate=:currenttimeutc
        WHERE  pkid = :UserId;
   ELSE
        INSERT INTO Profiles(pkid, PropertyNames, PropertyValuesString, PropertyValuesBinary, LastUpdatedDate,ISUSERANONYMOUS,APPLICATIONNAME,LastActivityDate)
             VALUES (:UserId, :PropertyNames, :PropertyValuesString, :PropertyValuesBinary, :CurrentTimeUtc,:isuseranonymous,:applicationname,:CurrentTimeUtc);
  end
  else
   errorcode = 1;
  suspend;
end^

SET TERM ; ^
GRANT SELECT,DELETE ON PROFILES TO PROCEDURE PROFILES_DELETEINACTPROFILES;
GRANT EXECUTE ON PROCEDURE PROFILES_DELETEINACTPROFILES TO SYSDBA;
GRANT SELECT ON USERS TO PROCEDURE PROFILES_DELETEPROFILE;
GRANT SELECT,DELETE ON PROFILES TO PROCEDURE PROFILES_DELETEPROFILE;
GRANT EXECUTE ON PROCEDURE PROFILES_DELETEPROFILE TO SYSDBA;
GRANT SELECT ON PROFILES TO PROCEDURE PROFILES_GETNBOFINACTPROFILES;
GRANT EXECUTE ON PROCEDURE PROFILES_GETNBOFINACTPROFILES TO SYSDBA;
GRANT SELECT ON PROFILES TO PROCEDURE PROFILES_GETPROFILES;
GRANT SELECT ON USERS TO PROCEDURE PROFILES_GETPROFILES;
GRANT EXECUTE ON PROCEDURE PROFILES_GETPROFILES TO SYSDBA;
GRANT SELECT ON USERS TO PROCEDURE PROFILES_GETPROPERTIES;
GRANT SELECT,UPDATE ON PROFILES TO PROCEDURE PROFILES_GETPROPERTIES;
GRANT EXECUTE ON PROCEDURE PROFILES_GETPROPERTIES TO SYSDBA;
GRANT SELECT ON USERS TO PROCEDURE PROFILES_SETPROPERTIES;
GRANT SELECT,INSERT,UPDATE ON PROFILES TO PROCEDURE PROFILES_SETPROPERTIES;
GRANT EXECUTE ON PROCEDURE PROFILES_SETPROPERTIES TO SYSDBA;

Size kolay olmayacak demiştim...
F9 ile Run komutu sonrasında C:\AspNetSecurityTest.fdb yolunda yeni bir Firebird Database edinmiş oldunuz.Şimdi Yine IBEXPERT  ile oluşan Firebird veritabanına bir bakalım.



IBEXPERT ile bu Firebird veritabanını Registry ederek içerisini bir kontrol etmemiz gerekli çünkü database için yapacağımız bazı şeyler var...

Evet Tables-Stored Procedures ve Trigers yapıları tamamlanmış fakat eksiklikler var Ms Sql Membership ile Asp.Net web uygulamanızda kullanmışsanız bu elementlerin daha çok olduğunu bilirsiniz.Veritabanımıza tekrar geri döneceğiz onu bu haliyle bırakalım ve Visual Studio ile yeni bir Asp.Net web projemizioluşturalım. Burada bazı önemli detayları atlamadan uygulamanız gerekiyor....

Visual Studio Asp.Net Firebird MemberShip Security Project


Yazının başında bahsettiğim FirebirdSql.dll dosyalarının Bin klasörü içerisinde olduklarını sanırım görebiliyorsunuz.Bunları ayrıca Visual Studio Property Pages içerisinden kontrol ederek References(referanslar) kısmında olup olmadıklarına bakmamız gerekir.Bazen bu konuda Visual Studio görmezden gelebiliyor.Eğer böyle bir şey olursa Browse edip bu dll leri görmesini sağlamamız gerekecektir.Şimdi Visual Studio ile Asp.net web uygulamamızın web.config dosyasını yazıcaz zaten en önemli kısımda budur.Nedense Firebird kullanmaya çalışan herkes connection string kısmında sıkıntı yaşar, veritabanına bağlanamaz ve Firebird kullanmaktan vazgeçer.Bu yüzden bunu biraz daha detaylı anlatacağım.

Asp.Net Firebird Membership Security Web.config - Firebird Connection String

    
    
  
Bu bağlantı dizesi her Firebird kullanımında işe yarayacaktır.Fakat Firebird ODBC yada OLEDB olduğunda işlem değişir.Bununla ilgili bilgileri daha önceki bloglarımda vermiştim...Bu satıra bakıp birazda işten anlayanlar olurmu hoca Database Path nereyi gösteriyor sen nereye connection string yazdın dicekler.Evet o halde C:\AspNetFirebirdSecurity.fdb veritabanı dosyanızı alın ve connection string'te yazan yere götürün...Buda Visual Studio içerisinde işlemlere devam edeyoruz demek okuyor.Hala web.config için yazmaya ve artık authentication- rolemanager ve profile kısımlarınıda tamamlamamız gerekli ben buraya tüm web.config içeriğinin kodlarını(connection string dahil) yapıştırıyorum sizde aynen bu şekilde yaparsınız.

  
  
    
    
  
  
    
      
      
    
    
      
        
        
      
    
    
      
        
        
      
      
        
        
      
    
    
      
        
        
      
    
    
      
        
        
      
    
  


Blog aldı başını gidiyor...Olabildiğince çok kod yazdık.Aslında amaçta budur zira ben bunun tümünü zipleyip buraya bir indirme linki koyabilirdim fakat bu işi yeni öğrenmeyi isteyenler için pek çekici gelmezdi bu durum ve çoğu zamanda kullanılmazdı.Ama bu sayede adım adım geliştirerek uygulama yaparak tecrübe etmek her zaman tercih edilmelidir.Elbette bana göre.Evet dilerseniz blogta sizde fazla karışmadan bu blogu burada sonlandıralım ve diğer blogtada bu işi yani Asp.Net Firebird Membership Security geliştirmesini tamamlamaya çalışalım.Bu konu söylediğim gibi bir seri haline gelebilecek bir konudur bu yüzdende tadını çıkaralım.Son olarak siz neler yaptığımızı dilerseniz baştan gözden geçiriniz Bir sonraki blogta eksik kalan veritabanı elementlerini yapacağız."Asp.Net Web Site Administration Tool" içinde bazı önemli ayarları tamamlayacağız...Ama ben size şimdiden Securty ve Provider ile ilgili ilk resmi buraya iliştireyim...











Bir sonraki Asp.Net Firebird Membership Security blogunda görüşmek üzere...

Yorumlar

  1. Membership i AccessDB'de kullanma imkanımız var mıdır ?

    YanıtlaSil
  2. Evet var. Bunu çok önce yazıp anlatmıştım. Refink: http://sistemdestekuzmani.blogspot.com.tr/2012/05/aspnet-web-ms-access-membership.html

    YanıtlaSil

Yorum Gönder

Bu blogdaki popüler yayınlar

Firebird SQL Table oluşturma ve SQL komutları

2 nci  Firebird SQL veritabanı blogunda bu kez mevcut Firebird veritabanına ISQL ile bağlanmayı veritabanı nesnelerini oluşturmayı (create table), Kayıt eklemeyi (ınsert) ve kayıtları izlemeyi (show) ile önemli SQL komutlarını anlatmaya çalışacağım...

HBYS yazılımları ve en iyiler (Hastane Bilgi Yönetim Sistemleri)

HBYS (Hastane Bilgi Yönetim Sistemi) ve iyi yazılım firmaları HBYS nedir sorusuna verilebilecek en iyi cevabı, sıra bekleyen hastalara, HBYS programını kullanlar, yani sistem çalışmıyor diyenler verebilir ! Bugün Türkiye genelinde halen izlediğim bu HBYS platformlarını üreten firmalar hakkında bildiğim bazı kişisel görüşlerimi paylaşacağım. Müdahil olduğum bu sektörün ileri gelen firmalarınıda bu sayede kısaca anlatma fırsatım olacak.O halde yazının devamı için devam ediniz...

Firebird Veritabanı Nedir ? Nasıl Kullanılır

Firebird ücretsiz veritabanı kullanmaya ne dersiniz.Üstelik hiç bir süre ve veri sınırı olmadan kulağa hoş geliyor değilmi.Bu Blogta Borland açık kaynak interbase 6 sürümünden sonra ortaya çıkmış ve gelişimini sürekli sürdürmüş Firebird veritabanına bir göz atıcaz. İnternet üzerinde Firebird ile kaynağa çok sık rastlamazsınız artık bu blogtan Firebird ile ilgili bilgileri takip edebilirsiniz...