2011-03-18 21 views
7

Tengo una base de datos de servidor sql con numerosas tablas, algunas ya no se usan, así que quiero eliminarlas. Toda la interactividad de la base de datos se realiza a través de un procedimiento almacenado en estas tablas.encontrar todas las tablas no referenciadas en los procedimientos almacenados

¿Existe un script sql de base de datos que pueda usar que enumere todas las tablas a las que no se hace referencia en ninguno de los procedimientos almacenados en la base de datos?

+0

¿Qué versión de SQL Server? –

+0

Esta pregunta es casi idéntica a [ésta] (http://stackoverflow.com/questions/5352353/find-all-tables-not-referenced-in-stored-procedures) pero las respuestas son diferentes. – DOK

+1

@DOK - ¿Cuál? ¡Has vuelto a vincular a esta pregunta! –

Respuesta

3

No puede hacer esto si utiliza cualquier T-SQL dinámico. Dynamic T-SQL no aparecerá en ninguna investigación de dependencias de objetos.

En su lugar, puede utilizar el DMV sys.dm_db_index_usage_stats para encontrar los objetos a los que no han hecho referencia las consultas. Aquí está una consulta que hice en SQLServerPedia para ello:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

La consulta está diseñado para los índices de ajuste del rendimiento, por lo que tendrá que modificar unas pocas líneas. Aquí está la consulta modificada:

SELECT 
o.name 
, indexname=i.name 
, i.index_id 
, reads=user_seeks + user_scans + user_lookups 
, writes = user_updates 
, rows = (SELECT SUM(p.rows) FROM sys.partitions p WHERE p.index_id = s.index_id AND s.object_id = p.object_id) 
, CASE 
    WHEN s.user_updates < 1 THEN 100 
    ELSE 1.00 * (s.user_seeks + s.user_scans + s.user_lookups)/s.user_updates 
    END AS reads_per_write 
, 'DROP INDEX ' + QUOTENAME(i.name) 
+ ' ON ' + QUOTENAME(c.name) + '.' + QUOTENAME(OBJECT_NAME(s.object_id)) as 'drop statement' 
FROM sys.dm_db_index_usage_stats s 
INNER JOIN sys.indexes i ON i.index_id = s.index_id AND s.object_id = i.object_id 
INNER JOIN sys.objects o on s.object_id = o.object_id 
INNER JOIN sys.schemas c on o.schema_id = c.schema_id 
WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1 
AND s.database_id = DB_ID() 
ORDER BY reads 

Tenga en cuenta que este atrapa todos los índices, y usted tiene que tamizar a través de - algunos de sus objetos puede haber montones, algunos pueden tener índices agrupados, etc. Dejaré esto como una wiki para que alguien más ambicioso que yo pueda editarlo para construir una lista dedujo. :-D

0

Tal vez algo en este sentido:

select t.table_name 
from INFORMATION_SCHEMA.TABLES t 
where not exists (
    select 1 from INFORMATION_SCHEMA.ROUTINES r 
    where object_definition(object_id(r.ROUTINE_NAME)) like '%'+t.TABLE_NAME+'%' 
) order by t.TABLE_NAME 
0

La primera tabla de consulta listas con el nombre de procedimiento almacenado que lo utiliza. La segunda consulta muestra la tabla con el número de procesos almacenados que la utilizan.

-- list all tables/sprocs 
select t.name [Table], p.name [StoredProc] 
from sys.tables t 
left join sys.procedures p on (OBJECT_DEFINITION(p.object_id)) like '%' + t.name + '%' 
where t.type = 'U' 
order by t.name, p.name 

-- count stored procs using table 
select t.name [Table], count(p.name) [Count] 
from sys.tables t 
left join sys.procedures p on (OBJECT_DEFINITION(p.object_id)) like '%' + t.name + '%' 
where t.type = 'U' 
group by t.name 
order by t.name 
3

Si SQL Server 2008 entonces la información de las dependencias ahora es confiable.

SELECT SCHEMA_NAME(t.schema_id), 
     t.name 
FROM sys.tables t 
WHERE is_ms_shipped = 0 
     AND NOT EXISTS (SELECT * 
         FROM sys.sql_expression_dependencies d 
         WHERE d.referenced_entity_name = t.name 
           AND ((is_ambiguous = 1 or is_caller_dependent=1) 
            OR 
          d.referenced_id = t.object_id) ) 
+0

¿son precisas las dependencias entre bases de datos cruzadas? Pensé que todavía no estaban – JNK

+0

@JNK - Hay un 'referencia_database_name' en' sys.sql_expression_dependencies' que se puede mirar. No he tenido en cuenta eso en absoluto en mi respuesta y, además, mi respuesta necesitaría ajustes si el OP tiene columnas exactamente iguales a una de sus tablas. ¡Lo dejé como ejercicio para el OP! –

0

He aquí uno puede intentar:

select 
    name 
from 
     sys.tables t 
    left join 
     sys.sql_dependencies d 
    on 
     t.object_id = 
     d.referenced_major_id 
where 
    d.referenced_major_id is null 

De lo contrario, aquí es una referencia que he utilizado en el pasado:

http://www.mssqltips.com/tip.asp?tip=1294

0

Si performace isnt a un gran problema podrías probar lo siguiente.

Select Distinct Object_Name(ID) 
From syscomments 
Where ID Not In (Select ID From syscomments Where Text Like '%<TableName>%') 

Esto comprobará cada vista, regla, por defecto, disparador, restricción CHECK, restricción DEFAULT, y el procedimiento almacenado dentro de su base de datos

Cuestiones relacionadas