USE [DNMembership]
GO
/****** Object: StoredProcedure [dbo].[P_AddAccount] Script Date: 08/22/2014 13:24:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/**
version : 12
author : 김도열
e-mail : [email protected]
created date : 2010-01-04
description : 계정을 추가합니다.
return value :
0 = 에러가 없습니다.
1 = 트랜잭션을 Commit할 수 없는 상태입니다. 트랜잭션을 Rollback합니다.
100 = 시스템 에러가 발생하였습니다. dbo.ErrorLogs 테이블을 조회하세요.
101101 = 이미 등록된 로그인 계정입니다.
101109 = 접속이 차단된 IP입니다.
history :
9 = input param. @inyNationalityCode 추가 at 2010-09-14
10 = input param. @inyChannelPartnerCode 추가 at 2010-11-25
11 = (48559) IP 차단 모드 추가 by 김도열 at 2011-12-23
12 = 신규 계정 보상 관련 플래그 기본 셋팅 추가 by 김원상 at 2013-01-07
**/
ALTER PROCEDURE [dbo].[P_AddAccount]
@nvcAccountName nvarchar(50) --// 로그인 계정 이름
, @inyAccountLevelCode tinyint --// 0=일반 유저, 10=신입(넥슨), 20=모니터링(넥슨), 30=마스터(넥슨), 99=QA, 100=개발자
, @inyCharacterCreateLimit tinyint --// 하루 생성 가능한 캐릭터 수
, @inyCharacterMaxCount tinyint --// 최대 보유할 수 있는 캐릭터 수
, @dt2LastLoginDate datetime2(0) --// 최근 로그인 일자
, @vchLastLoginIP varchar(15) = NULL --// (optional) 최근 로그인한 IP 주소
, @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]LastSessionID int = NULL --// (optional) 최근 로그인의 세션 ID
, @vchJoinIP varchar(15) = NULL --// (optional) 최초 Join 시 IP 주소
, @inyPublisherCode tinyint --// 0=스튜디오, 1=넥슨, 2=샨다, 3=NHN Japan
, @inyGenderCode tinyint = NULL --// (optional) 1=남성, 2=여성
, @[I][B][URL="http://forum.ragezone.com/members/1333446700.html"]DaT[/URL][/B][/I]BirthDate date = NULL --// (optional) 생년 월일 (생년만 유효할 수 있습니다.)
, @[I][B][URL="http://forum.ragezone.com/members/1333464713.html"]PAS[/URL][/B][/I]sphrase binary(20) = NULL --// (optional) 사내 테스트용 계정의 비밀 번호
, @inyNationalityCode tinyint = NULL --// 국가 코드. 95 Hong Kong, 207=Taiwan
, @inyChannelPartnerCode tinyint = NULL --// 1=MSN(Japan). 퍼블리셔 자체 계정이면 NULL값을 입력합니다.
, @nvcEmail nvarchar(320) = NULL --// Emails
, @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]AccountID int = NULL OUTPUT --// 로그인 계정 ID
--WITH EXECUTE AS 'SPExecutor'
AS
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue int;
/**_# Rollback and return if inside an uncommittable transaction.*/
IF XACT_STATE() = -1
BEGIN
SET @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue = 1;
GOTO ErrorHandler;
END
BEGIN TRY
/**_# 계정 생성이 차단된 IP이면 101109를 리턴합니다.*/
IF EXISTS (
SELECT *
FROM dbo.BlockedIPs WITH (NOLOCK)
WHERE dbo.FN_IP2IPNumber(@vchJoinIP) BETWEEN StartIP AND EndIP
AND (StartDate IS NULL OR GETDATE() BETWEEN StartDate AND EndDate)
AND IPBlockMethodCode = 2
)
BEGIN
SET @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue = 101109;
GOTO ErrorHandler;
END
/**_# [Accounts] 테이블에 INSERT합니다.*/
INSERT dbo.Accounts (AccountName, AccountLevelCode, GameOption, CharacterCreateLimit, LastCharacterCreateDate, CharacterMaxCount, LastLoginDate, LastLogoutDate, LastLoginIP, LastSessionID, JoinIP, RegisterDate, PublisherCode, GenderCode, BirthDate, Passphrase, Email, NationalityCode, ChannelPartnerCode, NewbieRewardFlag)
VALUES (@nvcAccountName, @inyAccountLevelCode, NULL, @inyCharacterCreateLimit, NULL, @inyCharacterMaxCount, @dt2LastLoginDate, NULL, dbo.FN_IP2IPNumber(@vchLastLoginIP), @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]LastSessionID, dbo.FN_IP2IPNumber(@vchJoinIP), GETDATE(), @inyPublisherCode, @inyGenderCode, @[I][B][URL="http://forum.ragezone.com/members/1333446700.html"]DaT[/URL][/B][/I]BirthDate, @[I][B][URL="http://forum.ragezone.com/members/1333464713.html"]PAS[/URL][/B][/I]sphrase, @inyNationalityCode, @inyChannelPartnerCode, CAST(0 AS bit), @nvcEmail);
SET @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]AccountID = SCOPE_IDENTITY();
/**_# 스튜디오용 계정인 경우, 패스워드를 해쉬하여 저장합니다.*/
IF @inyPublisherCode = 0 AND @[I][B][URL="http://forum.ragezone.com/members/1333464713.html"]PAS[/URL][/B][/I]sphrase IS NOT NULL
UPDATE dbo.Accounts
SET Passphrase = dbo.FN_HashPassphrase2 @[I][B][URL="http://forum.ragezone.com/members/1333464713.html"]PAS[/URL][/B][/I]sphrase, @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]AccountID)
WHERE AccountID = @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]AccountID;
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 2601 AND ERROR_MESSAGE() LIKE N'%IX_UN_Accounts_AccountName%'
SET @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue = 101101;
GOTO ErrorHandler;
END CATCH;
RETURN 0;
ErrorHandler:
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
IF @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue IS NULL OR @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue = 0
EXEC @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue = dbo.P_AddErrorLog;
RETURN @[I][B][URL="http://forum.ragezone.com/members/874269.html"]Int[/URL][/B][/I]ReturnValue;