¿Hay alguna manera de programar mediante programación todos los objetos asociados con una tabla dada?

9

Sé que en el estudio de administración de SQL puedo hacer clic derecho en una tabla / disparador / tecla y script object as.... ¿Hay alguna manera de hacer esto programáticamente, dado el nombre de un objeto?

Si es así, ¿hay alguna manera de encontrar todos los objetos (claves primarias, claves foráneas, desencadenantes) asociados con una tabla determinada y escribirlos todos mediante programación?

goric
fuente

Respuestas:

5

Una forma de comenzar con esto sería la siguiente:

DECLARE @TableName VARCHAR(50)
DECLARE @ObjectID INT
SET @TableName = '' -- the name of the objects you want to investigate

SELECT @ObjectID = [id]  FROM sysobjects WHERE name=@TableName

SELECT * FROM sysobjects WHERE name=@TableName
UNION
SELECT * FROM sysobjects WHERE id in (SELECT id FROM sysdepends WHERE depid= @ObjectID)

La "tabla" de SysDepends le dirá qué objetos dependen de otro. Es jerárquico, por lo que es posible que deba ejecutar SysDepends de forma recursiva hasta que comience a obtener valores nulos. A veces, sysdepends está incompleto, aquí hay un artículo con algunas otras sugerencias .

La "tabla" de SysObjects le dirá algunas cosas sobre los objetos en la base de datos. Las columnas de tipo (también xtype) le indican cuál es el elemento: tabla definida por el usuario, proceso almacenado, disparador, etc.

Entonces querrá que sp_helptext escupe el texto de un procedimiento almacenado. Esto no reproducirá el texto de un procedimiento almacenado cifrado.

Cualquier solución completa y completa implicará programar algo, especialmente cuando estén involucrados procedimientos almacenados encriptados y disparadores. Un artículo de muestra sobre la determinación programática de los elementos en la base de datos. El tipo de datos necesario para descifrar los procesos almacenados de SQL Server 2000 se mostró en SQL Server 2005, por lo que no podría usar SQL en SQL Server 2000 para descifrar sus propios procesos almacenados cifrados (pero podría descifrarlos en SQL en SQL Server 2005) y lo haría No me sorprende si lo mismo fue cierto para la transición de 2005 a 2008. Perdí interés en descifrar los procedimientos almacenados hace varios años.

Tangurena
fuente
5

Esta es una técnica en C # que utiliza objetos de administración del servidor: no sé cómo hacerlo en T-SQL puro.

Gayo
fuente
agregando a esto en espíritu, también puede hacer lo mismo con powershell2.0
jcolebrand
3

Sé cómo encontrar programáticamente toda la información que necesita para crear un script para los objetos. Pero para realmente escribirlos, es posible que deba escribir el código de generación del script usted mismo.

Si está escribiendo código para averiguar todo sobre los objetos existentes, el término para google es "Diccionario de datos de SQL Server".

Te daré algunos ejemplos iniciales.

Para buscar todas las restricciones de clave externa en una tabla específica:

select * from information_schema.table_constraints where CONSTRAINT_TYPE = 'FOREIGN KEY'
and TABLE_NAME = 'aspnet_Roles'

Para encontrar todas las restricciones de clave externa que hacen referencia a una tabla específica:

select 
sys.foreign_keys.name as key_name,
pt.name as parent_table_name,
pc.name as parent_column_name,
ct.name as referenced_table_name,
cc.name as referenced_colum_name 
from sys.foreign_key_columns
inner join sys.foreign_keys on sys.foreign_key_columns.constraint_object_id = sys.foreign_keys.object_id
inner join sys.tables pt on sys.foreign_key_columns.parent_object_id = pt.object_id
inner join sys.tables ct on sys.foreign_key_columns.referenced_object_id = ct.object_id
inner join sys.columns pc on sys.foreign_key_columns.parent_object_id = pc.object_id and sys.foreign_key_columns.parent_column_id = pc.column_id
inner join sys.columns cc on sys.foreign_key_columns.referenced_object_id = cc.object_id and sys.foreign_key_columns.referenced_column_id = cc.Column_id
where ct.name = 'aspnet_Applications'
Andrew Shepherd
fuente