diff --git a/Projects/HubX/DBPatch/CreateHubXDB.bat b/Projects/HubX/DBPatch/CreateHubXDB.bat new file mode 100644 index 0000000..9b868a0 --- /dev/null +++ b/Projects/HubX/DBPatch/CreateHubXDB.bat @@ -0,0 +1,17 @@ +@echo off +::log +IF NOT EXIST .\logs mkdir logs + +::서버연결정보 +SET ServerIP=127.0.0.1 +SET ServerPort=1433 + +::DB 정보 +SET UserID=VPKI +SET Passwd=Kefico!@34 +SET DBName=HubX + +::Default DB +@echo off +CALL _CreateDB.bat %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%_001 +CALL _CreateDB.bat %ServerIP% %ServerPort% %UserID% %Passwd% %DBName%_DEV \ No newline at end of file diff --git a/Projects/HubX/DBPatch/UpdateHubXDB.bat b/Projects/HubX/DBPatch/UpdateHubXDB.bat new file mode 100644 index 0000000..c69bd85 --- /dev/null +++ b/Projects/HubX/DBPatch/UpdateHubXDB.bat @@ -0,0 +1,25 @@ +@echo off +::log +IF NOT EXIST .\logs mkdir logs + +::서버연결정보 +SET ServerIP=127.0.0.1 +SET ServerPort=1433 + +::DB 정보 +SET UserID=VPKI +SET Passwd=Kefico!@34 +SET DBName=HUBX_001_DEV + +::Update script 정보 +SET Dacpac=.\sqlScripts\dacpac\HubX.DB.dacpac +SET OUTPUT=HubX.DB_Update.sql + + +@echo off +::generate update script +CALL _UpdateScriptGenerate.bat %ServerIP% %ServerPort% %UserID% %Passwd% %DBName% %Dacpac% %OUTPUT% + +::Default DB +CALL _UpdateDB.bat %ServerIP% %ServerPort% %UserID% %Passwd% HubX_001 +CALL _UpdateDB.bat %ServerIP% %ServerPort% %UserID% %Passwd% HubX_001_DEV \ No newline at end of file diff --git a/Projects/HubX/DBPatch/_CreateDB.bat b/Projects/HubX/DBPatch/_CreateDB.bat new file mode 100644 index 0000000..cbe215a --- /dev/null +++ b/Projects/HubX/DBPatch/_CreateDB.bat @@ -0,0 +1,18 @@ +@echo off + +SET ServerIP=%1 +SET ServerPort=%2 +SET UserID=%3 +SET Passwd=%4 +SET DBName=%5 + +SET SqlCmdOption=-C -U %UserID% -P %Passwd% -S %ServerIP%,%ServerPort% -f 65001 -o .\logs\%DBName%.log +SET DatabaseName=%DBName% +sqlcmd %SqlCmdOption% -i .\sqlScripts\HubX.DB_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/Projects/HubX/DBPatch/_UpdateDB.bat b/Projects/HubX/DBPatch/_UpdateDB.bat new file mode 100644 index 0000000..bb2647a --- /dev/null +++ b/Projects/HubX/DBPatch/_UpdateDB.bat @@ -0,0 +1,19 @@ +@echo off + +SET ServerIP=%1 +SET ServerPort=%2 +SET UserID=%3 +SET Passwd=%4 +SET DBName=%5 + +SET SqlCmdOption=-U %UserID% -P %Passwd% -S %ServerIP%,%ServerPort% -d %DBName% -o .\logs\%DBName%.log +SET DatabaseName=%DBName% +sqlcmd %SqlCmdOption% -i .\sqlScripts\HubX.DB_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/Projects/HubX/DBPatch/_UpdateScriptGenerate.bat b/Projects/HubX/DBPatch/_UpdateScriptGenerate.bat new file mode 100644 index 0000000..0d95840 --- /dev/null +++ b/Projects/HubX/DBPatch/_UpdateScriptGenerate.bat @@ -0,0 +1,12 @@ +@echo off + +SET ServerIP=%1 +SET ServerPort=%2 +SET UserID=%3 +SET Passwd=%4 +SET DBName=%5 +SET Dacpac=%6 +SET OUTPUT=%7 + +::create update sql file +sqlpackage /Action:Script /SourceFile:%Dacpac% /TargetConnectionString:"server=%ServerIP%,%ServerPort%; user id=%UserID%; password=%Passwd%; database=%DBName%; TrustServerCertificate=true" /OutputPath:".\sqlScripts\%OUTPUT%" /p:CommentOutSetVarDeclarations=True \ No newline at end of file diff --git a/Projects/HubX/DBPatch/sqlScripts/HubX.DB_Create.sql b/Projects/HubX/DBPatch/sqlScripts/HubX.DB_Create.sql new file mode 100644 index 0000000..07c385a --- /dev/null +++ b/Projects/HubX/DBPatch/sqlScripts/HubX.DB_Create.sql @@ -0,0 +1,305 @@ +/* +HubX.DB의 배포 스크립트 + +이 코드는 도구를 사용하여 생성되었습니다. +파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +변경 내용이 손실됩니다. +*/ + +GO +SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; + +SET NUMERIC_ROUNDABORT OFF; + + +GO +/* +:setvar DatabaseName "HubX.DB" +:setvar DefaultFilePrefix "HubX.DB" +: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].[tStorage]을(를) 만드는 중...'; + + +GO +CREATE TABLE [dbo].[tStorage] ( + [cHuid] BIGINT IDENTITY (1, 1) NOT NULL, + [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 ([cHuid] ASC) +); + + +GO +-- 배포된 트랜잭션 로그를 사용하여 대상 서버를 업데이트하는 리팩터링 단계 + +IF OBJECT_ID(N'dbo.__RefactorLog') IS NULL +BEGIN + CREATE TABLE [dbo].[__RefactorLog] (OperationKey UNIQUEIDENTIFIER NOT NULL PRIMARY KEY) + EXEC sp_addextendedproperty N'microsoft_database_tools_support', N'refactoring log', N'schema', N'dbo', N'table', N'__RefactorLog' +END +GO +IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '938971a7-29c7-4cec-9307-c9f403986551') +INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('938971a7-29c7-4cec-9307-c9f403986551') + +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/Projects/HubX/DBPatch/sqlScripts/HubX.DB_Update.sql b/Projects/HubX/DBPatch/sqlScripts/HubX.DB_Update.sql new file mode 100644 index 0000000..f3c781f --- /dev/null +++ b/Projects/HubX/DBPatch/sqlScripts/HubX.DB_Update.sql @@ -0,0 +1,58 @@ +/* +HUBX_001_DEV의 배포 스크립트 + +이 코드는 도구를 사용하여 생성되었습니다. +파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +변경 내용이 손실됩니다. +*/ + +GO +SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; + +SET NUMERIC_ROUNDABORT OFF; + + +GO +/* +:setvar DatabaseName "HUBX_001_DEV" +:setvar DefaultFilePrefix "HUBX_001_DEV" +:setvar DefaultDataPath "D:\MSSQL\DATA\" +:setvar DefaultLogPath "D:\MSSQL\DATA\" +*/ + +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 [$(DatabaseName)]; + + +GO +PRINT N'테이블 [dbo].[tStorage]을(를) 변경하는 중...'; + + +GO +ALTER TABLE [dbo].[tStorage] + ADD [cData4] NVARCHAR (4000) NULL, + [cData5] NVARCHAR (4000) NULL; + + +GO +PRINT N'업데이트가 완료되었습니다.'; + + +GO diff --git a/Projects/HubX/DBPatch/sqlScripts/dacpac/HubX.DB.dacpac b/Projects/HubX/DBPatch/sqlScripts/dacpac/HubX.DB.dacpac new file mode 100644 index 0000000..d02f50c Binary files /dev/null and b/Projects/HubX/DBPatch/sqlScripts/dacpac/HubX.DB.dacpac differ diff --git a/Projects/HubX/HubX.DB/HubX.DB.refactorlog b/Projects/HubX/HubX.DB/HubX.DB.refactorlog new file mode 100644 index 0000000..4ce84bb --- /dev/null +++ b/Projects/HubX/HubX.DB/HubX.DB.refactorlog @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Projects/HubX/HubX.DB/HubX.DB.sqlproj b/Projects/HubX/HubX.DB/HubX.DB.sqlproj index f5adbbb..8604569 100644 --- a/Projects/HubX/HubX.DB/HubX.DB.sqlproj +++ b/Projects/HubX/HubX.DB/HubX.DB.sqlproj @@ -13,7 +13,7 @@ HubX.DB HubX.DB - 1033, CI + 1042,CI BySchemaAndSchemaType True v4.7.2 @@ -22,6 +22,8 @@ False True True + True + Korean_Wansung_CI_AS bin\Release\ @@ -37,7 +39,7 @@ bin\Debug\ $(MSBuildProjectName).sql - false + true true full false @@ -56,5 +58,21 @@ + + + + + + + + + + + + + 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/HubX/HubX.DB/dbo/Tables/tStorage.sql b/Projects/HubX/HubX.DB/dbo/Tables/tStorage.sql new file mode 100644 index 0000000..a77f058 --- /dev/null +++ b/Projects/HubX/HubX.DB/dbo/Tables/tStorage.sql @@ -0,0 +1,11 @@ +CREATE TABLE [dbo].[tStorage] +( + [cHuid] BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1), + [cIdentity] NVARCHAR(200) NOT NULL, + [cDateTime] DATETIME2 NOT NULL, + [cData1] NVARCHAR(4000), + [cData2] NVARCHAR(4000), + [cData3] NVARCHAR(4000), + [cData4] NVARCHAR(4000), + [cData5] NVARCHAR(4000), +) diff --git a/Projects/HubX/HubX.sln b/Projects/HubX/HubX.sln index 14c6075..fc23744 100644 --- a/Projects/HubX/HubX.sln +++ b/Projects/HubX/HubX.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.9.34728.123 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HubX.Server", "HubX.Server\HubX.Server.csproj", "{AFAF8DB4-790C-4482-9B31-3DFFE4FF3DB7}" EndProject +Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "HubX.DB", "HubX.DB\HubX.DB.sqlproj", "{514DDCCF-6B50-49F8-B212-70498396CF19}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,12 @@ Global {AFAF8DB4-790C-4482-9B31-3DFFE4FF3DB7}.Debug|Any CPU.Build.0 = Debug|Any CPU {AFAF8DB4-790C-4482-9B31-3DFFE4FF3DB7}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFAF8DB4-790C-4482-9B31-3DFFE4FF3DB7}.Release|Any CPU.Build.0 = Release|Any CPU + {514DDCCF-6B50-49F8-B212-70498396CF19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {514DDCCF-6B50-49F8-B212-70498396CF19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {514DDCCF-6B50-49F8-B212-70498396CF19}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {514DDCCF-6B50-49F8-B212-70498396CF19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {514DDCCF-6B50-49F8-B212-70498396CF19}.Release|Any CPU.Build.0 = Release|Any CPU + {514DDCCF-6B50-49F8-B212-70498396CF19}.Release|Any CPU.Deploy.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE