Чи існує спосіб програмного скриптування всіх об'єктів, пов’язаних із заданою таблицею?


9

Я знаю, що в студії управління SQL я можу клацнути правою кнопкою миші таблицю / тригер / ключ і script object as.... Чи існує спосіб це зробити програмно, з урахуванням імені об'єкта?

Якщо так, чи є спосіб знайти всі об'єкти (первинні ключі, зовнішні ключі, тригери), пов’язані з даною таблицею та сценарієм, всі вони програмно?

Відповіді:


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, поки ви не почнете отримувати нулі. Іноді систематизація неповна, ось стаття з деякими іншими пропозиціями .

SysObjects «стіл» розповість вам деякі речі про об'єкти в базі даних. Стовпці типу (також xtype) повідомляють про те, що таке елемент: таблиця, визначена користувачем, збережена програма, тригер і т.д.

Тоді ви захочете sp_helptext виплюнути текст збереженої процедури. Це не відтворить текст зашифрованої збереженої процедури.

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


5

Це техніка в C # за допомогою об’єктів управління сервером - я не знаю способу зробити це в чистому T-SQL.


додавши до цього в дусі, ви можете зробити те ж саме і з 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.