다음은 SQL Server 2008에서 데이터베이스의 모든 테이블 구조, 트리거, 저장 프로시저 및 뷰를 복제하는 방법을 보여주는 예제입니다. 이 과정에서는 주요 객체들을 초기화하고 필요한 데이터를 전송하는 스크립트가 포함됩니다.
데이터베이스 초기화 스크립트
아래는 데이터베이스를 초기화하고 새로운 비즈니스 기관 코드를 설정하는 저장 프로시저입니다.
CREATE PROCEDURE [dbo].[usp_InitializeBusiness]
@BusinessCode NVARCHAR(10),
@UserID NVARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Query NVARCHAR(MAX);
DECLARE @MaxOrder INT, @OrderID INT;
DECLARE @ProcName NVARCHAR(100);
-- 대체 저장 프로시저 확인
SET @ProcName = dbo.fn_GetReplacementProcedure(OBJECT_NAME(@@PROCID));
IF @ProcName IS NOT NULL AND LEN(@ProcName) > 0
BEGIN
EXEC sp_executesql @ProcName, N'@BusinessCode NVARCHAR(10), @UserID NVARCHAR(10)', @BusinessCode, @UserID;
RETURN;
END;
-- 비즈니스 기관 존재 여부 확인
IF NOT EXISTS (SELECT 1 FROM OrganizationBusiness WHERE BusinessCode = @BusinessCode)
BEGIN
THROW 50001, '지정된 비즈니스 기관 코드가 "비즈니스 기관"에 설정되지 않았습니다!', 1;
RETURN;
END;
-- 사용자 권한 확인
IF NOT EXISTS (SELECT 1 FROM UserOrganization WHERE OrgCode = @BusinessCode AND UserID = @UserID AND Status = 1)
BEGIN
THROW 50002, '사용자의 권한을 "사용자 대응 기관"에서 목표 비즈니스 기관으로 설정하세요!', 1;
RETURN;
END;
-- 기타 필수 조건 검증
CREATE TABLE #TempScripts (
Script NVARCHAR(MAX),
OrderID INT IDENTITY(1,1)
);
-- 기본 SQL 설정 추가
INSERT INTO #TempScripts (Script) VALUES ('SET ANSI_NULLS ON');
INSERT INTO #TempScripts (Script) VALUES ('GO');
INSERT INTO #TempScripts (Script) VALUES ('SET QUOTED_IDENTIFIER OFF');
INSERT INTO #TempScripts (Script) VALUES ('GO');
-- 테이블 정의 생성
INSERT INTO #TempScripts (Script)
EXEC usp_GenerateTableDefinitions;
-- 인덱스 정의 생성
INSERT INTO #TempScripts (Script)
EXEC usp_GenerateIndexDefinitions;
-- 저장 프로시저 및 뷰 생성
INSERT INTO #TempScripts (Script)
EXEC usp_GenerateObjectDefinitions;
-- 최종 출력
SELECT Script FROM #TempScripts ORDER BY OrderID;
DROP TABLE #TempScripts;
END;
테이블 정의 생성 스크립트
다음은 데이터베이스 내 모든 사용자 정의 테이블에 대한 정의를 생성하는 저장 프로시저입니다.
CREATE PROCEDURE [dbo].[usp_GenerateTableDefinitions]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TableName NVARCHAR(128);
DECLARE @ColumnDefinition NVARCHAR(MAX);
CREATE TABLE #TableDefinitions (
Definition NVARCHAR(MAX),
OrderID INT IDENTITY(1,1)
);
DECLARE TableCursor CURSOR FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';
OPEN TableCursor;
FETCH NEXT FROM TableCursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ColumnDefinition = '';
SELECT @ColumnDefinition += '[' + COLUMN_NAME + '] ' + DATA_TYPE +
CASE WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS NVARCHAR) + ')' ELSE '' END +
CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END + ', '
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName;
-- 마지막 쉼표 제거
SET @ColumnDefinition = LEFT(@ColumnDefinition, LEN(@ColumnDefinition) - 1);
INSERT INTO #TableDefinitions (Definition)
VALUES ('CREATE TABLE [' + @TableName + '] (' + @ColumnDefinition + ')');
FETCH NEXT FROM TableCursor INTO @TableName;
END;
CLOSE TableCursor;
DEALLOCATE TableCursor;
SELECT Definition FROM #TableDefinitions ORDER BY OrderID;
DROP TABLE #TableDefinitions;
END;
인덱스 정의 생성 스크립트
다음은 데이터베이스 내 모든 인덱스에 대한 정의를 생성하는 저장 프로시저입니다.
CREATE PROCEDURE [dbo].[usp_GenerateIndexDefinitions]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TableName NVARCHAR(128);
DECLARE @IndexName NVARCHAR(128);
DECLARE @Columns NVARCHAR(MAX);
CREATE TABLE #IndexDefinitions (
Definition NVARCHAR(MAX),
OrderID INT IDENTITY(1,1)
);
DECLARE IndexCursor CURSOR FOR
SELECT TABLE_NAME, INDEX_NAME FROM sys.indexes WHERE type_desc = 'NONCLUSTERED';
OPEN IndexCursor;
FETCH NEXT FROM IndexCursor INTO @TableName, @IndexName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Columns = '';
SELECT @Columns += '[' + COL_NAME(object_id, column_id) + '], '
FROM sys.index_columns WHERE object_id = OBJECT_ID(@TableName) AND index_id = (
SELECT index_id FROM sys.indexes WHERE name = @IndexName
);
-- 마지막 쉼표 제거
SET @Columns = LEFT(@Columns, LEN(@Columns) - 1);
INSERT INTO #IndexDefinitions (Definition)
VALUES ('CREATE NONCLUSTERED INDEX [' + @IndexName + '] ON [' + @TableName + '] (' + @Columns + ')');
FETCH NEXT FROM IndexCursor INTO @TableName, @IndexName;
END;
CLOSE IndexCursor;
DEALLOCATE IndexCursor;
SELECT Definition FROM #IndexDefinitions ORDER BY OrderID;
DROP TABLE #IndexDefinitions;
END;
객체 정의 생성 스크립트
다음은 데이터베이스 내 모든 저장 프로시저 및 뷰에 대한 정의를 생성하는 저장 프로시저입니다.
CREATE PROCEDURE [dbo].[usp_GenerateObjectDefinitions]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ObjectName NVARCHAR(128);
DECLARE @ObjectType CHAR(2);
DECLARE @Definition NVARCHAR(MAX);
CREATE TABLE #ObjectDefinitions (
Definition NVARCHAR(MAX),
OrderID INT IDENTITY(1,1)
);
DECLARE ObjectCursor CURSOR FOR
SELECT SPECIFIC_NAME, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE IN ('PROCEDURE', 'FUNCTION');
OPEN ObjectCursor;
FETCH NEXT FROM ObjectCursor INTO @ObjectName, @ObjectType;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Definition = '';
SELECT @Definition = definition FROM sys.sql_modules WHERE object_id = OBJECT_ID(@ObjectName);
INSERT INTO #ObjectDefinitions (Definition)
VALUES ('IF EXISTS (SELECT * FROM sys.objects WHERE name = ''' + @ObjectName + ''') DROP ' + @ObjectType + ' [' + @ObjectName + ']; GO ' + @Definition + ' GO');
FETCH NEXT FROM ObjectCursor INTO @ObjectName, @ObjectType;
END;
CLOSE ObjectCursor;
DEALLOCATE ObjectCursor;
SELECT Definition FROM #ObjectDefinitions ORDER BY OrderID;
DROP TABLE #ObjectDefinitions;
END;