AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 24977
Accepted
datagod
datagod
Asked: 2012-09-27 10:20:01 +0800 CST2012-09-27 10:20:01 +0800 CST 2012-09-27 10:20:01 +0800 CST

Existe uma maneira de examinar trabalhos SQL em busca de referências a servidores vinculados?

  • 772

Em preparação para migrar um farm de servidores para a nuvem, estou tentando enumerar todos os servidores vinculados que foram definidos ao longo dos anos. Também preciso encontrar (e corrigir) o código que faz referência a esses servidores vinculados.

Aqui está algo que juntei para ajudar a identificar nomes de objetos que se referem ao servidor vinculado, mas isso só funciona em procs armazenados, visualizações, funções e gatilhos:

declare @sql varchar(2000)
select  @SQL = 'use ?;
print ''?'';
print replicate(''-'',len(''?''));
print '' ''; 

select object_name(sc.id)
  from syscomments sc
  where text like ''%TheLinkedServer%''
'

exec sp_msforeachdb @sql

Eu sei que terei que abrir os pacotes DTS/SSIS... Estou apenas tentando terminar o máximo possível o mais rápido possível.

sql-server sql-server-2000
  • 2 2 respostas
  • 2665 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-09-27T10:40:03+08:002012-09-27T10:40:03+08:00

    Para consultar jobs, você só precisa procurar nas msdbtabelas de jobs de:

    SELECT j.name
      FROM msdb.dbo.sysjobs AS j
      INNER JOIN msdb.dbo.sysjobsteps AS s
      ON j.job_id = s.job_id
      WHERE s.command LIKE '%TheLinkedServer%';
    

    Além disso, syscomments é uma visão de compatibilidade com versões anteriores - não é a melhor maneira de procurar referências em objetos, principalmente porque qualquer objeto > 4000 caracteres será armazenado em várias linhas e poderia , potencialmente, ter o nome do servidor vinculado em duas linhas. Muito mais seguro seria:

    SELECT o.name FROM sys.objects AS o
      INNER JOIN sys.sql_modules AS m
      ON o.[object_id] = m.[object_id]
      WHERE m.definition LIKE '%TheLinkedServer%';
    

    E, finalmente, sp_msforeachdb não é confiável (veja aqui e aqui para uma substituição melhor).

    Aqui está um procedimento de pesquisa útil que escrevi no ano passado que pode ser útil:

    CREATE PROCEDURE dbo.FindString
       @search_string            NVARCHAR(4000),     
       @database_list            NVARCHAR(MAX) = NULL,
       @case_sensitive           BIT = 0,
       @include_jobs             BIT = 0,
       @include_columns          BIT = 0,
       @include_parameters       BIT = 0,
       @include_system_objects   BIT = 0,
       @include_system_databases BIT = 0
    AS
    BEGIN
       SET NOCOUNT ON;
    
       DECLARE
           @init_sql  NVARCHAR(MAX),
           @run_sql   NVARCHAR(MAX),
           @dbname    NVARCHAR(128),
           @all_text  NVARCHAR(10),
           @coll_text NVARCHAR(50);
    
       CREATE TABLE #t
       (
           [database]      SYSNAME,
           [schema]        SYSNAME,
           [object]        SYSNAME,
           [type]          SYSNAME,
           [create_date]   DATETIME,
           [modify_date]   DATETIME,
           [definition]    NVARCHAR(MAX)
       );
    
       CREATE TABLE #j
       (
           [job_name]      SYSNAME,
           [step_id]       INT,
           [step_name]     SYSNAME,
           [create_date]   DATETIME,
           [modify_date]   DATETIME,
           [definition]    NVARCHAR(MAX)
       );
    
       CREATE TABLE #cp
       (
           [database]      SYSNAME,
           [schema]        SYSNAME,
           [object]        SYSNAME,
           [type]          SYSNAME,
           [create_date]   DATETIME,
           [modify_date]   DATETIME,
           [param]         NVARCHAR(128),
           [column]        NVARCHAR(128)
       );
    
       SELECT
           @all_text = CASE @include_system_objects 
               WHEN 1 THEN N'all_' ELSE N'' END,
           @coll_text = CASE @case_sensitive
           WHEN 1 THEN N'COLLATE Latin1_General_BIN' ELSE N'' END;
    
       SET @init_sql = N'SELECT 
               [database] = ''$db$'',
               [schema]   = QUOTENAME(s.name),
               [object]   = QUOTENAME(o.name),
               [type]     = o.type_desc,
               o.create_date,
               o.modify_date,
               m.[definition]
           FROM 
               $db$.sys.$all$sql_modules AS m
           INNER JOIN 
               $db$.sys.$all$objects AS o
               ON m.[object_id] = o.[object_id]
           INNER JOIN 
               $db$.sys.schemas AS s
               ON o.[schema_id] = s.[schema_id]
           WHERE 
               m.definition $coll$ 
                LIKE N''%'' + @search_string + ''%'' $coll$;';
    
       SET @init_sql = REPLACE(REPLACE(@init_sql, 
           '$all$', @all_text), '$coll$', @coll_text);
    
       SET @search_string = REPLACE(@search_string, '''', '''''');
    
       DECLARE c CURSOR
           LOCAL STATIC FORWARD_ONLY READ_ONLY
           FOR 
               SELECT QUOTENAME(d.name)
                   FROM 
                       sys.databases AS d
                   LEFT OUTER JOIN 
                       dbo.SplitStrings_XML(@database_list, N',') AS s
                       ON 1 = 1
                   WHERE 
                       (
                         LOWER(d.name) = LOWER(s.Item)
                         OR NULLIF(RTRIM(@database_list), N'') IS NULL
                       )
                       AND d.database_id BETWEEN CASE @include_system_databases 
                       WHEN 1 THEN 1 ELSE 5 END AND 32766
                   ORDER BY d.name;
       OPEN c;
    
       FETCH NEXT FROM c INTO @dbname;
    
       WHILE @@FETCH_STATUS = 0
       BEGIN
           SET @run_sql = REPLACE(@init_sql, N'$db$', @dbname);
    
           INSERT #t 
           EXEC sp_executesql 
               @run_sql, 
               N'@search_string NVARCHAR(4000)', 
               @search_string;
    
           IF @include_columns = 1
           BEGIN
               SET @run_sql = N'SELECT 
                    [database] = ''$db$'',
                    [schema]   = QUOTENAME(s.name),
                    [object]   = QUOTENAME(o.name),
                    [type]     = o.type_desc,
                    o.create_date,
                    o.modify_date,
                    NULL,
                    c.name
                FROM 
                    $db$.sys.$all$columns AS c
                INNER JOIN 
                    $db$.sys.$all$objects AS o
                    ON c.[object_id] = o.[object_id]
                INNER JOIN
                    $db$.sys.schemas AS s
                    ON o.[schema_id] = s.[schema_id]
                WHERE
                    c.name $coll$ 
                      LIKE N''%'' + @search_string + ''%'' $coll$;';
    
               SET @run_sql = REPLACE(REPLACE(REPLACE(@run_sql, 
                   '$all$', @all_text), '$coll$', @coll_text), '$db$', @dbname);
    
               INSERT #cp
               EXEC sp_executesql
                   @run_sql, 
                   N'@search_string NVARCHAR(4000)',
                   @search_string;
           END
    
           IF @include_parameters = 1
           BEGIN
               SET @run_sql = N'SELECT 
                    [database] = ''$db$'',
                    [schema]   = QUOTENAME(s.name),
                    [object]   = QUOTENAME(o.name),
                    [type]     = o.type_desc,
                    o.create_date,
                    o.modify_date,
                    p.name,
                    NULL
                FROM 
                    $db$.sys.$all$parameters AS p
                INNER JOIN 
                    $db$.sys.$all$objects AS o
                    ON p.[object_id] = o.[object_id]
                INNER JOIN
                    $db$.sys.schemas AS s
                    ON o.[schema_id] = s.[schema_id]
                WHERE
                    p.name $coll$ 
                      LIKE N''%'' + @search_string + ''%'' $coll$;';
    
               SET @run_sql = REPLACE(REPLACE(REPLACE(@run_sql, 
                   '$all$', @all_text), '$coll$', @coll_text), '$db$', @dbname);
    
               INSERT #cp
               EXEC sp_executesql
                   @run_sql, 
                   N'@search_string NVARCHAR(4000)',
                   @search_string;
           END
    
           FETCH NEXT FROM c INTO @dbname;
       END
    
       CLOSE c;
       DEALLOCATE c;
    
       SELECT 'Objects:';
    
       SELECT 
           [database],
           [schema],
           [object],
           [type],
           [definition] = CONVERT(XML, '<?query --
               USE ' + [database] + ';' 
               + CHAR(13) + CHAR(10) + 'GO' 
               + CHAR(13) + CHAR(10) + [definition] + ' --?>'),
           first_line = (DATALENGTH(abbrev_def)
               -DATALENGTH(REPLACE(abbrev_def, CHAR(13), '')))/2 + 1,
           create_date,
           modify_date
       FROM
       (
           SELECT 
               *, 
               [count] = (DATALENGTH([definition]) 
                   - DATALENGTH(REPLACE([definition], @search_string, '')))
                   /DATALENGTH(@search_string),
               abbrev_def = SUBSTRING([definition], 1, 
                   CHARINDEX(@search_string, [definition]))
           FROM #t
       ) AS x
       ORDER BY [database], [schema], [object];
    
       IF @include_jobs = 1
       BEGIN
           SELECT 'Jobs:';
    
           SET @run_sql = N'SELECT 
                    job_name = j.name, 
                    s.step_id, 
                    s.step_name, 
                    j.date_created,
                    j.date_modified,
                    [definition] = s.command
                FROM msdb.dbo.sysjobs AS j
                INNER JOIN msdb.dbo.sysjobsteps AS s
                ON j.job_id = s.job_id
                WHERE s.command $coll$ 
                  LIKE ''%'' + @search_string + ''%'' $coll$
                ORDER BY j.name, s.step_id;';
    
           SET @run_sql = REPLACE(@run_sql, '$coll$', @coll_text); 
    
           INSERT #j EXEC sp_executesql
               @run_sql,
               N'@search_string NVARCHAR(4000)',
               @search_string;
    
           SELECT 
               job_name,
               step_id,
               step_name,
               [command] = CONVERT(XML, '<?query --
                   ' + [definition] + ' --?>'),
               create_date,
               modify_date
           FROM #j;
       END
    
       IF @include_columns = 1 OR @include_parameters = 1
       BEGIN
           SELECT 'Columns/parameters';
    
           SELECT 
               [database],
               [schema],
               [object],
               [type],
               [param],
               [column],
               create_date,
               modify_date
           FROM #cp
           ORDER BY [database], [schema], [object], [param], [column];
       END
    
       DROP TABLE #t, #j, #cp;
    END
    GO
    

    Ele conta com uma função split como esta (ou sua própria, se você já tiver uma ou, melhor ainda, STRING_SPLIT()se estiver no SQL Server 2016 ou superior e puder lidar com suas limitações ):

    CREATE FUNCTION dbo.SplitStrings_XML
    (
       @List       NVARCHAR(MAX),
       @Delimiter  NVARCHAR(3)
    )
    RETURNS TABLE
    AS
       RETURN 
       (
           SELECT Item = CONVERT(NVARCHAR(128), Item)
           FROM
           (
               SELECT Item = x.i.value('(./text())[1]', 'NVARCHAR(128)')
               FROM
               (
                   SELECT [XML] = CONVERT(XML, '<i>' 
                        + REPLACE(@List, @Delimiter, '</i><i>') 
                        + '</i>').query('.')
               ) AS a
               CROSS APPLY
               [XML].nodes('i') AS x(i)
           ) AS y
           WHERE Item IS NOT NULL
       );
    
    • 2
  2. squillman
    2012-09-27T10:22:40+08:002012-09-27T10:22:40+08:00

    Se você sabe o que está procurando, o Red Gate tem uma ferramenta de pesquisa gratuita muito boa chamada SQL Search, que é um plug-in para o SSMS. É mais fácil e menos sujeito a erros do que qualquer tentativa que fiz de examinar os comentários do sistema. Experimente. Faça o download aqui .

    Ao pesquisar referências em trabalhos, certifique-se de incluir msdb na pesquisa.

    Se você deseja consultar os trabalhos do SQL Agent diretamente, pode usar isto:

    USE msdb
    SELECT
        j.name AS JobName,
        js.step_id AS StepID,
        js.step_name AS StepName
    FROM sysjobsteps js
    INNER JOIN sysjobs j ON js.job_id=j.job_id
    WHERE js.command LIKE '%TheLinkedServer%'
    ORDER BY j.name, js.step_id
    
    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve