ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MSSQL] 연결된서버(LinkedServer) 스크립트 추출
    SQL Server/스크립트 2023. 9. 18. 14:08

    SQL Server에서 GUI를 바탕으로 연결된서버 Export스크립트화가 가능하지만

    스크립트로 Export하는 쿼리를 작성해보았다.

    (패스워드는 복호화 불가능함)

     

    테스트는 SQL Server 2012, 2019에서 실행

    SQL Server 2008 R2이상 버전에서 사용 가능

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    USE master
    GO
     
    DECLARE @server_id                INT
    DECLARE @name                    NVARCHAR(20)
    DECLARE @product                NVARCHAR(20)
    DECLARE @provider                NVARCHAR(20)
    DECLARE @provider_string        NVARCHAR(100)
    DECLARE @data_source            NVARCHAR(20)
    DECLARE @catalog                NVARCHAR(50)
    DECLARE @clocallogin            NVARCHAR(20)
    DECLARE @rmtuser                NVARCHAR(100)
    DECLARE @useself                NVARCHAR(100)
    DECLARE @locallogin                NVARCHAR(100)
    DECLARE @collation_compatible    NVARCHAR(100)
    DECLARE @data_access            NVARCHAR(100)
    DECLARE @dist                    NVARCHAR(100)
    DECLARE @pub                    NVARCHAR(100)
    DECLARE @rpc                    NVARCHAR(100)
    DECLARE @rpc_out                NVARCHAR(100)
    DECLARE @sub                    NVARCHAR(100)
    DECLARE @connect_timeout        NVARCHAR(100)
    DECLARE @collation_name            NVARCHAR(100)
    DECLARE @lazy_schema_validation    NVARCHAR(100)
    DECLARE @query_timeout            NVARCHAR(100)
    DECLARE @use_remote_collation    NVARCHAR(100)
    DECLARE @remote_proc_transaction_promotion    NVARCHAR(100)
     
    DECLARE Type_cursor SCROLL CURSOR FOR
    SELECT a.[server_id],
        a.name,
        a.product,
        a.[provider],
        CASE WHEN a.provider_string IS NULL THEN 'NULL' ELSE a.provider_string END as provider_string,
        a.[data_source],
        CAST (CASE WHEN a.catalog IS NULL THEN '' ELSE '' + a.catalog + '' END as nvarchar) as catalog,
        CAST (CASE WHEN a.is_collation_compatible = 0 THEN 'false' ELSE 'true' END as nvarchar) as [collation compatible],
        CAST (CASE WHEN a.is_data_access_enabled = 0 THEN 'false' ELSE 'true' END as nvarchar) as [data access],
        CAST (CASE WHEN a.is_distributor = 0 THEN 'false' ELSE 'true' END as nvarchar) as [dist],
        CAST (CASE WHEN a.is_publisher = 0 THEN 'false' ELSE 'true' END as nvarchar) as [pub],
        CAST (CASE WHEN a.is_remote_login_enabled = 0 THEN 'false' ELSE 'true' END as nvarchar) as [rpc],
        CAST (CASE WHEN a.is_rpc_out_enabled = 0 THEN 'false' ELSE 'true' END as nvarchar) as [rpc out],
        CAST (CASE WHEN a.is_subscriber = 0 THEN 'false' ELSE 'true' END as nvarchar) as [sub],
        CAST (CASE WHEN a.connect_timeout = 0 THEN '0' ELSE a.connect_timeout END as nvarchar) as [connect timeout],
        CASE WHEN a.collation_name IS NULL THEN 'null' ELSE '' END as [collation name],
        CAST (CASE WHEN a.lazy_schema_validation = 0 THEN 'false' ELSE 'true' END as nvarchar) as [lazy schema validation],
        CAST (CASE WHEN a.query_timeout = 0 THEN '0' ELSE a.query_timeout END as nvarchar) as [query timeout],
        CAST (CASE WHEN a.uses_remote_collation = 0 THEN 'false' ELSE 'true' END as nvarchar) as [use remote collation],
        CAST (CASE WHEN a.is_remote_proc_transaction_promotion_enabled = 0 THEN 'false' ELSE 'true' END as nvarchar) as [remote proc transaction promotion]
    FROM sys.servers a
    WHERE a.server_id > 0
    /*조건에 연결된 서버명을 입력하면 해당서버만 추출*/
    --AND a.name IN ('')
    ORDER BY a.name ASC
    FOR READ ONLY
     
    OPEN Type_cursor
    FETCH FIRST FROM Type_cursor
            INTO @server_id, @name, @product, @provider, @provider_string, @data_source, @catalog, 
                @collation_compatible, @data_access, @dist, @pub, @rpc, @rpc_out, @sub, @connect_timeout,
                @collation_name, @lazy_schema_validation, @query_timeout,
                @use_remote_collation, @remote_proc_transaction_promotion
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
     
            PRINT '/***** Linked Server ' + @name + ' Script Export *****/'
            PRINT 'USE [master]
    GO' + CHAR(10)
            
            PRINT 'IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N''' + @name + ''')'
            PRINT 'EXEC master.dbo.sp_dropserver @server =N'''+ @name + ''', @droplogins=''droplogins''
    GO' + CHAR(10)
        IF (@provider_string = 'NULL')
        BEGIN
            IF (@product = 'SQL Server')
            BEGIN
                PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N''' + @name + ''', @srvproduct=N''' + @product + '''' + CHAR(10)
            END
            ELSE IF (@product = '')
            BEGIN
                IF(@catalog= '')
                BEGIN
                    PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N''' + @name + ''', @srvproduct=N''' + @product + ''', @provider=N'''+ @provider +''', @datasrc=N''' + @data_source +'''' + CHAR(10)
                END
                ELSE
                BEGIN
                    PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N''' + @name + ''', @srvproduct=N''' + @product + ''', @provider=N'''+ @provider +''', @datasrc=N''' + @data_source +''', @catalog=N''' + @catalog+'''' + CHAR(10)
                END
            END
            ELSE
            BEGIN
                IF(@catalog = '')
                BEGIN
                    PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N'''+ @name + ''', @srvproduct=N''' + @product + ''', @provider=N'''+ @provider +''', @datasrc=N''' + @data_source +'''' + CHAR(10)
                END
                ELSE
                BEGIN
                    PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N'''+ @name + ''', @srvproduct=N''' + @product + ''', @provider=N'''+ @provider +''', @datasrc=N''' + @data_source +''' + @catalog=N''' + @catalog+'''' + CHAR(10)
                END
            END
        END
        ELSE IF (@provider_string IS NOT NULL)
        BEGIN
            IF (@catalog= '')
            BEGIN
                PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N''' + @name + ''', @srvproduct=N''' + @product + ''', @provider=N'''+ @provider +''', @provstr=N''' + @provider_string +'''' + CHAR(10)
            END
            ELSE IF (@catalog IS NOT NULL)
            BEGIN
                PRINT 'EXEC master.dbo.sp_addlinkedserver @server = N''' + @name + ''', @srvproduct=N''' + @product + ''', @provider=N'''+ @provider +''', @provstr=N''' + @provider_string +''', @catalog=N''' + @catalog +'''' + CHAR(10)
            END
        END
     
        DECLARE Type_cursor2 SCROLL CURSOR FOR
        SELECT a.[server_id],
            a.name,
            a.product,
            a.[provider],
            CASE WHEN a.provider_string IS NULL THEN 'NULL' ELSE a.provider_string END as provider_string,
            a.[data_source],
            CAST (CASE WHEN a.catalog IS NULL THEN '' ELSE '' + a.catalog + '' END as nvarchar) as catalog,
            c.name, --as clocallogin,
            CAST (CASE WHEN b.remote_name IS NULL THEN 'NULL' ELSE 'N''' + b.remote_name + '''' END as nvarchar) as rmtuser,
            CAST (CASE WHEN b.uses_self_credential = 0 THEN 'False' ELSE 'True' END as nvarchar) as useself,
            CAST (CASE WHEN b.local_principal_id = 0 THEN 'NULL' ELSE 'N''' + c.name + '''' END as nvarchar) as locallogin
        FROM sys.servers a
        LEFT OUTER JOIN sys.linked_logins b ON b.server_id = a.server_id
        LEFT OUTER JOIN sys.server_principals c ON c.principal_id = b.local_principal_id
        WHERE a.server_id <> 0 AND a.name = @name
        ORDER BY c.name ASC
        FOR READ ONLY
     
        OPEN Type_cursor2
        FETCH NEXT FROM Type_cursor2
                INTO @server_id, @name, @product, @provider, @provider_string, @data_source, @catalog,
                    @clocallogin, @rmtuser, @useself, @locallogin
        WHILE (@@FETCH_STATUS = 0)
            BEGIN
                IF (@useself = 'True') OR (@useself = 'False' AND @locallogin = 'NULL' AND @rmtuser = 'NULL')
                    BEGIN
                    PRINT 'EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N''' + @name + ''', @useself=N''' + @useself + ''', @locallogin='+@locallogin+', @rmtuser=' + @rmtuser+', @rmtpassword=NULL'
                    END
                ELSE
                    BEGIN
                    PRINT 'EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N''' + @name + ''', @useself=N''' + @useself + ''', @locallogin='+@locallogin+', @rmtuser=' + @rmtuser+', @rmtpassword=''########'''
                    END
     
            FETCH NEXT FROM Type_cursor2
                    INTO @server_id, @name, @product, @provider, @provider_string, @data_source, @catalog,
                        @clocallogin, @rmtuser, @useself, @locallogin
            END
        CLOSE Type_cursor2
        DEALLOCATE Type_cursor2
     
        PRINT 'GO' + CHAR(10)
     
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''collation compatible'', @optvalue=N''' + @collation_compatible +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''data access'', @optvalue=N''' + @data_access +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''dist'', @optvalue=N''' + @dist +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''pub'', @optvalue=N''' + @pub +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''rpc'', @optvalue=N''' + @rpc +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''rpc out'', @optvalue=N''' + @rpc_out +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''sub'', @optvalue=N''' + @sub +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''connect timeout'', @optvalue=N''' + @connect_timeout +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''collation name'', @optvalue=' + @collation_name +'
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''lazy schema validation'', @optvalue=N''' + @lazy_schema_validation +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''query timeout'', @optvalue=N''' + @query_timeout +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''use remote collation'', @optvalue=N''' + @use_remote_collation +'''
    GO' + CHAR(10)
        PRINT 'EXEC master.dbo.sp_serveroption @server=N''' + @name + ''', @optname=N''remote proc transaction promotion'', @optvalue=N''' + @remote_proc_transaction_promotion +'''
    GO' + CHAR(10)
     
    FETCH NEXT FROM Type_cursor
            INTO @server_id, @name, @product, @provider, @provider_string, @data_source, @catalog, 
                    @collation_compatible, @data_access, @dist, @pub, @rpc, @rpc_out, @sub, @connect_timeout,
                    @collation_name, @lazy_schema_validation, @query_timeout,
                    @use_remote_collation, @remote_proc_transaction_promotion
    END
    CLOSE Type_cursor
    DEALLOCATE Type_cursor
    cs

    <출처 : 본인 작성>

     

    이상

Designed by Tistory.