Cómo encontrar objetos que dependen de una determinada columna de tabla.Buscar dependencia de columna
Ex:
Tabla: alguna_tabla
Cols: pk col1, col2, col3
Quiero encontrar todos los objetos que dependen de col1 (Pk)
Cómo encontrar objetos que dependen de una determinada columna de tabla.Buscar dependencia de columna
Ex:
Tabla: alguna_tabla
Cols: pk col1, col2, col3
Quiero encontrar todos los objetos que dependen de col1 (Pk)
Pruebe esta consulta, obtendrá algunos resultados que creo que está buscando.
Para filtrar, busque el valor en la columna c1.name o c2.name.
Para buscar todas las referencias a una determinada columna, utilice el c2.name para el nombre de la columna y la OBJECT_NAME (k.referenced_object_id) como la tabla que contiene la columna c2 :)
buena suerte!
select OBJECT_NAME(k.parent_object_id) as parentTable
, c1.name as parentColumn
, OBJECT_NAME(k.referenced_object_id) as referencedTable
, c2.name as referencedColumn
from sys.foreign_keys k
inner join sys.foreign_key_columns f
on f.parent_object_id = k.parent_object_id
and f.constraint_object_id = k.object_id
inner join sys.columns c1
on c1.column_id = f.parent_column_id
and c1.object_id = k.parent_object_id
inner join sys.columns c2
on c2.column_id = f.referenced_column_id
and c2.object_id = k.referenced_object_id
where c2.name = 'Column'
and OBJECT_NAME(k.referenced_object_id) = 'Table'
Pruebe esto: Esto le dará todos los nombres de los objetos que hacen referencia a Pk de su tabla.
select OBJECT_NAME(parent_object_id) from sys.foreign_keys where referenced_object_id = OBJECT_ID('YourTableName')
Simplemente sustituya {0} y {1}!
declare @tbl_nme as varchar(50)
declare @col_nme as varchar(50)
declare @level int
set @level = 1
set @tbl_nme= '{0}' --TableName
set @col_nme= '{1}' --ColumnName
select
obj.name as obj_nm
, col.name as col_nm
, depobj.name as dep_obj_nm
, CASE depobj.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 '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 dep_obj_type
, null as dep_col_nm
, depobj.type as dep_obj_typeID
, @level as level
into #temp
from sysobjects obj
join syscolumns col on obj.id = col.id
left join (sysdepends dep join sysobjects depobj on depobj.id = dep.id)
on obj.id = dep.depid
and col.colid = dep.depnumber
where obj.name = @tbl_nme
and col.name = @col_nme
while (@@rowcount > 0)
begin
set @level = @level + 1
insert into #temp
select
obj.name as obj_nm
, col.name as col_nm
, depobj.name as dep_obj_nm
, CASE depobj.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 '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 dep_obj_type
, null as dep_col_nm
, depobj.type as dep_obj_typeID
, @level as level
from sysobjects obj
join syscolumns col on obj.id = col.id
left join (sysdepends dep join sysobjects depobj on depobj.id = dep.id)
on obj.id = dep.depid
and col.colid = dep.depnumber
where exists(select 1 from #temp a where obj.name = a.dep_obj_nm and
col.name = a.dep_col_nm and level = @level - 1 and dep_col_nm is not null)
end
select
obj_nm AS 'TABLE',
col_nm AS 'COLUMN',
dep_obj_nm AS 'USAGE_OBJECT',
dep_obj_type AS 'USAGE_OBJECTTYPE',
dep_obj_typeID AS 'USAGE_OBJECTTYPEID'
from #temp
drop table #temp
Esto es lo que estaba buscando, gracias –
Esto debería hacer el truco:
SELECT OBJECT_NAME (referencing_id), referencing_id, referenced_id
FROM sys.sql_expression_dependencies d
WHERE OBJECT_NAME(d.referenced_id) = '<TABLE_NAME>'
AND OBJECT_DEFINITION(referencing_id) = '<COLUMN_NAME>';
fuente: http://www.mssqltips.com/sqlservertip/2999/different-ways-to-find-sql-server-object-dependencies/
o, para mostrar todas las dependencias de una tabla, utilice
EXEC sp_depends <TABLE_NAME>
fuente: https://msdn.microsoft.com/en-us/library/ms189487.aspx
¡Esto debería funcionar!
-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'ColumnToBeSearched' + '%'
Order by 1
GO
-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'ColumnToBeSearched' + '%'
GO
Encuentra dependencias de columna específicos
SELECT OBJECT_NAME(referencing_id), referenced_database_name, referenced_schema_name, referenced_entity_name FROM sys.sql_expression_dependencies WHERE OBJECT_NAME(referenced_id) = 'table_name' AND OBJECT_DEFINITION(referencing_id) LIKE '%field_name%';
SQL proporcionada en el accepted answer above deben incluir una condición adicional unión entre sys.foreign_keys y sys.foreign_key_columns. Ver línea que comienza con "y" a continuación:
from sys.foreign_keys k
inner join sys.foreign_key_columns f
on f.parent_object_id = k.parent_object_id
and f.constraint_object_id = k.object_id
Como referencia, aquí está todo el guión con la modificación se unen:
select OBJECT_NAME(k.parent_object_id) as parentTable
, c1.name as parentColumn
, OBJECT_NAME(k.referenced_object_id) as referencedTable
, c2.name as referencedColumn
from sys.foreign_keys k
inner join sys.foreign_key_columns f
on f.parent_object_id = k.parent_object_id
and f.constraint_object_id = k.object_id
inner join sys.columns c1
on c1.column_id = f.parent_column_id
and c1.object_id = k.parent_object_id
inner join sys.columns c2
on c2.column_id = f.referenced_column_id
and c2.object_id = k.referenced_object_id
where c2.name = 'GUID'
and OBJECT_NAME(k.referenced_object_id) = 'AuthDomain'
Siga adelante y haga que su respuesta sea independiente: suponga que nadie ha leído la respuesta aceptada. – rrauenza
@ guión de NoFuchsGavin por lo general funciona muy bien, pero tiene algunas limitaciones debido a problemas con sysdepends
(Consulte this blog post by Pinal Dave para obtener un ejemplo donde esto da resultados incorrectos).
Microsoft también sugieren que evite usar sysdepends
en un nuevo trabajo de desarrollo.Por lo tanto, podemos usar sys.dm_sql_referencing_entities
y sys.dm_sql_referenced_entities
como se sugiere here.
Sin embargo, me he dado cuenta que esto a veces excluye referencias de columna debido a referenced_minor_name
ser NULL. Por lo tanto, he agregado otra condición que puede presentar falsos positivos, pero asegura que las referencias de columna no se omitan del conjunto de resultados.
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 '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
Por encima de guión se basa en la respuesta de @ NoFuchsGavin y this blog post.
Me interesa saber si alguien ha logrado encontrar una mejor manera que no presente falsos negativos o positivos.
¡Funciona para mí! ¡Gracias por hacer referencia a las mejores prácticas! – Colin
Nota: falta una condición de unión. Consulte el script modificado debajo de @ christopher-cullum para la solución. – gerrod
Cambié la secuencia de comandos con la condición de combinación faltante. Es curioso que después de más de 5 años este guión todavía se usa :) –
¡No tienes idea de lo útil que lo encontré ayer! :-) – gerrod