sql >> Database >  >> RDS >> Sqlserver

Kolomafhankelijkheid zoeken

Het script van @NoFuchsGavin werkt meestal prima, maar heeft enkele beperkingen vanwege problemen met sysdepends (zie deze blogpost van Pinal Dave voor een voorbeeld waarbij dit onjuiste resultaten geeft).

Microsoft stel ook voor dat u het gebruik van sysdepends . vermijdt in nieuw ontwikkelingswerk.

We kunnen daarom sys.dm_sql_referencing_entities . gebruiken en sys.dm_sql_referenced_entities zoals voorgesteld hier .

Ik heb echter gemerkt dat dit soms kolomverwijzingen uitsluit vanwege referenced_minor_name NUL zijn. Ik heb daarom een ​​andere voorwaarde toegevoegd die valse positieven kan introduceren, maar die ervoor zorgt dat kolomverwijzingen niet worden weggelaten uit de resultatenset.

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

Bovenstaand script is gebaseerd op het antwoord van @NoFuchsGavin en deze blogpost .

Ik ben benieuwd of iemand een betere manier heeft gevonden die geen valse negatieven of positieven introduceert.



  1. Controleer of MySQL-tabel bestaat of niet

  2. Hoe JSON-gegevens op te slaan in MySQL

  3. Python verwijst naar databaseverbinding op een ander script

  4. Hoe kan ik een LIKE-query uitvoeren voor een jsonb-sleutel?