none
Select que retornar todos os objetos que possuem linked server para determinado servidor RRS feed

  • Pergunta

  • Olá Senhores,

    Estamos participando de uma migração aqui no trabalho de um servidor 2000 para um 2008 porém em nosso ambiente temos muitos servidores que fazem consumem informações deste servidor via linked server. E a migração não será total, sera feita em etapa ( grupos de bases de cada vezes) sendo assim as bases vão migrar para um novo servidor de sql 2008 que obviamente tem um outro nome e o MSSQL2000 ainda continuará ativo com o nome que ele usa. Sendo assim precisamos ter certeza que quais são todas as procs e views dos outros servidores que acessam esse MSSQL2000. Alguém saberia me dizer como posso fazer isso? Alguém teria ai um script bacana para solucionar esse problema e coletar essa informação?

    Desde já agradeço,

    Justo Daniel

    MCTS 2008 Dev e Infra /MCDST/MCT/ITIL


    • Editado Justo_Daniel quinta-feira, 5 de dezembro de 2013 15:23
    quinta-feira, 5 de dezembro de 2013 15:22

Respostas

  • Pessoal,

    Desenvolvi o seguinte script para atender minha necessidade. Como eu precisava disponibilizar a informação ainda para os analistas de sistemas também. Precisei criar uma tabela para depois fazer um insert da informação coletada. Vejam:

    /*
    USE DBATIVIT

    DROP TABLE [dbo].[DBAPINE_LINKEDSERVERS]

    CREATE TABLE [dbo].[DBAPINE_LINKEDSERVERS](
    [NOME_SERVIDOR] [varchar](50) NULL,
    [NOME_DATABASE] [varchar](50) NULL,
    [NOME_OBJETO] [varchar](200) NULL,
    [TIPO] [varchar](5) NULL,
    [NOME_BASE_OBJETO] [varchar](max) NULL,
    [DEFINICAO] [varchar](max) NULL
    ) ON [PRIMARY]

    */

    USE master

    DECLARE @NomeBase VARCHAR(250) 

    DECLARE DataBase_Cursor CURSOR FOR
    SELECT name FROM sys.databases
    WHERE name NOT IN ('master','tempdb','model','msdb','ReportServer','ReportServerTempDB')


    OPEN DataBase_Cursor
    FETCH NEXT FROM DataBase_Cursor
    INTO @NomeBase

    WHILE @@FETCH_STATUS = 0
    BEGIN

    SELECT 
    'USE ' + @NomeBase + ' ' + CHAR(13)+ CHAR(10) + 
    'INSERT INTO DBATIVIT.dbo.DBAPINE_LINKEDSERVERS
               ([NOME_SERVIDOR]
               ,[NOME_DATABASE]
               ,[NOME_OBJETO]
               ,[TIPO]
               ,[NOME_BASE_OBJETO]
               ,[DEFINICAO])
         SELECT 
      @@Servername, ''' + @NomeBase + ''', OBJECT_NAME(m.object_id) as Name, 
      o.type,
      SUBSTRING(replace(m.definition,'']'',''''),CHARINDEX(''PINE_SQL_01'', replace(m.definition,'']'',''''))+12,CHARINDEX(' + CHAR(39)+ ' ' + CHAR(39) + ',SUBSTRING(replace(m.definition,'']'',''''),CHARINDEX(''PINE_SQL_01'', replace(m.definition,'']'',''''))+12,8000))),
               m.definition
    FROM sys.sql_modules m join sys.objects o on m.object_id = o.object_id
    WHERE definition LIKE ''%pine_sql%''' + CHAR(13)+ CHAR(10)+ CHAR(13)+ CHAR(10)

    FETCH NEXT FROM DataBase_Cursor
    INTO @NomeBase

    END 

    CLOSE DataBase_Cursor
    DEALLOCATE DataBase_Cursor

    sexta-feira, 6 de dezembro de 2013 17:26

Todas as Respostas

  • tente isso:

    select * from sys.procedures where OBJECT_DEFINITION(object_id) like '%SERVIDOR%'
    

    Só não me tenho ambiente para testar no SQL2000

    quinta-feira, 5 de dezembro de 2013 16:39
  • Justo,

    Na caso, minha recomendação é que você acesso o Servidor SQL Serve 2000, e obtenha a relação de objetos que você precisa, utilizando as system stored procedures:

    - sp_tables; e

    - sp_stored_procedures.

    System tables:

    - sys.views;

    Para obter relação de User Functions:

    SELECT name AS function_name 
      ,SCHEMA_NAME(schema_id) AS schema_name
      ,type_desc
      ,create_date
      ,modify_date
    FROM sys.objects
    WHERE type_desc LIKE '%FUNCTION%';
    GO


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 6 de dezembro de 2013 13:17
    Moderador
  • Pessoal,

    Desenvolvi o seguinte script para atender minha necessidade. Como eu precisava disponibilizar a informação ainda para os analistas de sistemas também. Precisei criar uma tabela para depois fazer um insert da informação coletada. Vejam:

    /*
    USE DBATIVIT

    DROP TABLE [dbo].[DBAPINE_LINKEDSERVERS]

    CREATE TABLE [dbo].[DBAPINE_LINKEDSERVERS](
    [NOME_SERVIDOR] [varchar](50) NULL,
    [NOME_DATABASE] [varchar](50) NULL,
    [NOME_OBJETO] [varchar](200) NULL,
    [TIPO] [varchar](5) NULL,
    [NOME_BASE_OBJETO] [varchar](max) NULL,
    [DEFINICAO] [varchar](max) NULL
    ) ON [PRIMARY]

    */

    USE master

    DECLARE @NomeBase VARCHAR(250) 

    DECLARE DataBase_Cursor CURSOR FOR
    SELECT name FROM sys.databases
    WHERE name NOT IN ('master','tempdb','model','msdb','ReportServer','ReportServerTempDB')


    OPEN DataBase_Cursor
    FETCH NEXT FROM DataBase_Cursor
    INTO @NomeBase

    WHILE @@FETCH_STATUS = 0
    BEGIN

    SELECT 
    'USE ' + @NomeBase + ' ' + CHAR(13)+ CHAR(10) + 
    'INSERT INTO DBATIVIT.dbo.DBAPINE_LINKEDSERVERS
               ([NOME_SERVIDOR]
               ,[NOME_DATABASE]
               ,[NOME_OBJETO]
               ,[TIPO]
               ,[NOME_BASE_OBJETO]
               ,[DEFINICAO])
         SELECT 
      @@Servername, ''' + @NomeBase + ''', OBJECT_NAME(m.object_id) as Name, 
      o.type,
      SUBSTRING(replace(m.definition,'']'',''''),CHARINDEX(''PINE_SQL_01'', replace(m.definition,'']'',''''))+12,CHARINDEX(' + CHAR(39)+ ' ' + CHAR(39) + ',SUBSTRING(replace(m.definition,'']'',''''),CHARINDEX(''PINE_SQL_01'', replace(m.definition,'']'',''''))+12,8000))),
               m.definition
    FROM sys.sql_modules m join sys.objects o on m.object_id = o.object_id
    WHERE definition LIKE ''%pine_sql%''' + CHAR(13)+ CHAR(10)+ CHAR(13)+ CHAR(10)

    FETCH NEXT FROM DataBase_Cursor
    INTO @NomeBase

    END 

    CLOSE DataBase_Cursor
    DEALLOCATE DataBase_Cursor

    sexta-feira, 6 de dezembro de 2013 17:26