Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
MS-SQL Server Procedure Tavsiyeleriniz
#21
Merhaba,

Verdiğim cevap beni tatmin etmedi, o nedenle aşağıdaki örneği verme gereği duydum...

USE TestDB
GO

IF  OBJECT_ID('dbo.PERSONEL', 'U') IS NOT NULL  DROP TABLE dbo.PERSONEL;
GO

CREATE TABLE dbo.PERSONEL
( ID            INT IDENTITY(1, 1)
, KULLANICI_ADI NVARCHAR(25) NOT NULL
, SIFRE         NVARCHAR(25) NOT NULL
, ADSOYAD       NVARCHAR(50)
, SON_GIRIS     DATETIME
  CONSTRAINT [PK_PERSONEL_ID] PRIMARY KEY CLUSTERED ( ID ASC )
);
GO
       
--> KULLANICI ADI'NDA "TEKİLLİĞİ" SAĞLAMAK İÇİN UNIQUE INDEX TANIMLIYORUZ...
--> AYRICA DEFAULT COLLATION TURKISH_CI_AS OLDUĞU İÇİN BÜYÜK VE KÜÇÜK HARFLER AYNI KABUL EDİLİYOR
CREATE UNIQUE NONCLUSTERED INDEX UX_PERSONEL_KULLANCI_ADI ON dbo.PERSONEL ( KULLANICI_ADI ASC );
GO

INSERT INTO dbo.PERSONEL (KULLANICI_ADI, SIFRE, ADSOYAD) VALUES ('AzoT','oksijen','Fatih KERİM'), ('Mazot','motorin','Erdil DEYİM');
GO

IF  OBJECT_ID('fn_collate_turkish_cs_as', 'FN') IS NOT NULL  DROP FUNCTION dbo.fn_collate_turkish_cs_as;
GO

CREATE FUNCTION [dbo].[fn_collate_turkish_cs_as]
( @A  NVARCHAR(MAX)
, @B  NVARCHAR(MAX)
)   RETURNS BIT
AS  BEGIN
 RETURN IIF( ( @A COLLATE TURKISH_CS_AS = @B COLLATE TURKISH_CS_AS ), 1, 0);
END;
GO

IF  OBJECT_ID('Kullanici_Dogrula', 'P') IS NOT NULL  DROP PROCEDURE dbo.Kullanici_Dogrula;
GO

CREATE PROCEDURE dbo.Kullanici_Dogrula
       @KulaniciAdi NVARCHAR(25)
    ,  @Sifre       NVARCHAR(25)
AS  BEGIN
    SET NOCOUNT ON;
    DECLARE @ID    INT          = NULL
          , @aKULL NVARCHAR(25) = NULL
          , @aSIFF NVARCHAR(25) = NULL
          , @OK    BIT          = NULL

    SELECT  TOP 1
            @ID           = ID
          , @aKULL        = KULLANICI_ADI --> Verdiğimiz parametreyle karşılaştırmak için...
          , @aSIFF        = SIFRE         --> ...Bulduğumuz şeyleri benzer değişkenlerde tutuyoruz
    FROM    dbo.PERSONEL
    WHERE   KULLANICI_ADI = @KulaniciAdi
      AND   SIFRE         = @Sifre
          ;

    SET @OK = IIF ( (     (dbo.fn_collate_turkish_cs_as(@aKULL , @KulaniciAdi) = 1) --> Büyük / Küçük harf doğrulamasını burası yapıyor
                      AND (dbo.fn_collate_turkish_cs_as(@aSIFF , @Sifre      ) = 1) --> Büyük / Küçük harf doğrulamasını burası yapıyor
                      AND (@ID > 0)                                                 --> VE bir ID tespit edebilmiş mi...
                    )
                  , 1 --> 3 şart da doğruysa 1
                  , 0 --> herhangi birisi yanlışsa sonuç = 0
                  )

    IF (@OK = 1) BEGIN
        UPDATE    TOP (1)     dbo.PERSONEL
        SET       SON_GIRIS = GETDATE()
        WHERE     ID        = @ID
        ;
    END ELSE BEGIN
       RAISERROR(N'Belirttiğiniz kullanıcı adı (%s) veya şifresi yanlış.', 16, 1, @KulaniciAdi); --> Tek başına bu haliyle de akışı bozmaz, sadece mesajı verir ve devam eder...
    END
    SELECT IIF(@OK = 1, @ID, 0) as ID
END
GO

--> BU KISIMDAN SONRASINI ÇALIŞTIRIRKEN CTRL+L TUŞ KOMBİNASYONUYLA EXECUTION PLAN İNCELEMESİ YAPABİLİRSİNİZ.
EXEC dbo.Kullanici_Dogrula N'azoT', N'oksijen'
GO


Ek Dosyalar Resimler
   
Cevapla
#22
(28-07-2017, Saat: 00:27)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,

Verdiğim cevap beni tatmin etmedi, o nedenle aşağıdaki örneği verme gereği duydum...

USE TestDB
GO

IF  OBJECT_ID('dbo.PERSONEL', 'U') IS NOT NULL  DROP TABLE dbo.PERSONEL;
GO

CREATE TABLE dbo.PERSONEL
( ID            INT IDENTITY(1, 1)
, KULLANICI_ADI NVARCHAR(25) NOT NULL
, SIFRE         NVARCHAR(25) NOT NULL
, ADSOYAD       NVARCHAR(50)
, SON_GIRIS     DATETIME
  CONSTRAINT [PK_PERSONEL_ID] PRIMARY KEY CLUSTERED ( ID ASC )
);
GO
       
--> KULLANICI ADI'NDA "TEKİLLİĞİ" SAĞLAMAK İÇİN UNIQUE INDEX TANIMLIYORUZ...
--> AYRICA DEFAULT COLLATION TURKISH_CI_AS OLDUĞU İÇİN BÜYÜK VE KÜÇÜK HARFLER AYNI KABUL EDİLİYOR
CREATE UNIQUE NONCLUSTERED INDEX UX_PERSONEL_KULLANCI_ADI ON dbo.PERSONEL ( KULLANICI_ADI ASC );
GO

INSERT INTO dbo.PERSONEL (KULLANICI_ADI, SIFRE, ADSOYAD) VALUES ('AzoT','oksijen','Fatih KERİM'), ('Mazot','motorin','Erdil DEYİM');
GO

IF  OBJECT_ID('fn_collate_turkish_cs_as', 'FN') IS NOT NULL  DROP FUNCTION dbo.fn_collate_turkish_cs_as;
GO

CREATE FUNCTION [dbo].[fn_collate_turkish_cs_as]
( @A  NVARCHAR(MAX)
, @B  NVARCHAR(MAX)
)   RETURNS BIT
AS  BEGIN
 RETURN IIF( ( @A COLLATE TURKISH_CS_AS = @B COLLATE TURKISH_CS_AS ), 1, 0);
END;
GO

IF  OBJECT_ID('Kullanici_Dogrula', 'P') IS NOT NULL  DROP PROCEDURE dbo.Kullanici_Dogrula;
GO

CREATE PROCEDURE dbo.Kullanici_Dogrula
       @KulaniciAdi NVARCHAR(25)
    ,  @Sifre       NVARCHAR(25)
AS  BEGIN
    SET NOCOUNT ON;
    DECLARE @ID    INT          = NULL
          , @aKULL NVARCHAR(25) = NULL
          , @aSIFF NVARCHAR(25) = NULL
          , @OK    BIT          = NULL

    SELECT  TOP 1
            @ID           = ID
          , @aKULL        = KULLANICI_ADI --> Verdiğimiz parametreyle karşılaştırmak için...
          , @aSIFF        = SIFRE         --> ...Bulduğumuz şeyleri benzer değişkenlerde tutuyoruz
    FROM    dbo.PERSONEL
    WHERE   KULLANICI_ADI = @KulaniciAdi
      AND   SIFRE         = @Sifre
          ;

    SET @OK = IIF ( (     (dbo.fn_collate_turkish_cs_as(@aKULL , @KulaniciAdi) = 1) --> Büyük / Küçük harf doğrulamasını burası yapıyor
                      AND (dbo.fn_collate_turkish_cs_as(@aSIFF , @Sifre      ) = 1) --> Büyük / Küçük harf doğrulamasını burası yapıyor
                      AND (@ID > 0)                                                 --> VE bir ID tespit edebilmiş mi...
                    )
                  , 1 --> 3 şart da doğruysa 1
                  , 0 --> herhangi birisi yanlışsa sonuç = 0
                  )

    IF (@OK = 1) BEGIN
        UPDATE    TOP (1)     dbo.PERSONEL
        SET       SON_GIRIS = GETDATE()
        WHERE     ID        = @ID
        ;
    END ELSE BEGIN
       RAISERROR(N'Belirttiğiniz kullanıcı adı (%s) veya şifresi yanlış.', 16, 1, @KulaniciAdi); --> Tek başına bu haliyle de akışı bozmaz, sadece mesajı verir ve devam eder...
    END
    SELECT IIF(@OK = 1, @ID, 0) as ID
END
GO

--> BU KISIMDAN SONRASINI ÇALIŞTIRIRKEN CTRL+L TUŞ KOMBİNASYONUYLA EXECUTION PLAN İNCELEMESİ YAPABİLİRSİNİZ.
EXEC dbo.Kullanici_Dogrula N'azoT', N'oksijen'
GO

Değerli paylaşamınız için teşekkür ederim. Metod revizeleri devam ediyor... Smile
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  SQL Server Üzerinden Kümülatif Toplam Gösterimi adelphiforumz 4 213 16-03-2018, Saat: 09:15
Son Yorum: esistem
  MSSQL Server Hakkında Bilmek İstedikleriniz esrehmaan 23 1.838 19-02-2018, Saat: 09:57
Son Yorum: klavye
  Sql Server Otomatik Kurulum narkotik 7 265 13-01-2018, Saat: 22:30
Son Yorum: narkotik
  Raporlamada hangisi daha performanslıdır View? Store Procedure? adelphiforumz 13 560 23-12-2017, Saat: 22:09
Son Yorum: FiRewaLL
  SQL Server veritabanını Suspect & Emergency modundan kurtarmak Abdullah ILGAZ 2 285 23-12-2017, Saat: 08:52
Son Yorum: Abdullah ILGAZ



Konuyu Okuyanlar: 1 Ziyaretçi