sql >> Databáze >  >> RDS >> Sqlserver

Najít závislost sloupce

@NoFuchsGavinův skript obvykle funguje skvěle, ale má určitá omezení kvůli problémům s sysdepends (viz tento blogový příspěvek od Pinal Dave pro příklad, kde to dává nesprávné výsledky).

Microsoft také doporučujeme vyhnout se používání sysdepends v nové vývojové práci.

Můžeme tedy použít sys.dm_sql_referencing_entities a sys.dm_sql_referenced_entities jak bylo navrženo zde .

Všiml jsem si však, že to někdy vylučuje odkazy na sloupce kvůli referenced_minor_name je NULL. Proto jsem přidal další podmínku, která může zavést falešné poplachy, ale zajistí, že v sadě výsledků nebudou vynechány odkazy na sloupce.

DECLARE @SchemaName sysname = '{0}';
DECLARE @TableName sysname  = '{1}';
DECLARE @ColumnName sysname = '{2}';

SELECT
    @SchemaName + '.' + @TableName                                      AS [USED_OBJECT],
    @ColumnName                                                         AS [COLUMN],
    referencing.referencing_schema_name + '.' + referencing_entity_name AS USAGE_OBJECT,
    CASE so.type
        WHEN 'C' THEN 'CHECK constraint'
        WHEN 'D' THEN 'Default'
        WHEN 'F' THEN 'FOREIGN KEY'
        WHEN 'FN' THEN 'Scalar function' 
        WHEN 'IF' THEN 'In-lined table-function'
        WHEN 'K' THEN 'PRIMARY KEY'
        WHEN 'L' THEN 'Log'
        WHEN 'P' THEN 'Stored procedure'
        WHEN 'R' THEN 'Rule'
        WHEN 'RF' THEN 'Replication filter stored procedure'
        WHEN 'S' THEN 'System table'
        WHEN 'SP' THEN 'Security policy'
        WHEN 'TF' THEN 'Table function'
        WHEN 'TR' THEN 'Trigger'
        WHEN 'U' THEN 'User table' 
        WHEN 'V' THEN 'View' 
        WHEN 'X' THEN 'Extended stored procedure'
    END                                             AS USAGE_OBJECTTYPE,
    so.[type]                                       AS USAGE_OBJECTTYPEID
FROM sys.dm_sql_referencing_entities
    (
        @SchemaName + '.' + @TableName,
        'object'
    ) referencing
    INNER JOIN sys.objects so 
        ON referencing.referencing_id = so.object_id
WHERE
    EXISTS
    (
        SELECT
            *
        FROM
            sys.dm_sql_referenced_entities
            (
                referencing_schema_name + '.' + referencing_entity_name,
                'object'
            ) referenced
        WHERE
            referenced_entity_name = @TableName
            AND 
            (
                referenced.referenced_minor_name LIKE @ColumnName   
                -- referenced_minor_name is sometimes NULL
                -- therefore add below condition (can introduce False Positives)
                OR
                (
                    referenced.referenced_minor_name IS NULL 
                    AND 
                    OBJECT_DEFINITION
                    (
                         OBJECT_ID(referencing_schema_name + '.' + referencing_entity_name)
                    ) LIKE '%' + @ColumnName + '%'
                )
            )
    )
ORDER BY
    USAGE_OBJECTTYPE,
    USAGE_OBJECT

Výše uvedený skript je založen na odpovědi @NoFuchsGavin a tento blogový příspěvek .

Zajímá mě, jestli se někomu podařilo najít lepší způsob, který nezavádí falešně negativní nebo pozitivní.



  1. Přihlašovací/registrační systém s php a mysql

  2. Použití xpath k extrahování dat ze sloupce XML v postgresu

  3. MySQL Multi-Delete. Je možné vícenásobně odstranit odkazované řádky?

  4. Scénáře souběžnosti s INSERTs