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:
1 2 |
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:
1 2 3 4 |
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; |
1 2 3 4 5 6 |
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'; |
1 2 3 |
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:
- syscomments (SQL 2000): http://msdn.microsoft.com/en-us/library/aa260393(v=sql.80).aspx
- Compatibility Views: http://msdn.microsoft.com/pt-br/library/ms187376.aspx
- sys.syscomments (SQL 2012): http://msdn.microsoft.com/pt-br/library/ms186293.aspx
- Catalog Views: http://msdn.microsoft.com/pt-br/library/ms174365.aspx