Encontrar donde se usa una determinada columna

Cuando trabajamos con bases de datos Sql Server y necesitamos realizar un cambio en una columna, es necesario saber donde más la estamos usando. Con este script de Karen Gayda nos puede ayudar en eso, este script crea un procedimiento almacenado, llamado usp_FindColumnUsage, que se puede utilizar con la siguiente sintaxis:

usp_FindColumnUsage NombreTabla,NombreColumna

El script a continuación (he traducido el texto necesario a español como lo uso):

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[usp_FindColumnUsage]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[usp_FindColumnUsage]
GO


CREATE PROCEDURE [dbo].[usp_FindColumnUsage]
@vcTableName varchar(100),
@vcColumnName varchar(100)
AS
/************************************************************************************************
DESCRIPTION: Creates prinatable report of all stored procedures, views, triggers
and user-defined functions that reference the
table/column passed into the proc.

PARAMETERS:
@vcTableName - table containing searched column
@vcColumnName - column being searched for
REMARKS:
To print the output of this report in Query Analyzer/Management
Studio select the execute mode to be file and you will
be prompted for a file name to save as. Alternately
you can select the execute mode to be text, run the query, set
the focus on the results pane and then select File/Save from
the menu.

This procedure must be installed in the database where it will
be run due to it's use of database system tables.

USAGE:

usp_FindColumnUsage 'jct_contract_element_card_sigs', 'contract_element_id'

AUTHOR: Karen Gayda
TRADUCTOR: Carlos Mayanga
WEB:http://ikanus3000.blogspot.com

DATE: 07/19/2007

MODIFICATION HISTORY:
WHO DATE DESCRIPTION
--- ---------- -------------------------------------------
*************************************************************************************************/
SET NOCOUNT ON



PRINT ''
PRINT 'REPORTE PARA DEPENDENCIAS PARA TABLA/COLUMNA:'
PRINT '----------------------------------------------'
PRINT @vcTableName + '.' +@vcColumnName


PRINT ''
PRINT ''
PRINT 'PROCEDIMIENTOS ALMACENADOS:'
PRINT ''

SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre del Procedimiento]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE = 'P'
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre del Procedimiento]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' procedimientos almacenados dependientes para la columna "' + @vcTableName + '.' +@vcColumnName + '".'



PRINT''
PRINT''
PRINT 'VISTAS:'
PRINT''
SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre de la Vista]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE = 'V'
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre de la Vista]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' vistas dependientes para la columna "' + @vcTableName + '.' +@vcColumnName + '".'


PRINT ''
PRINT ''
PRINT 'FUNCIONES:'
PRINT ''

SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre de la Función],
CASE WHEN o.XTYPE = 'FN' THEN 'Escalar'
WHEN o.XTYPE = 'IF' THEN 'En linea'
WHEN o.XTYPE = 'TF' THEN 'Tabla'
ELSE '?'
END
as [Tipo de Función]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE IN ('FN','IF','TF')
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre de la Función]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' funciones dependientes de la columna "' + @vcTableName + '.' +@vcColumnName + '".'

PRINT''
PRINT''
PRINT 'TRIGGERS:'
PRINT''

SELECT DISTINCT SUBSTRING(o.NAME,1,60) AS [Nombre del Trigger]
FROM sysobjects o
INNER JOIN syscomments c
ON o.ID = c.ID
WHERE o.XTYPE = 'TR'
AND c.Text LIKE '%' + @vcColumnName + '%' + @vcTableName + '%'


ORDER BY [Nombre del Trigger]
PRINT CAST(@@ROWCOUNT as Varchar(5)) + ' triggers dependientes para la columna "' + @vcTableName + '.' +@vcColumnName + '".'


GO

El script muestra el resultado como un reporte imprimible en el analizador de consultas, escogiendo la opción Resultados como Texto, del menú Consulta.

Fuente: Sql Server Central (en inglés).

No hay comentarios: