Admin
Kurucu Admin
Merhaba Kocuce Ailesi
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.
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ı
Ş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.
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.
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
"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..
};
İ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
"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