SQL Server 2008에서 모든 테이블 구조, 트리거, 저장 프로시저 및 뷰 복사하기

다음은 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;

태그: SQLServer StoredProcedures T-SQL

6월 11일 19:56에 게시됨