diff --git a/DBPatch/DBPatch_AccountDB_Create.bat b/DBPatch/DBPatch_AccountDB_Create.bat
new file mode 100644
index 0000000..1920ffc
--- /dev/null
+++ b/DBPatch/DBPatch_AccountDB_Create.bat
@@ -0,0 +1,20 @@
+@echo off
+CD ./sqlScripts/
+
+::log
+IF NOT EXIST .\logs mkdir logs
+
+::DB 정의 스키마
+SET Schema=SystemX.DB.AccountDB
+
+::연결정보
+SET ServerIP=127.0.0.1
+SET ServerPort=1433
+SET UserID=SystemX
+SET Passwd=X
+SET DBName=AccountDB
+
+::Default DB
+@echo off
+::CALL _CreateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%
+::CALL _CreateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%_DEV
\ No newline at end of file
diff --git a/DBPatch/DBPatch_AccountDB_Update.bat b/DBPatch/DBPatch_AccountDB_Update.bat
new file mode 100644
index 0000000..ea04207
--- /dev/null
+++ b/DBPatch/DBPatch_AccountDB_Update.bat
@@ -0,0 +1,23 @@
+@echo off
+CD .\sqlScripts\
+
+::log
+IF NOT EXIST .\logs mkdir logs
+
+::DB 정의 스키마
+SET Schema=SystemX.DB.AccountDB
+
+::연결정보
+SET ServerIP=127.0.0.1
+SET ServerPort=1433
+SET UserID=SystemX
+SET Passwd=X
+SET DBName=AccountDB
+
+@echo off
+::generate update script
+CALL _UpdateScriptGenerate.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%
+
+::Default DB
+::CALL _UpdateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%
+::CALL _UpdateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%_DEV
\ No newline at end of file
diff --git a/DBPatch/DBPatch_UniqueKeyDB_Create.bat b/DBPatch/DBPatch_UniqueKeyDB_Create.bat
new file mode 100644
index 0000000..73d6cdc
--- /dev/null
+++ b/DBPatch/DBPatch_UniqueKeyDB_Create.bat
@@ -0,0 +1,20 @@
+@echo off
+CD ./sqlScripts/
+
+::log
+IF NOT EXIST .\logs mkdir logs
+
+::DB 정의 스키마
+SET Schema=SystemX.DB.UniqueKeyDB
+
+::연결정보
+SET ServerIP=127.0.0.1
+SET ServerPort=1433
+SET UserID=SystemX
+SET Passwd=X
+SET DBName=UniqueKeyDB
+
+::Default DB
+@echo off
+::CALL _CreateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%
+::CALL _CreateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%_DEV
\ No newline at end of file
diff --git a/DBPatch/DBPatch_UniqueKeyDB_Update.bat b/DBPatch/DBPatch_UniqueKeyDB_Update.bat
new file mode 100644
index 0000000..5166c86
--- /dev/null
+++ b/DBPatch/DBPatch_UniqueKeyDB_Update.bat
@@ -0,0 +1,23 @@
+@echo off
+CD .\sqlScripts\
+
+::log
+IF NOT EXIST .\logs mkdir logs
+
+::DB 정의 스키마
+SET Schema=SystemX.DB.UniqueKeyDB
+
+::연결정보
+SET ServerIP=127.0.0.1
+SET ServerPort=1433
+SET UserID=SystemX
+SET Passwd=X
+SET DBName=UniqueKeyDB
+
+@echo off
+::generate update script
+CALL _UpdateScriptGenerate.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%
+
+::Default DB
+::CALL _UpdateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%
+CALL _UpdateDB.bat %Schema% %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%_DEV
\ No newline at end of file
diff --git a/Projects/Tools/Tools_Scaffold_AccountDB.bat b/DBPatch/Tool_AccountDB_Scaffold.bat
similarity index 100%
rename from Projects/Tools/Tools_Scaffold_AccountDB.bat
rename to DBPatch/Tool_AccountDB_Scaffold.bat
diff --git a/DBPatch/sqlScripts/SystemX.DB.AccountDB_Create.sql b/DBPatch/sqlScripts/SystemX.DB.AccountDB_Create.sql
new file mode 100644
index 0000000..72848a5
--- /dev/null
+++ b/DBPatch/sqlScripts/SystemX.DB.AccountDB_Create.sql
@@ -0,0 +1,346 @@
+/*
+SystemX.DB.AccountDB의 배포 스크립트
+
+이 코드는 도구를 사용하여 생성되었습니다.
+파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+변경 내용이 손실됩니다.
+*/
+
+GO
+SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
+
+SET NUMERIC_ROUNDABORT OFF;
+
+
+GO
+/*
+:setvar DatabaseName "SystemX.DB.AccountDB"
+:setvar DefaultFilePrefix "SystemX.DB.AccountDB"
+:setvar DefaultDataPath ""
+:setvar DefaultLogPath ""
+*/
+
+GO
+:on error exit
+GO
+/*
+SQLCMD 모드가 지원되지 않으면 SQLCMD 모드를 검색하고 스크립트를 실행하지 않습니다.
+SQLCMD 모드를 설정한 후에 이 스크립트를 다시 사용하려면 다음을 실행합니다.
+SET NOEXEC OFF;
+*/
+:setvar __IsSqlCmdEnabled "True"
+GO
+IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
+ BEGIN
+ PRINT N'이 스크립트를 실행하려면 SQLCMD 모드를 사용하도록 설정해야 합니다.';
+ SET NOEXEC ON;
+ END
+
+
+GO
+USE [master];
+
+
+GO
+
+IF (DB_ID(N'$(DatabaseName)') IS NOT NULL)
+BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+ DROP DATABASE [$(DatabaseName)];
+END
+
+GO
+PRINT N'$(DatabaseName) 데이터베이스를 만드는 중...'
+GO
+CREATE DATABASE [$(DatabaseName)] COLLATE Korean_Wansung_CI_AS
+GO
+USE [$(DatabaseName)];
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET ANSI_NULLS ON,
+ ANSI_PADDING ON,
+ ANSI_WARNINGS ON,
+ ARITHABORT ON,
+ CONCAT_NULL_YIELDS_NULL ON,
+ NUMERIC_ROUNDABORT OFF,
+ QUOTED_IDENTIFIER ON,
+ ANSI_NULL_DEFAULT ON,
+ CURSOR_DEFAULT LOCAL,
+ RECOVERY FULL,
+ CURSOR_CLOSE_ON_COMMIT OFF,
+ AUTO_CREATE_STATISTICS ON,
+ AUTO_SHRINK OFF,
+ AUTO_UPDATE_STATISTICS ON,
+ RECURSIVE_TRIGGERS OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET ALLOW_SNAPSHOT_ISOLATION OFF;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET READ_COMMITTED_SNAPSHOT OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET AUTO_UPDATE_STATISTICS_ASYNC OFF,
+ PAGE_VERIFY NONE,
+ DATE_CORRELATION_OPTIMIZATION OFF,
+ DISABLE_BROKER,
+ PARAMETERIZATION SIMPLE,
+ SUPPLEMENTAL_LOGGING OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF IS_SRVROLEMEMBER(N'sysadmin') = 1
+ BEGIN
+ IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ EXECUTE sp_executesql N'ALTER DATABASE [$(DatabaseName)]
+ SET TRUSTWORTHY OFF,
+ DB_CHAINING OFF
+ WITH ROLLBACK IMMEDIATE';
+ END
+ END
+ELSE
+ BEGIN
+ PRINT N'데이터베이스 설정을 수정할 수 없습니다. 이러한 설정을 적용하려면 SysAdmin이어야 합니다.';
+ END
+
+
+GO
+IF IS_SRVROLEMEMBER(N'sysadmin') = 1
+ BEGIN
+ IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ EXECUTE sp_executesql N'ALTER DATABASE [$(DatabaseName)]
+ SET HONOR_BROKER_PRIORITY OFF
+ WITH ROLLBACK IMMEDIATE';
+ END
+ END
+ELSE
+ BEGIN
+ PRINT N'데이터베이스 설정을 수정할 수 없습니다. 이러한 설정을 적용하려면 SysAdmin이어야 합니다.';
+ END
+
+
+GO
+ALTER DATABASE [$(DatabaseName)]
+ SET TARGET_RECOVERY_TIME = 0 SECONDS
+ WITH ROLLBACK IMMEDIATE;
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET FILESTREAM(NON_TRANSACTED_ACCESS = OFF),
+ CONTAINMENT = NONE
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF),
+ MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = OFF,
+ DELAYED_DURABILITY = DISABLED
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET QUERY_STORE (QUERY_CAPTURE_MODE = ALL, DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_PLANS_PER_QUERY = 200, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 367), MAX_STORAGE_SIZE_MB = 100)
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET QUERY_STORE = OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET TEMPORAL_HISTORY_RETENTION ON
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF fulltextserviceproperty(N'IsFulltextInstalled') = 1
+ EXECUTE sp_fulltext_database 'enable';
+
+
+GO
+PRINT N'테이블 [dbo].[tRefreshToken]을(를) 만드는 중...';
+
+
+GO
+CREATE TABLE [dbo].[tRefreshToken] (
+ [cAuid] NVARCHAR (250) NOT NULL,
+ [cRefreshToken] NVARCHAR (1000) NOT NULL,
+ PRIMARY KEY CLUSTERED ([cAuid] ASC)
+);
+
+
+GO
+PRINT N'테이블 [dbo].[tRole]을(를) 만드는 중...';
+
+
+GO
+CREATE TABLE [dbo].[tRole] (
+ [cAuid] NVARCHAR (250) NOT NULL,
+ [cRoleID] TINYINT NOT NULL,
+ [cRoleName] NVARCHAR (20) NOT NULL,
+ PRIMARY KEY CLUSTERED ([cAuid] ASC)
+);
+
+
+GO
+PRINT N'테이블 [dbo].[tUser]을(를) 만드는 중...';
+
+
+GO
+CREATE TABLE [dbo].[tUser] (
+ [cUserID] NVARCHAR (50) NOT NULL,
+ [cAuid] NVARCHAR (250) NOT NULL,
+ [cPasswordHashed] NVARCHAR (250) NOT NULL,
+ [cState] TINYINT NOT NULL,
+ [cCreateDateTime] DATETIME2 (7) NOT NULL,
+ [cLastLoginDateTime] DATETIME2 (7) NULL,
+ PRIMARY KEY CLUSTERED ([cUserID] ASC)
+);
+
+
+GO
+/*
+배포 후 스크립트 템플릿
+--------------------------------------------------------------------------------------
+ 이 파일에는 빌드 스크립트에 추가될 SQL 문이 있습니다.
+ SQLCMD 구문을 사용하여 파일을 배포 후 스크립트에 포함합니다.
+ 예: :r .\myfile.sql
+ SQLCMD 구문을 사용하여 배포 후 스크립트의 변수를 참조합니다.
+ 예: :setvar TableName MyTable
+ SELECT * FROM [$(TableName)]
+--------------------------------------------------------------------------------------
+*/
+
+IF NOT EXISTS (SELECT 1 FROM tUser WHERE cUserID = 'Alis')
+BEGIN
+ INSERT INTO tUser (cUserID, cAuid, cPasswordHashed, cState, cCreateDateTime, cLastLoginDateTime)
+ VALUES ('Alis', 'SuperUserAlis' ,'oKLQCdunc2kT5aAVfK+POKwd8R3p8OZvs/NATwpg4gM=' ,1 ,GETDATE(), GETDATE());
+
+ INSERT INTO tRole(cAuid, cRoleID, cRoleName)
+ VALUES ('SuperUserAlis','20','SuperUser');
+END
+
+IF NOT EXISTS (SELECT 1 FROM tUser WHERE cUserID = 'SystemX')
+BEGIN
+ INSERT INTO tUser (cUserID, cAuid, cPasswordHashed, cState, cCreateDateTime, cLastLoginDateTime)
+ VALUES ('SystemX', 'SuperUserSystemX' ,'S2irOEf+2n1sYsH7y+6/o16rc1HtXnj03a3qXfZLgBU=' ,1 ,GETDATE(), GETDATE());
+
+ INSERT INTO tRole(cAuid, cRoleID, cRoleName)
+ VALUES ('SuperUserSystemX','20','SuperUser');
+END
+GO
+
+GO
+DECLARE @VarDecimalSupported AS BIT;
+
+SELECT @VarDecimalSupported = 0;
+
+IF ((ServerProperty(N'EngineEdition') = 3)
+ AND (((@@microsoftversion / power(2, 24) = 9)
+ AND (@@microsoftversion & 0xffff >= 3024))
+ OR ((@@microsoftversion / power(2, 24) = 10)
+ AND (@@microsoftversion & 0xffff >= 1600))))
+ SELECT @VarDecimalSupported = 1;
+
+IF (@VarDecimalSupported > 0)
+ BEGIN
+ EXECUTE sp_db_vardecimal_storage_format N'$(DatabaseName)', 'ON';
+ END
+
+
+GO
+ALTER DATABASE [$(DatabaseName)]
+ SET MULTI_USER
+ WITH ROLLBACK IMMEDIATE;
+
+
+GO
+PRINT N'업데이트가 완료되었습니다.';
+
+
+GO
diff --git a/DBPatch/sqlScripts/SystemX.DB.AccountDB_Update.sql b/DBPatch/sqlScripts/SystemX.DB.AccountDB_Update.sql
new file mode 100644
index 0000000..fc0376e
--- /dev/null
+++ b/DBPatch/sqlScripts/SystemX.DB.AccountDB_Update.sql
@@ -0,0 +1,89 @@
+/*
+AccountDB의 배포 스크립트
+
+이 코드는 도구를 사용하여 생성되었습니다.
+이 파일을 변경하면 잘못된 동작이 발생할 수 있으며 코드가 다시 생성되면
+이러한 변경 내용이 손실됩니다.
+*/
+
+GO
+SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
+
+SET NUMERIC_ROUNDABORT OFF;
+
+
+GO
+/*
+:setvar DatabaseName "AccountDB"
+:setvar DefaultFilePrefix "AccountDB"
+:setvar DefaultDataPath "D:\20_MSSQL\DATA\"
+:setvar DefaultLogPath "D:\20_MSSQL\DATA\"
+*/
+
+GO
+:on error exit
+GO
+/*
+SQLCMD 모드를 검색하고 SQLCMD 모드가 지원되지 않는 경우 스크립트 실행을 사용하지 않도록 설정합니다.
+SQLCMD 모드를 사용하도록 설정한 후 스크립트를 다시 사용하도록 설정하려면 다음을 실행합니다.
+NOEXEC를 끕니다.
+*/
+:setvar __IsSqlCmdEnabled "True"
+GO
+IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
+ BEGIN
+ PRINT N'이 스크립트를 실행하려면 SQLCMD 모드를 사용하도록 설정해야 합니다.';
+ SET NOEXEC ON;
+ END
+
+
+GO
+USE [$(DatabaseName)];
+
+
+GO
+PRINT N'테이블 [dbo].[tUser]을(를) 변경하는 중...';
+
+
+GO
+ALTER TABLE [dbo].[tUser]
+ ADD [cUpdateTest] NCHAR (10) NULL;
+
+
+GO
+/*
+배포 후 스크립트 템플릿
+--------------------------------------------------------------------------------------
+ 이 파일에는 빌드 스크립트에 추가될 SQL 문이 있습니다.
+ SQLCMD 구문을 사용하여 파일을 배포 후 스크립트에 포함합니다.
+ 예: :r .\myfile.sql
+ SQLCMD 구문을 사용하여 배포 후 스크립트의 변수를 참조합니다.
+ 예: :setvar TableName MyTable
+ SELECT * FROM [$(TableName)]
+--------------------------------------------------------------------------------------
+*/
+
+IF NOT EXISTS (SELECT 1 FROM tUser WHERE cUserID = 'Alis')
+BEGIN
+ INSERT INTO tUser (cUserID, cAuid, cPasswordHashed, cState, cCreateDateTime, cLastLoginDateTime)
+ VALUES ('Alis', 'SuperUserAlis' ,'oKLQCdunc2kT5aAVfK+POKwd8R3p8OZvs/NATwpg4gM=' ,1 ,GETDATE(), GETDATE());
+
+ INSERT INTO tRole(cAuid, cRoleID, cRoleName)
+ VALUES ('SuperUserAlis','20','SuperUser');
+END
+
+IF NOT EXISTS (SELECT 1 FROM tUser WHERE cUserID = 'SystemX')
+BEGIN
+ INSERT INTO tUser (cUserID, cAuid, cPasswordHashed, cState, cCreateDateTime, cLastLoginDateTime)
+ VALUES ('SystemX', 'SuperUserSystemX' ,'S2irOEf+2n1sYsH7y+6/o16rc1HtXnj03a3qXfZLgBU=' ,1 ,GETDATE(), GETDATE());
+
+ INSERT INTO tRole(cAuid, cRoleID, cRoleName)
+ VALUES ('SuperUserSystemX','20','SuperUser');
+END
+GO
+
+GO
+PRINT N'업데이트가 완료되었습니다.';
+
+
+GO
diff --git a/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Create.sql b/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Create.sql
new file mode 100644
index 0000000..433374e
--- /dev/null
+++ b/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Create.sql
@@ -0,0 +1,290 @@
+/*
+SystemX.DB.UniqueKeyDB의 배포 스크립트
+
+이 코드는 도구를 사용하여 생성되었습니다.
+파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+변경 내용이 손실됩니다.
+*/
+
+GO
+SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
+
+SET NUMERIC_ROUNDABORT OFF;
+
+
+GO
+/*
+:setvar DatabaseName "SystemX.DB.UniqueKeyDB"
+:setvar DefaultFilePrefix "SystemX.DB.UniqueKeyDB"
+:setvar DefaultDataPath ""
+:setvar DefaultLogPath ""
+*/
+
+GO
+:on error exit
+GO
+/*
+SQLCMD 모드가 지원되지 않으면 SQLCMD 모드를 검색하고 스크립트를 실행하지 않습니다.
+SQLCMD 모드를 설정한 후에 이 스크립트를 다시 사용하려면 다음을 실행합니다.
+SET NOEXEC OFF;
+*/
+:setvar __IsSqlCmdEnabled "True"
+GO
+IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
+ BEGIN
+ PRINT N'이 스크립트를 실행하려면 SQLCMD 모드를 사용하도록 설정해야 합니다.';
+ SET NOEXEC ON;
+ END
+
+
+GO
+USE [master];
+
+
+GO
+
+IF (DB_ID(N'$(DatabaseName)') IS NOT NULL)
+BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+ DROP DATABASE [$(DatabaseName)];
+END
+
+GO
+PRINT N'$(DatabaseName) 데이터베이스를 만드는 중...'
+GO
+CREATE DATABASE [$(DatabaseName)] COLLATE Korean_Wansung_CI_AS
+GO
+USE [$(DatabaseName)];
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET ANSI_NULLS ON,
+ ANSI_PADDING ON,
+ ANSI_WARNINGS ON,
+ ARITHABORT ON,
+ CONCAT_NULL_YIELDS_NULL ON,
+ NUMERIC_ROUNDABORT OFF,
+ QUOTED_IDENTIFIER ON,
+ ANSI_NULL_DEFAULT ON,
+ CURSOR_DEFAULT LOCAL,
+ RECOVERY FULL,
+ CURSOR_CLOSE_ON_COMMIT OFF,
+ AUTO_CREATE_STATISTICS ON,
+ AUTO_SHRINK OFF,
+ AUTO_UPDATE_STATISTICS ON,
+ RECURSIVE_TRIGGERS OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET ALLOW_SNAPSHOT_ISOLATION OFF;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET READ_COMMITTED_SNAPSHOT OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET AUTO_UPDATE_STATISTICS_ASYNC OFF,
+ PAGE_VERIFY NONE,
+ DATE_CORRELATION_OPTIMIZATION OFF,
+ DISABLE_BROKER,
+ PARAMETERIZATION SIMPLE,
+ SUPPLEMENTAL_LOGGING OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF IS_SRVROLEMEMBER(N'sysadmin') = 1
+ BEGIN
+ IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ EXECUTE sp_executesql N'ALTER DATABASE [$(DatabaseName)]
+ SET TRUSTWORTHY OFF,
+ DB_CHAINING OFF
+ WITH ROLLBACK IMMEDIATE';
+ END
+ END
+ELSE
+ BEGIN
+ PRINT N'데이터베이스 설정을 수정할 수 없습니다. 이러한 설정을 적용하려면 SysAdmin이어야 합니다.';
+ END
+
+
+GO
+IF IS_SRVROLEMEMBER(N'sysadmin') = 1
+ BEGIN
+ IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ EXECUTE sp_executesql N'ALTER DATABASE [$(DatabaseName)]
+ SET HONOR_BROKER_PRIORITY OFF
+ WITH ROLLBACK IMMEDIATE';
+ END
+ END
+ELSE
+ BEGIN
+ PRINT N'데이터베이스 설정을 수정할 수 없습니다. 이러한 설정을 적용하려면 SysAdmin이어야 합니다.';
+ END
+
+
+GO
+ALTER DATABASE [$(DatabaseName)]
+ SET TARGET_RECOVERY_TIME = 0 SECONDS
+ WITH ROLLBACK IMMEDIATE;
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET FILESTREAM(NON_TRANSACTED_ACCESS = OFF),
+ CONTAINMENT = NONE
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF),
+ MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = OFF,
+ DELAYED_DURABILITY = DISABLED
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET QUERY_STORE (QUERY_CAPTURE_MODE = ALL, DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_PLANS_PER_QUERY = 200, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 367), MAX_STORAGE_SIZE_MB = 100)
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET QUERY_STORE = OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET TEMPORAL_HISTORY_RETENTION ON
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF fulltextserviceproperty(N'IsFulltextInstalled') = 1
+ EXECUTE sp_fulltext_database 'enable';
+
+
+GO
+PRINT N'테이블 [dbo].[tUniqueKeyStorage]을(를) 만드는 중...';
+
+
+GO
+CREATE TABLE [dbo].[tUniqueKeyStorage] (
+ [cIdentity] NVARCHAR (200) NOT NULL,
+ [cDateTime] DATETIME2 (7) NOT NULL,
+ [cData1] NVARCHAR (4000) NULL,
+ [cData2] NVARCHAR (4000) NULL,
+ [cData3] NVARCHAR (4000) NULL,
+ [cData4] NVARCHAR (4000) NULL,
+ [cData5] NVARCHAR (4000) NULL,
+ PRIMARY KEY CLUSTERED ([cIdentity] ASC)
+);
+
+
+GO
+DECLARE @VarDecimalSupported AS BIT;
+
+SELECT @VarDecimalSupported = 0;
+
+IF ((ServerProperty(N'EngineEdition') = 3)
+ AND (((@@microsoftversion / power(2, 24) = 9)
+ AND (@@microsoftversion & 0xffff >= 3024))
+ OR ((@@microsoftversion / power(2, 24) = 10)
+ AND (@@microsoftversion & 0xffff >= 1600))))
+ SELECT @VarDecimalSupported = 1;
+
+IF (@VarDecimalSupported > 0)
+ BEGIN
+ EXECUTE sp_db_vardecimal_storage_format N'$(DatabaseName)', 'ON';
+ END
+
+
+GO
+ALTER DATABASE [$(DatabaseName)]
+ SET MULTI_USER
+ WITH ROLLBACK IMMEDIATE;
+
+
+GO
+PRINT N'업데이트가 완료되었습니다.';
+
+
+GO
diff --git a/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Update.sql b/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Update.sql
new file mode 100644
index 0000000..d09a6e2
--- /dev/null
+++ b/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Update.sql
@@ -0,0 +1,57 @@
+/*
+UniqueKeyDB의 배포 스크립트
+
+이 코드는 도구를 사용하여 생성되었습니다.
+이 파일을 변경하면 잘못된 동작이 발생할 수 있으며 코드가 다시 생성되면
+이러한 변경 내용이 손실됩니다.
+*/
+
+GO
+SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
+
+SET NUMERIC_ROUNDABORT OFF;
+
+
+GO
+/*
+:setvar DatabaseName "UniqueKeyDB"
+:setvar DefaultFilePrefix "UniqueKeyDB"
+:setvar DefaultDataPath "D:\20_MSSQL\DATA\"
+:setvar DefaultLogPath "D:\20_MSSQL\DATA\"
+*/
+
+GO
+:on error exit
+GO
+/*
+SQLCMD 모드를 검색하고 SQLCMD 모드가 지원되지 않는 경우 스크립트 실행을 사용하지 않도록 설정합니다.
+SQLCMD 모드를 사용하도록 설정한 후 스크립트를 다시 사용하도록 설정하려면 다음을 실행합니다.
+NOEXEC를 끕니다.
+*/
+:setvar __IsSqlCmdEnabled "True"
+GO
+IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
+ BEGIN
+ PRINT N'이 스크립트를 실행하려면 SQLCMD 모드를 사용하도록 설정해야 합니다.';
+ SET NOEXEC ON;
+ END
+
+
+GO
+USE [$(DatabaseName)];
+
+
+GO
+PRINT N'테이블 [dbo].[tUniqueKeyStorage]을(를) 변경하는 중...';
+
+
+GO
+ALTER TABLE [dbo].[tUniqueKeyStorage]
+ ADD [cData6] NCHAR (10) NULL;
+
+
+GO
+PRINT N'업데이트가 완료되었습니다.';
+
+
+GO
diff --git a/DBPatch/sqlScripts/_CreateDB.bat b/DBPatch/sqlScripts/_CreateDB.bat
new file mode 100644
index 0000000..5b66947
--- /dev/null
+++ b/DBPatch/sqlScripts/_CreateDB.bat
@@ -0,0 +1,19 @@
+@echo off
+
+SET Schema=%1
+SET ServerIP=%2
+SET ServerPort=%3
+SET UserID=%4
+SET Passwd=%5
+SET DBName=%6
+
+SET SqlCmdOption=-C -U %UserID% -P %Passwd% -S %ServerIP%,%ServerPort% -f 65001 -o .\logs\%DBName%.log
+SET DatabaseName=%DBName%
+sqlcmd %SqlCmdOption% -i .\%Schema%_Create.sql
+if errorlevel 1 goto errexit
+goto end
+:errexit
+echo DB Patch Fail
+goto end
+:end
+@echo on
\ No newline at end of file
diff --git a/DBPatch/sqlScripts/_UpdateDB.bat b/DBPatch/sqlScripts/_UpdateDB.bat
new file mode 100644
index 0000000..c070cdc
--- /dev/null
+++ b/DBPatch/sqlScripts/_UpdateDB.bat
@@ -0,0 +1,20 @@
+@echo off
+
+SET Schema=%1
+SET ServerIP=%2
+SET ServerPort=%3
+SET UserID=%4
+SET Passwd=%5
+SET DBName=%6
+
+SET SqlCmdOption=-U %UserID% -P %Passwd% -S %ServerIP%,%ServerPort% -d %DBName% -o .\logs\%DBName%.log
+SET DatabaseName=%DBName%
+sqlcmd %SqlCmdOption% -i .\%Schema%_Update.sql
+
+if errorlevel 1 goto errexit
+goto end
+:errexit
+echo DB Patch Fail
+goto end
+:end
+@echo on
\ No newline at end of file
diff --git a/DBPatch/sqlScripts/_UpdateScriptGenerate.bat b/DBPatch/sqlScripts/_UpdateScriptGenerate.bat
new file mode 100644
index 0000000..c899e38
--- /dev/null
+++ b/DBPatch/sqlScripts/_UpdateScriptGenerate.bat
@@ -0,0 +1,11 @@
+@echo off
+
+SET Schema=%1
+SET ServerIP=%2
+SET ServerPort=%3
+SET UserID=%4
+SET Passwd=%5
+SET DBName=%6
+
+::create update sql file
+sqlpackage /Action:Script /SourceFile:./dacpac/%Schema%.dacpac /TargetConnectionString:"server=%ServerIP%,%ServerPort%; user id=%UserID%; password=%Passwd%; database=%DBName%; TrustServerCertificate=true" /OutputPath:"./%Schema%_Update.sql" /p:CommentOutSetVarDeclarations=True
\ No newline at end of file
diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac
new file mode 100644
index 0000000..8681144
Binary files /dev/null and b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac differ
diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac
new file mode 100644
index 0000000..d134090
Binary files /dev/null and b/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac differ
diff --git a/Projects/DLL/SystemX.Core.DB.dll b/Projects/DLL/SystemX.Core.DB.dll
index 91681c1..5cb286e 100644
Binary files a/Projects/DLL/SystemX.Core.DB.dll and b/Projects/DLL/SystemX.Core.DB.dll differ
diff --git a/Projects/DLL/SystemX.Core.dll b/Projects/DLL/SystemX.Core.dll
index 25f7c97..10884ee 100644
Binary files a/Projects/DLL/SystemX.Core.dll and b/Projects/DLL/SystemX.Core.dll differ
diff --git a/Projects/SystemX.Core/SystemX.DB.AccountDB/SystemX.DB.AccountDB.sqlproj b/Projects/SystemX.Core/DB/SystemX.DB.AccountDB/SystemX.DB.AccountDB.sqlproj
similarity index 97%
rename from Projects/SystemX.Core/SystemX.DB.AccountDB/SystemX.DB.AccountDB.sqlproj
rename to Projects/SystemX.Core/DB/SystemX.DB.AccountDB/SystemX.DB.AccountDB.sqlproj
index d94a9b7..de6e417 100644
--- a/Projects/SystemX.Core/SystemX.DB.AccountDB/SystemX.DB.AccountDB.sqlproj
+++ b/Projects/SystemX.Core/DB/SystemX.DB.AccountDB/SystemX.DB.AccountDB.sqlproj
@@ -73,8 +73,8 @@
- xcopy /y $(ProjectDir)$(OutputPath)$(TargetName)_Create.sql $(SolutionDir)DBPatch\sqlScripts\
+ xcopy /y $(ProjectDir)$(OutputPath)$(TargetName)_Create.sql $(SolutionDir)..\..\DBPatch\sqlScripts\
-xcopy /y $(ProjectDir)$(OutputPath)$(TargetName).dacpac $(SolutionDir)DBPatch\sqlScripts\dacpac\
+xcopy /y $(ProjectDir)$(OutputPath)$(TargetName).dacpac $(SolutionDir)..\..\DBPatch\sqlScripts\dacpac\
\ No newline at end of file
diff --git a/Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Scripts/scriptAfterBuild.sql b/Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Scripts/scriptAfterBuild.sql
similarity index 100%
rename from Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Scripts/scriptAfterBuild.sql
rename to Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Scripts/scriptAfterBuild.sql
diff --git a/Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Tables/tRefreshToken.sql b/Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Tables/tRefreshToken.sql
similarity index 100%
rename from Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Tables/tRefreshToken.sql
rename to Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Tables/tRefreshToken.sql
diff --git a/Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Tables/tRole.sql b/Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Tables/tRole.sql
similarity index 100%
rename from Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Tables/tRole.sql
rename to Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Tables/tRole.sql
diff --git a/Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Tables/tUser.sql b/Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Tables/tUser.sql
similarity index 100%
rename from Projects/SystemX.Core/SystemX.DB.AccountDB/dbo/Tables/tUser.sql
rename to Projects/SystemX.Core/DB/SystemX.DB.AccountDB/dbo/Tables/tUser.sql
diff --git a/Projects/SystemX.Core/DB/SystemX.DB.UniqueKeyDB/SystemX.DB.UniqueKeyDB.sqlproj b/Projects/SystemX.Core/DB/SystemX.DB.UniqueKeyDB/SystemX.DB.UniqueKeyDB.sqlproj
new file mode 100644
index 0000000..8e11099
--- /dev/null
+++ b/Projects/SystemX.Core/DB/SystemX.DB.UniqueKeyDB/SystemX.DB.UniqueKeyDB.sqlproj
@@ -0,0 +1,75 @@
+
+
+
+ Debug
+ AnyCPU
+ SystemX.DB.UniqueKeyDB
+ 2.0
+ 4.1
+ {c67f3f97-1d52-4c75-a04f-16ed41822ccd}
+ Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider
+ Database
+
+
+ SystemX.DB.UniqueKeyDB
+ SystemX.DB.UniqueKeyDB
+ 1042,CI
+ BySchemaAndSchemaType
+ True
+ v4.7.2
+ CS
+ Properties
+ False
+ True
+ True
+ True
+ Korean_Wansung_CI_AS
+
+
+ bin\Release\
+ $(MSBuildProjectName).sql
+ False
+ pdbonly
+ true
+ false
+ true
+ prompt
+ 4
+
+
+ bin\Debug\
+ $(MSBuildProjectName).sql
+ true
+ true
+ full
+ false
+ true
+ true
+ prompt
+ 4
+
+
+ 11.0
+
+ True
+ 11.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xcopy /y $(ProjectDir)$(OutputPath)$(TargetName)_Create.sql $(SolutionDir)..\..\DBPatch\sqlScripts\
+
+xcopy /y $(ProjectDir)$(OutputPath)$(TargetName).dacpac $(SolutionDir)..\..\DBPatch\sqlScripts\dacpac\
+
+
\ No newline at end of file
diff --git a/Projects/SystemX.Core/DB/SystemX.DB.UniqueKeyDB/dbo/Tables/tUniqueKeyStorage.sql b/Projects/SystemX.Core/DB/SystemX.DB.UniqueKeyDB/dbo/Tables/tUniqueKeyStorage.sql
new file mode 100644
index 0000000..6dd0daa
--- /dev/null
+++ b/Projects/SystemX.Core/DB/SystemX.DB.UniqueKeyDB/dbo/Tables/tUniqueKeyStorage.sql
@@ -0,0 +1,10 @@
+CREATE TABLE [dbo].[tUniqueKeyStorage]
+(
+ [cIdentity] NVARCHAR(200) NOT NULL PRIMARY KEY,
+ [cDateTime] DATETIME2 NOT NULL,
+ [cData1] NVARCHAR(4000),
+ [cData2] NVARCHAR(4000),
+ [cData3] NVARCHAR(4000),
+ [cData4] NVARCHAR(4000),
+ [cData5] NVARCHAR(4000),
+)
diff --git a/Projects/SystemX.Core/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Create.sql b/Projects/SystemX.Core/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Create.sql
new file mode 100644
index 0000000..433374e
--- /dev/null
+++ b/Projects/SystemX.Core/DBPatch/sqlScripts/SystemX.DB.UniqueKeyDB_Create.sql
@@ -0,0 +1,290 @@
+/*
+SystemX.DB.UniqueKeyDB의 배포 스크립트
+
+이 코드는 도구를 사용하여 생성되었습니다.
+파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+변경 내용이 손실됩니다.
+*/
+
+GO
+SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
+
+SET NUMERIC_ROUNDABORT OFF;
+
+
+GO
+/*
+:setvar DatabaseName "SystemX.DB.UniqueKeyDB"
+:setvar DefaultFilePrefix "SystemX.DB.UniqueKeyDB"
+:setvar DefaultDataPath ""
+:setvar DefaultLogPath ""
+*/
+
+GO
+:on error exit
+GO
+/*
+SQLCMD 모드가 지원되지 않으면 SQLCMD 모드를 검색하고 스크립트를 실행하지 않습니다.
+SQLCMD 모드를 설정한 후에 이 스크립트를 다시 사용하려면 다음을 실행합니다.
+SET NOEXEC OFF;
+*/
+:setvar __IsSqlCmdEnabled "True"
+GO
+IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
+ BEGIN
+ PRINT N'이 스크립트를 실행하려면 SQLCMD 모드를 사용하도록 설정해야 합니다.';
+ SET NOEXEC ON;
+ END
+
+
+GO
+USE [master];
+
+
+GO
+
+IF (DB_ID(N'$(DatabaseName)') IS NOT NULL)
+BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+ DROP DATABASE [$(DatabaseName)];
+END
+
+GO
+PRINT N'$(DatabaseName) 데이터베이스를 만드는 중...'
+GO
+CREATE DATABASE [$(DatabaseName)] COLLATE Korean_Wansung_CI_AS
+GO
+USE [$(DatabaseName)];
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET ANSI_NULLS ON,
+ ANSI_PADDING ON,
+ ANSI_WARNINGS ON,
+ ARITHABORT ON,
+ CONCAT_NULL_YIELDS_NULL ON,
+ NUMERIC_ROUNDABORT OFF,
+ QUOTED_IDENTIFIER ON,
+ ANSI_NULL_DEFAULT ON,
+ CURSOR_DEFAULT LOCAL,
+ RECOVERY FULL,
+ CURSOR_CLOSE_ON_COMMIT OFF,
+ AUTO_CREATE_STATISTICS ON,
+ AUTO_SHRINK OFF,
+ AUTO_UPDATE_STATISTICS ON,
+ RECURSIVE_TRIGGERS OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET ALLOW_SNAPSHOT_ISOLATION OFF;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET READ_COMMITTED_SNAPSHOT OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET AUTO_UPDATE_STATISTICS_ASYNC OFF,
+ PAGE_VERIFY NONE,
+ DATE_CORRELATION_OPTIMIZATION OFF,
+ DISABLE_BROKER,
+ PARAMETERIZATION SIMPLE,
+ SUPPLEMENTAL_LOGGING OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF IS_SRVROLEMEMBER(N'sysadmin') = 1
+ BEGIN
+ IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ EXECUTE sp_executesql N'ALTER DATABASE [$(DatabaseName)]
+ SET TRUSTWORTHY OFF,
+ DB_CHAINING OFF
+ WITH ROLLBACK IMMEDIATE';
+ END
+ END
+ELSE
+ BEGIN
+ PRINT N'데이터베이스 설정을 수정할 수 없습니다. 이러한 설정을 적용하려면 SysAdmin이어야 합니다.';
+ END
+
+
+GO
+IF IS_SRVROLEMEMBER(N'sysadmin') = 1
+ BEGIN
+ IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ EXECUTE sp_executesql N'ALTER DATABASE [$(DatabaseName)]
+ SET HONOR_BROKER_PRIORITY OFF
+ WITH ROLLBACK IMMEDIATE';
+ END
+ END
+ELSE
+ BEGIN
+ PRINT N'데이터베이스 설정을 수정할 수 없습니다. 이러한 설정을 적용하려면 SysAdmin이어야 합니다.';
+ END
+
+
+GO
+ALTER DATABASE [$(DatabaseName)]
+ SET TARGET_RECOVERY_TIME = 0 SECONDS
+ WITH ROLLBACK IMMEDIATE;
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET FILESTREAM(NON_TRANSACTED_ACCESS = OFF),
+ CONTAINMENT = NONE
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF),
+ MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = OFF,
+ DELAYED_DURABILITY = DISABLED
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET QUERY_STORE (QUERY_CAPTURE_MODE = ALL, DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_PLANS_PER_QUERY = 200, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 367), MAX_STORAGE_SIZE_MB = 100)
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET QUERY_STORE = OFF
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
+ ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
+ ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
+ END
+
+
+GO
+IF EXISTS (SELECT 1
+ FROM [master].[dbo].[sysdatabases]
+ WHERE [name] = N'$(DatabaseName)')
+ BEGIN
+ ALTER DATABASE [$(DatabaseName)]
+ SET TEMPORAL_HISTORY_RETENTION ON
+ WITH ROLLBACK IMMEDIATE;
+ END
+
+
+GO
+IF fulltextserviceproperty(N'IsFulltextInstalled') = 1
+ EXECUTE sp_fulltext_database 'enable';
+
+
+GO
+PRINT N'테이블 [dbo].[tUniqueKeyStorage]을(를) 만드는 중...';
+
+
+GO
+CREATE TABLE [dbo].[tUniqueKeyStorage] (
+ [cIdentity] NVARCHAR (200) NOT NULL,
+ [cDateTime] DATETIME2 (7) NOT NULL,
+ [cData1] NVARCHAR (4000) NULL,
+ [cData2] NVARCHAR (4000) NULL,
+ [cData3] NVARCHAR (4000) NULL,
+ [cData4] NVARCHAR (4000) NULL,
+ [cData5] NVARCHAR (4000) NULL,
+ PRIMARY KEY CLUSTERED ([cIdentity] ASC)
+);
+
+
+GO
+DECLARE @VarDecimalSupported AS BIT;
+
+SELECT @VarDecimalSupported = 0;
+
+IF ((ServerProperty(N'EngineEdition') = 3)
+ AND (((@@microsoftversion / power(2, 24) = 9)
+ AND (@@microsoftversion & 0xffff >= 3024))
+ OR ((@@microsoftversion / power(2, 24) = 10)
+ AND (@@microsoftversion & 0xffff >= 1600))))
+ SELECT @VarDecimalSupported = 1;
+
+IF (@VarDecimalSupported > 0)
+ BEGIN
+ EXECUTE sp_db_vardecimal_storage_format N'$(DatabaseName)', 'ON';
+ END
+
+
+GO
+ALTER DATABASE [$(DatabaseName)]
+ SET MULTI_USER
+ WITH ROLLBACK IMMEDIATE;
+
+
+GO
+PRINT N'업데이트가 완료되었습니다.';
+
+
+GO
diff --git a/Projects/SystemX.Core/DBPatch/sqlScripts/_UpdateAccountDB.bat b/Projects/SystemX.Core/DBPatch/sqlScripts/_UpdateScript.bat
similarity index 100%
rename from Projects/SystemX.Core/DBPatch/sqlScripts/_UpdateAccountDB.bat
rename to Projects/SystemX.Core/DBPatch/sqlScripts/_UpdateScript.bat
diff --git a/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac b/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac
index 109f752..aadc5aa 100644
Binary files a/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac and b/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac differ
diff --git a/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac b/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac
new file mode 100644
index 0000000..46822c4
Binary files /dev/null and b/Projects/SystemX.Core/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac differ
diff --git a/Projects/SystemX.Core/SystemX.Core.sln b/Projects/SystemX.Core/SystemX.Core.sln
index 96344c5..de82dab 100644
--- a/Projects/SystemX.Core/SystemX.Core.sln
+++ b/Projects/SystemX.Core/SystemX.Core.sln
@@ -5,10 +5,14 @@ VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SystemX.Core", "SystemX.Core\SystemX.Core.csproj", "{F057A1E8-F5FF-4241-BEEA-1A57E971F379}"
EndProject
-Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "SystemX.DB.AccountDB", "SystemX.DB.AccountDB\SystemX.DB.AccountDB.sqlproj", "{B44C85FA-BD31-419F-8481-477E166A5753}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemX.Core.DB", "SystemX.Core.DB\SystemX.Core.DB.csproj", "{78647721-F9BD-4876-89D5-95A2A0F3ADA7}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DB", "DB", "{C8D5274F-AC00-46C7-1F8D-E88E81087A52}"
+EndProject
+Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "SystemX.DB.AccountDB", "DB\SystemX.DB.AccountDB\SystemX.DB.AccountDB.sqlproj", "{B44C85FA-BD31-419F-8481-477E166A5753}"
+EndProject
+Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "SystemX.DB.UniqueKeyDB", "DB\SystemX.DB.UniqueKeyDB\SystemX.DB.UniqueKeyDB.sqlproj", "{C67F3F97-1D52-4C75-A04F-16ED41822CCD}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -19,20 +23,30 @@ Global
{F057A1E8-F5FF-4241-BEEA-1A57E971F379}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F057A1E8-F5FF-4241-BEEA-1A57E971F379}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F057A1E8-F5FF-4241-BEEA-1A57E971F379}.Release|Any CPU.Build.0 = Release|Any CPU
+ {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Release|Any CPU.Build.0 = Release|Any CPU
{B44C85FA-BD31-419F-8481-477E166A5753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B44C85FA-BD31-419F-8481-477E166A5753}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B44C85FA-BD31-419F-8481-477E166A5753}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{B44C85FA-BD31-419F-8481-477E166A5753}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B44C85FA-BD31-419F-8481-477E166A5753}.Release|Any CPU.Build.0 = Release|Any CPU
{B44C85FA-BD31-419F-8481-477E166A5753}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {78647721-F9BD-4876-89D5-95A2A0F3ADA7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD}.Release|Any CPU.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {B44C85FA-BD31-419F-8481-477E166A5753} = {C8D5274F-AC00-46C7-1F8D-E88E81087A52}
+ {C67F3F97-1D52-4C75-A04F-16ED41822CCD} = {C8D5274F-AC00-46C7-1F8D-E88E81087A52}
+ EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A26A3BD0-2161-41FA-949A-DEA966E8F798}
EndGlobalSection
diff --git a/Tools/sqlpackage_install.bat b/Tools/sqlpackage_install.bat
new file mode 100644
index 0000000..a4a03e6
--- /dev/null
+++ b/Tools/sqlpackage_install.bat
@@ -0,0 +1,3 @@
+dotnet tool install -g microsoft.sqlpackage
+
+pause
\ No newline at end of file