Czy istnieje sposób na programowe skryptowanie wszystkich obiektów powiązanych z daną tabelą?

9

Wiem, że w studiu zarządzania SQL mogę kliknąć prawym przyciskiem myszy tabelę / wyzwalacz / klucz i script object as.... Czy istnieje sposób, aby to zrobić programowo, biorąc pod uwagę nazwę obiektu?

Jeśli tak, to czy istnieje sposób na znalezienie wszystkich obiektów (klucze podstawowe, klucze obce, wyzwalacze) powiązanych z daną tabelą i skryptowego ich wszystkich programowo?

goric
źródło

Odpowiedzi:

5

Można zacząć od tego:

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)

W SysDepends „stół” powie, które obiekty są zależne od drugiego. Jest hierarchiczny, więc może być konieczne rekurencyjne uruchamianie SysDepends, dopóki nie zaczniesz otrzymywać wartości zerowych. Czasami sysdepends jest niekompletny, oto artykuł z kilkoma innymi sugestiami .

Sysobjects „stół” powie kilka rzeczy na temat obiektów w bazie danych. Kolumny typu (także xtype) informują o tym, czym jest element: tabela zdefiniowana przez użytkownika, przechowywany proc, wyzwalacz itp.

Następnie chcesz, aby sp_helptext wypluł tekst procedury składowanej. Nie spowoduje to odtworzenia tekstu zaszyfrowanej procedury składowanej.

Każde pełne i kompletne rozwiązanie będzie wymagało programowania, zwłaszcza gdy w grę wchodzą szyfrowane procedury składowane i wyzwalacze. Jeden przykładowy artykuł na temat programowego określania pozycji w bazie danych. Typ danych potrzebny do odszyfrowania przechowywanych procesów SQL Server 2000 pojawił się w SQL Server 2005, więc nie można było używać SQL w SQL Server 2000 do odszyfrowania własnych zaszyfrowanych przechowywanych proc (ale można je odszyfrować w SQL w SQL Server 2005) nie dziwi mnie, gdyby to samo dotyczyło przejścia na lata 2005-2008. Kilka lat temu straciłem zainteresowanie deszyfrowaniem procedur przechowywanych.

Tangurena
źródło
5

Jest to technika w języku C # przy użyciu obiektów zarządzania serwerem - nie znam sposobu, aby to zrobić w czystym języku T-SQL.

Gajusz
źródło
dodając do tego ducha, możesz również zrobić to samo z powershell2.0
jcolebrand
3

Wiem, jak programowo znaleźć wszystkie informacje potrzebne do skryptu obiektów. Ale aby je skrypty skonstruować, może być konieczne samodzielne napisanie kodu generowania skryptu.

Jeśli piszesz kod, aby dowiedzieć się wszystkiego o istniejących obiektach, termin „Google” to „Słownik danych programu SQL Server”.

Dam ci kilka przykładów początkowych.

Aby znaleźć wszystkie ograniczenia klucza obcego w określonej tabeli:

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

Aby znaleźć wszystkie ograniczenia klucza obcego odnoszące się do określonej tabeli:

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
źródło