/* VPKI.AccountDB의 배포 스크립트 이 코드는 도구를 사용하여 생성되었습니다. 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 변경 내용이 손실됩니다. */ GO SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; SET NUMERIC_ROUNDABORT OFF; GO /* :setvar DatabaseName "VPKI.AccountDB" :setvar DefaultFilePrefix "VPKI.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 SIMPLE, 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 -- 배포된 트랜잭션 로그를 사용하여 대상 서버를 업데이트하는 리팩터링 단계 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 = '7ca1fbc9-cead-4c01-b8df-1a9a69e13266') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('7ca1fbc9-cead-4c01-b8df-1a9a69e13266') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '7e3c9cab-1b27-43f3-8519-960704ce037b') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('7e3c9cab-1b27-43f3-8519-960704ce037b') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = 'f0511507-0a0d-4bde-a3b2-39b5106c85f0') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('f0511507-0a0d-4bde-a3b2-39b5106c85f0') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = 'da1fde46-473c-41bb-aa02-260e3385475d') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('da1fde46-473c-41bb-aa02-260e3385475d') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '8f767203-3e50-46b7-a513-53461cf358ac') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('8f767203-3e50-46b7-a513-53461cf358ac') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '4b1fa7eb-a0b5-425d-8358-7a8ca6cff7ad') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('4b1fa7eb-a0b5-425d-8358-7a8ca6cff7ad') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '5e298150-8e73-458c-aad7-8bf15975edc0') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('5e298150-8e73-458c-aad7-8bf15975edc0') IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '6b49864f-05d3-40ae-9c55-b7845af2d49e') INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('6b49864f-05d3-40ae-9c55-b7845af2d49e') GO 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', 'SuperUser' ,'oKLQCdunc2kT5aAVfK+POKwd8R3p8OZvs/NATwpg4gM=' ,1 ,GETDATE(), GETDATE()); INSERT INTO tRole(cAuid, cRoleID, cRoleName) VALUES ('SuperUser','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