Есть ли способ программно написать сценарий для всех объектов, связанных с данной таблицей?

9

Я знаю, что в студии управления SQL я могу щелкнуть правой кнопкой мыши по таблице / триггера / ключа и script object as.... Есть ли способ сделать это программно, учитывая имя объекта?

Если да, есть ли способ найти все объекты (первичные ключи, внешние ключи, триггеры), связанные с данной таблицей, и программно написать их все?

goric
источник

Ответы:

5

Один из способов начать это было бы следующим:

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)

« Таблица » SysDepends скажет вам, какие объекты зависят от другого. Он иерархический, поэтому вам, возможно, придется рекурсивно проходить через SysDepends, пока вы не начнете получать значения NULL. Иногда sysdepends является неполным, вот статья с некоторыми другими предложениями .

« Таблица » SysObjects расскажет вам кое-что об объектах в базе данных. Столбцы типа (также xtype) сообщают вам, что это за элемент: пользовательская таблица, сохраненный процесс, триггер и т. Д.

Затем вы захотите, чтобы sp_helptext выплевывал текст хранимой процедуры. Это не будет воспроизводить текст зашифрованной хранимой процедуры.

Любое полное и законченное решение будет включать в себя программирование чего-либо, особенно когда задействованы зашифрованные хранимые процедуры и триггеры. Один пример статьи по программному определению элементов в БД. Тип данных, необходимый для дешифрования хранимых процов SQL Server 2000, обнаружился в SQL Server 2005, поэтому вы не могли использовать SQL в SQL Server 2000 для дешифрования своих зашифрованных хранимых процов (но вы могли бы дешифровать их в SQL в SQL Server 2005), и это меня не удивит, если то же самое будет верно для перехода с 2005 на 2008 год. Я потерял интерес к расшифровке хранимых процедур несколько лет назад.

Tangurena
источник
5

Это методика в C # с использованием объектов управления сервером - я не знаю способа сделать это в чистом T-SQL.

Gaius
источник
добавив к этому по духу, вы можете сделать то же самое с powershell2.0
jcolebrand
3

Я знаю, как программно найти всю информацию, которая необходима для сценариев объектов. Но чтобы на самом деле их писать, вам, возможно, придется написать код генерации сценария самостоятельно.

Если вы пишете код, чтобы узнать все о существующих объектах, Google использует термин «Словарь данных SQL Server».

Я приведу несколько начальных примеров.

Чтобы найти все ограничения внешнего ключа для конкретной таблицы:

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

Чтобы найти все ограничения внешнего ключа, которые ссылаются на конкретную таблицу:

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'
Андрей Шепард
источник