Como posso saber qual procedimento ou gatilho armazenado está usando uma tabela no SQL Server 2008 R2?

9

É o caso de no banco de dados que estou verificando, existe uma tabela de arquivamento que mantém o histórico do usuário e existe um procedimento de acionamento ou armazenamento que, após algum tempo, exclui as linhas desta tabela, para evitar o tamanho excessivo do mesmo, não projetei o banco de dados, estou apenas fazendo a manutenção de um aplicativo que usa esse banco de dados, por isso não sei o nome desses procedimentos ou gatilhos armazenados, o que quero fazer é localizar esse procedimento armazenado ou gatilho, verifique o código e modifique-o para deixar esse "histórico do usuário" por mais tempo na tabela.

Alguém me disse para verificar a tabela "sysobjects", onde posso ver algo com o mesmo nome da tabela, mas essa é a única informação que consegui recuperar, algum conselho?

Obrigado.

farp332
fonte

Respostas:

6

Pesquise todo o código usando sys.sql_modules

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules sm
WHERE definition LIKE '%Mytable%'

Ou use o Red Gate SQL Search, que é totalmente gratuito

Não use syscomments ou INFORMATION_SCHEMA.RUBBISH

gbn
fonte
O sujeito também não pode clicar com o botão direito do mouse na tabela de destino e clicar em "Mostrar dependências" (ou algum texto nesse sentido)?
21411 Nick Chammas
@ Nick Chammas: Não, isso é bem conhecido como sendo não confiável
GBN
@gbn, entendo que os syscomments são compatíveis com versões anteriores e podem ser removidos de uma versão futura, mas você pode explicar por que não usar o INFORMATION_SCHEMA? thx
datagod 16/11/11
@ datagod: mesmo porque syscomments como sempre uma má escolha: a coluna de definição é nvarchar (4000). Isso significa que você pode perder uma referência de tabela se na posição da string> 4000 ou ultrapassar o limite entre as linhas nvarchar (4000) (depende de como você lida com isso, poderia concat supor que se você realmente quisesse ...
gbn
@gbn Na verdade, syscommentspossui várias linhas para um objeto que ultrapassa o limite de 4.000 caracteres, fazendo com que as consultas sejam tão válidas quanto sys.sql_modules. Eu ainda recomendo sys.sql_modulesno entanto, uma vez que syscommentsé depreciado.
Kenneth Fisher
4

Experimente a Pesquisa ApexSQL

O ApexSQL Search é um suplemento GRATUITO do SQL Server Management Studio e Visual Studio que, entre outros recursos, possui o recurso Exibir Dependências. O recurso Exibir Dependências tem a capacidade de visualizar todos os relacionamentos dos objetos de banco de dados SQL, incluindo aqueles entre objetos criptografados e do sistema, objetos específicos do SQL Server 2012 e objetos armazenados em bancos de dados criptografados com TDE (Transparent Data Encryption)

O recurso Visualizar Dependências também permite configurar e personalizar o layout do diagrama de dependências visuais, incluindo os relacionamentos que serão apresentados, o layout e o tamanho do diagrama gerado e a profundidade de detalhamento das dependências.

Isenção de responsabilidade: trabalho para o ApexSQL como engenheiro de suporte

Milica Medic
fonte
2

Para referência futura a partir de 2008, também há uma DMV que pode ser usada. sys.dm_sql_referencing_entities. Eu geralmente prefiro usar SQL_Modules, pois evita falsos positivos entre outras coisas. Eu discuti aqui, mas basicamente se você tiver um pedaço de código como este:

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id) 
FROM sys.sql_modules WHERE [definition] LIKE '%ABC%'

Você terminará com resultados para a tabela ABC, a tabela ABCLog a visualização vw_ABC, o procedimento armazenado sp_Update_ABC etc. .

A versão DMV da mesma consulta é esta:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')
Kenneth Fisher
fonte
1

Além disso, você pode usar a exibição do catálogo sys.sql_expression_dependencies . Use esta consulta:

SELECT 
referencing_object_name = obj.name, 
referencing_object_type_desc = obj.type_desc, 
referenced_object_name = referenced_entity_name
FROM sys.sql_expression_dependencies sd 
INNER JOIN sys.objects obj 
ON sd.referencing_id = obj.[object_id] 
WHERE referenced_entity_name = 'MyTable'
Milica Medic
fonte