Alguma vez você já parou para pensar em como as functions, procedures, constraints, etc ficam armazenadas no banco? Onde fica a definição dos objetos?

No SQL Server 2000 existia uma tabela de sistema chamada syscomments. Essa tabela retornava 1 linha a cada 4000 caracteres que tivesse a definição do objeto.

Por exemplo, vejam o resultado da consulta abaixo:

SELECT OBJECT_NAME(id), colid, text
FROM syscomments

 

Notem que eu tenho 3 objetos retornados, porém para “montar” a procedure, eu preciso ler as 8 linhas retornadas.

A partir do SQL Server 2005, muitas tabelas de sistemas se tornaram views, com o objetivo de manter a compatibilidade com sistemas legados (Compatibility Views) e elas não devem mais ser utilizadas em novas implementações, pois foram substituídas pelas Catalog Views. São elas que apresentam os metadados dos objetos criados dentro do SQL Server. E por objetos, nesse caso, entenda como: Tabelas, funções, procedures, etc…

As views que retornam as definições são:

  • sql_modules: retorna as definições de Procedures, Views, Functions, Triggers…
  • default_constraints: Como o prórprio nome diz, retorna as definições das constraints default criadas.
  • check_constraints: Retorna as definições das check constraints

Seguem algumas consultas para verificar a definição de alguns objetos:

SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type_desc, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
ORDER BY o.type -- P, RF, V, TR, FN, IF, TF e R;
SELECT d.name, object_name(d.object_id), object_name(parent_object_id), d.definition
FROM sys.default_constraints AS d
INNER JOIN sys.columns AS c
ON d.parent_column_id = c.column_id
WHERE d.parent_object_id = OBJECT_ID(N'Nome_Da_Tabela', N'U')
AND c.name = 'Nome_Da_Coluna';
SELECT chk.name, object_name(chk.object_id), object_name(chk.parent_object_id), chk.definition
FROM sys.check_constraints chk
WHERE chk.parent_object_id = OBJECT_ID(N'Nome_Da_Tabela', N'U')

Lembrando que: Quando alguma definição estiver como **NULL, **é porque o objeto em questão foi criado com a opção WITH ENCRYPTION.

Espero que tenham gostado!

[]’s!

Fontes: