ÇÖZÜLDÜ "No such registered id" Hatası ve Çözümü

Admin

Kurucu Admin
Katılım
22 Ara 2020
Mesajlar
492
Çözümler
1
Tepkime puanı
13,901
Puanları
160
Konum
Kütahya
Web
ko-yardim.com
Merhabalar,

Bugünkü konumuzda server kurulumu sırasında sıkça karşılaşılan hatalardan birisi olan "no such registered id" hatasını nasıl çözebileceğimize bakacağız.

"No such registered id" hatası nedir?
Bu hata, Türkçe'ye çevrildiğinde : "Böyle bir ID yok" demektir. Bu hata ile normalde KO , veritabanında kullanıcı eğer TB_USER tablosuna kayıtlı değilse karşılaşılır. Eğer girilen kullanıcı adı, veritabanında mevcutsa ve yine de bu hata ile karşılaşılıyor ise, veritabanında "login prosedürü" dediğimiz prosedürde bir hata, veya eksiklik mevcuttur.

Öncelikle, tipik bir login prosedürünü ele alalım.

Kod:
-- Created by Symbolic
-- 2021.01.01
-- Modify 2021 10.31 To update password from mgame password

ALTER PROCEDURE [dbo].[ACCOUNT_LOGIN]
@AccountID  VARCHAR(20),
@Password   VARCHAR(20),
@nRet       SMALLINT    OUTPUT

AS

DECLARE @pwd VARCHAR(20)
DECLARE @mgamepwd VARCHAR(20)
DECLARE @bAuthority tinyint

SET @pwd = NULL
SET @mgamepwd = NULL
SET @bAuthority = 0

SELECT @pwd = strPasswd, @bAuthority = byAuthority FROM  TB_USER WHERE strAccountID = @AccountID
IF @pwd IS NULL
BEGIN
    SET @nRet = 2
    RETURN
END

ELSE IF @pwd <> @Password
BEGIN
    SET @nRet = 3
    RETURN
END

IF @bAuthority = 4
BEGIN
    SET @nRet = 4
    RETURN
END

SET @nRet = 1
RETURN

Yukarıdaki prosedür, orjinal v1397 linux sisteminden, knight_account veritabanından alıntılanmıştır. Şimdi, bu prosedürde dikkat etmemiz gereken bir kaç nokta mevcut.

"Bu prosedür ne işe yarıyor kardeşim?"
Bu prosedür, siz oyuna giriş yapmaya çalıştığınız anda, loginserver tarafından çağrılıyor. Prosedür içerisindeki @AccountID ve @Password değerleri, sizin sağlamış olduğunuz ID ve Password değerleridir. @nRet değeri ise, prosedürün geriye döndüreceği sonuç değeridir. Örneğin
SET @nRet = 1
RETURN
derseniz, login işleminin başarılı olduğunu loginserver'a iletmiş olursunuz, loginserver'da bu sonucu isteği yapan cliente, yani size iletir. Eğer
SET @nRet = 2
RETURN
derseniz, isteği yapan clientte "No such registered id" hatasını göreceksiniz.

Diğer kullanabileceğiniz nRet kodları

Kod:
enum LoginErrorCode {
AUTH_SUCCESS    = 0x01, // Giriş başarılı
AUTH_NOT_FOUND  = 0x02, // No such registered id
AUTH_INVALID    = 0x03, // Invalid password
AUTH_BANNED     = 0x04, // This account is blocked
AUTH_IN_USE     = 0x05,// This account is already in use, do you want to disconnect..
AUTH_ERROR      = 0x06,// There is an error in selected server.
AUTH_FAILED     = 0xFF//Server is undergoing maintenance..
};

Şimdi, konumuza geri dönecek olursak, hatamızın sebebi herşey doğru olduğu halde prosedürden SET @nRet = 2 RETURN dönmesi. Dolayısı ile, prosedürde SET @nRet = 2 yapılmış her yeri kontrol etmeli, ve hatanın kaynağını bulmalıyız.

İlk yapacağınız şey, prosedürü hiç değiştirmeden F5'e basarak prosedürü kaydetmeyi deneyin. Eğer prosedür kaydedilemez, hata ile karşılaşırsanız bilin ki prosedür içerisinde, şu an veritabanında mevcut olmayan bir tabloya erişim denenmiş, veya hatalı bir kod dizilimi mevcut. Bu durumda, hatalı olan kısımı düzeltip, prosedürünüzü kaydettiğinizde hatanız ortadan kalkacaktır.

Eğer prosedür sorunsuz derleniyor ise, SET @nRet = 2 yapılmış yerlerden önce gelen IF deyimlerini kontrol edin.

Örnek olarak verdiğim prosedürde yalnızca bir SET @nRet kısmı var, dolayısıyla eğer ben "No such registered id" hatası görüyorsam, sorunun kaynağı kesinlikle bu deyimdir.

Kod:
IF @pwd IS NULL
BEGIN
    SET @nRet = 2
    RETURN
END

Yukarıdaki IF deyiminde pwd(parola) değeri boş ise, no such registered id hatası verilsin denmiş.


"Herşey iyi güzel hoş da, hangi prosedürün çağrıldığını nasıl bulacağım?"

Kolay. İlk önce, bütün server dosyalarınızı kapatın ve yalnızca login server'ı açın.

Başlat-çalıştır (veya windows+r) diyerek "profiler" (tırnaksız) yazın. SQL Server Profiler başlatılacaktır.

Sol üstteki "File" menüsünden "New trace"'yi seçin. Karşınıza SQL Server bağlantı diyalogu gelecektir. SQL Server Management Studio'da olduğu gibi, veritabanınıza bağlanın.

Gelen pencereden hiçbir şeyi değiştirmeden "Run" butonuna basın.

Şimdi clientinizi başlatın ve herhangi bir hesaba giriş yapmayı deneyin. SQL Server Profiler ekranında, çağrılan bütün sorgular ve prosedür adları gözükecektir.

Örneğin, benim sistemimde kullandığım prosedür adı "PROC_ACCOUNT_LOGIN" miş.

Konunun bütün noktalarını incelediğimize göre, son olarak da sizler için temiz bir ACCOUNT_LOGIN prosedürü yazarak konuyu tamamlıyorum.

Kod:
ALTER PROCEDURE [dbo].[ACCOUNT_LOGIN]
@AccountID  VARCHAR(20),
@Password   VARCHAR(20),
@nRet       SMALLINT    OUTPUT
AS
DECLARE @accountPassword VARCHAR(64) = '',  @isAlreadyInGame INT = 0, @COUNT INT = 0, @byAuth tinyint = 1,
@autoRegister tinyint= 0 -- otomatik kayıt aktifleştirmek için 1 yapın ve aşağıdaki alanı doldurun

BEGIN

SELECT @COUNT = COUNT(*), @accountPassword = TB_USER.[strPasswd], @byAuth = TB_USER.[byAuthority]  FROM TB_USER
    WHERE TB_USER.[strAccountID] = @AccountID
    GROUP BY strPasswd, byAuthority

   
    SELECT @isAlreadyInGame = COUNT(*) FROM CURRENTUSER
    WHERE CURRENTUSER.[strAccountID] = @AccountID
   

    IF @COUNT = 0
    BEGIN
                IF @autoRegister = 1
                BEGIN
                     BEGIN TRAN -- Transaction başlat
                   
                     -- BU KISIMDA INSERT INTO şeklinde TB_USER'a yeni kullanıcıyı ekleyin. Her DB'de farklı TB_USER sütunları bulunduğundan dolayı, bu alanı size bıraktım.



                     IF @@ERROR <> 0 -- TB_USER'a ekleme yaparken hata oluştu mu?
                     BEGIN
                              ROLLBACK TRAN -- Transaction'u geri al
                              SET @nRet = 6
                              RETURN
                     END
                     COMMIT TRAN -- Transaction'u uygula, kayıt başarılı
                     SET @nRet = 1
                     RETURN
                END
                -- Auto register yok ise
                SET @nRet = 2
                RETURN
    END
    ELSE IF @accountPassword != @Password
    BEGIN
                SET @nRet = 3
        RETURN-- Parola yanlış
    END
    ELSE IF @isAlreadyInGame > 0
    BEGIN
                SET @nRet = 5
        RETURN -- Zaten oyunda
    END
        ELSE IF @byAuth = 255
        BEGIN
                SET @nRet = 4
                RETURN -- Hesap banlı
        END
    ELSE
    BEGIN
                SET @nRet = 1
        RETURN-- Giriş başarılı
    END
END
 
Benzer konular Forum Tarih
A Genel Yardımlaşma ve Yardım 3 481

Benzer konular

Reklam