ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MSSQL] 트리거(Trigger) 스크립트 추출
    SQL Server/스크립트 2022. 4. 9. 15:24

    SQL Server에서 [스크립트생성]을 통해 테이블, StoredProcedure등 스크립트 추출이 가능하다.

    하지만 트리거는 단독으로 스크립트 추출이 불가능하다.(구글링한바로는 없는듯)

    스크립트생성으로 테이블 추출할 때 옵션으로 트리거를 같이 추출할 수는 있지만

    트리거를 꽤 많이 보유하고 있는 데이터베이스라면 트리거를 하나하나 스크립트로 빼는게 사실상 힘들기에.

     

    이하, 배치파일을 콜함으로써 트리거만 추출 할 수 있다.

    ※배치파일명:GetTriggerScriptforSQLServer.bat으로 저장한 후,

    cmd에서 변수를 넣어서 콜.

      예) >call GetTriggerScriptforSQLServer.bat 서버이름 DB이름 유저 비밀번호

             call GetTriggerScriptforSQLServer.bat HOSTSER Database sa password

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    @echo off 
    setlocal enabledelayedexpansion 
    if "%1" == "" goto end 
    set SRV=%1
    if "%2" == "" goto end
    set DBNAME=%2
    if "%3" == "" goto end
    set USR=%3
    if "%4" == "" goto end
    set PWD=%4
    set TARGET=%5
     
    if "%5" == "" (
    sqlcmd -S %SRV% -d %DBNAME% -U %USR% -P %PWD% --1 -"SET NOCOUNT ON SELECT name FROM sys.objects WHERE type = 'TR';" > GetList.txt
    ) else (
    echo %TARGET% > GetList.txt
    )
     
    SET SNAME=""
     
    for /f %%a in (GetList.txt) do ( 
     
    for /"usebackq" %%b in ('sqlcmd -S %SRV% -d %DBNAME% -U %USR% -P %PWD% -h -1 -Q"SET NOCOUNT ON SELECT s.name FROM sys.objects o INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.type = 'TR' AND o.name = '%%a';"') do @set SNAME=%%b
     
    echo USE [%DBNAME%]> !SNAME!.%%a.Trigger.sql
    echo GO>> !SNAME!.%%a.Trigger.sql
    echo SET ANSI_NULLS ON>> !SNAME!.%%a.Trigger.sql
    echo GO>> !SNAME!.%%a.Trigger.sql
    echo SET QUOTED_IDENTIFIER ON>> !SNAME!.%%a.Trigger.sql
    echo GO>> !SNAME!.%%a.Trigger.sql
    echo DROP TRIGGER !SNAME!.%%a>> !SNAME!.%%a.Trigger.sql
    echo GO>> !SNAME!.%%a.Trigger.sql
    sqlcmd -S %SRV% -d %DBNAME% -U %USR% -P %PWD% -0 --1 -"SET NOCOUNT ON SELECT m.definition FROM sys.objects o INNER JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.name = '%%a';" >> !SNAME!.%%a.Trigger.sql
    echo GO>> !SNAME!.%%a.Trigger.sql
    )
     
    :end
     
    cs

    5번째 변수는 특정 트리거만 스크립트로 추출하고 싶을 때 트리거명을 변수로 지정해서 콜하면 된다.

     

    /이상

Designed by Tistory.