Belirli bir tabloyla ilişkili tüm nesneleri programlı olarak komut dosyası oluşturmanın bir yolu var mı?


9

SQL yönetim stüdyosunda bir tablo / tetikleyici / anahtarı sağ tıklayabileceğimi biliyorum script object as.... Bir nesnenin adı verildiğinde bunu programlı olarak yapmanın bir yolu var mı?

Öyleyse, belirli bir tabloyla ilişkili tüm nesneleri (birincil anahtarlar, yabancı anahtarlar, tetikleyiciler) bulmanın ve programlı olarak komut dosyasının bir yolu var mı?

Yanıtlar:


5

Bununla başlamanın bir yolu şudur:

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 "Tablo" nesneleri birbirine bağımlı olan hangi söyleyecektir. Hiyerarşiktir, bu yüzden null almaya başlayana kadar SysDepends ile yinelemeli olarak çalışmanız gerekebilir. Bazen, sysdepends eksik, işte başka önerileri olan bir makale .

SysObjects "tablo" veritabanında nesneler hakkında sana bazı şeyler söyleyecektir. Tür (ayrıca xtype) sütunları size öğenin ne olduğunu söyler: kullanıcı tanımlı tablo, depolanan proc, tetikleyici vb.

Sonra sp_helptext saklı yordamın metni tükürmek isteyeceksiniz . Bu, şifreli bir saklı yordamın metnini çoğaltmaz.

Herhangi bir tam ve eksiksiz çözüm, özellikle şifrelenmiş saklı yordamlar ve tetikleyiciler söz konusu olduğunda bir şeyin programlanmasını içerecektir. DB'deki öğelerin programlı olarak belirlenmesi üzerine bir örnek makale . SQL Server 2000 depolanmış proc'ların şifresini çözmek için gereken veri türü SQL Server 2005'te ortaya çıktı, bu nedenle SQL Server 2000'de SQL'i kendi şifrelenmiş depolanmış proc'larının şifresini çözmek için kullanamazsınız (ancak SQL Server 2005'te SQL'de şifresini çözebilirsiniz) ve 2005'ten 2008'e geçiş için de aynısı olsaydı beni şaşırtmayın. Birkaç yıl önce saklı prosedürlerin şifresini çözme ilgimi kaybettim.


5

Bu C # Sunucu Yönetim Nesneleri kullanarak bir tekniktir - saf T-SQL bunu yapmak için bir yol bilmiyorum.


bunu ruhla ekleyerek, aynı şeyi powershell2.0 ile de yapabilirsiniz
jcolebrand

3

Nesneleri kodlamak için gereken tüm bilgileri programlı olarak nasıl bulacağımı biliyorum. Ancak aslında onları komut dosyası oluşturmak için komut dosyası oluşturma kodunu kendiniz yazmanız gerekebilir.

Mevcut nesneler hakkında her şeyi öğrenmek için kod yazıyorsanız, google için terim "SQL Server Veri Sözlüğü" dür.

Size bazı başlangıç ​​örnekleri vereceğim.

Belirli bir tabloda tüm yabancı anahtar kısıtlamalarını bulmak için:

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

Belirli bir tabloya başvuran tüm yabancı anahtar kısıtlamalarını bulmak için:

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.