Apakah ada cara untuk skrip pemrograman semua objek yang terkait dengan tabel yang diberikan?

9

Saya tahu bahwa di studio manajemen SQL saya dapat mengklik kanan tabel / trigger / key dan script object as.... Apakah ada cara untuk melakukan ini secara terprogram, mengingat nama objek?

Jika demikian, adakah cara untuk menemukan semua objek (kunci primer, kunci asing, pemicu) yang terkait dengan tabel dan skrip yang diberikan semuanya secara terprogram?

goric
sumber

Jawaban:

5

Cara untuk memulai ini adalah sebagai berikut:

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)

The SysDepends "tabel" akan memberitahu Anda yang benda tergantung pada yang lain. Itu hierarkis, jadi Anda mungkin harus menjalankan SysDepends secara rekursif hingga Anda mulai mendapatkan nol. Terkadang, ketergantungan sys tidak lengkap, di sini ada artikel dengan beberapa saran lain .

The SysObjects "tabel" akan memberitahu Anda beberapa hal tentang objek dalam database. Kolom tipe (juga xtype) memberi tahu Anda item tersebut: tabel yang ditentukan pengguna, proc tersimpan, pemicu, dll.

Maka Anda akan ingin sp_helptext memuntahkan teks dari prosedur tersimpan. Ini tidak akan mereproduksi teks dari prosedur tersimpan terenkripsi.

Setiap solusi lengkap dan lengkap akan melibatkan pemrograman sesuatu, terutama ketika prosedur tersimpan tersimpan dan pemicu terlibat. Satu contoh artikel tentang secara sistematis menentukan item dalam DB. Datatype yang diperlukan untuk mendekripsi SQL Server 2000 procs tersimpan muncul di SQL Server 2005, sehingga Anda tidak bisa menggunakan SQL dalam SQL Server 2000 untuk mendekripsi procs tersimpan yang dienkripsi sendiri (tetapi Anda bisa mendekripsi mereka dalam SQL di SQL Server 2005) dan itu akan tidak mengejutkan saya jika hal yang sama berlaku untuk transisi 2005-2008. Saya kehilangan minat mendekripsi prosedur tersimpan beberapa tahun yang lalu.

Tangurena
sumber
5

Ini adalah teknik dalam C # menggunakan Server Management Objects - Saya tidak tahu cara untuk melakukannya dalam T-SQL murni.

Gayus
sumber
menambahkan ini dalam semangat, Anda juga dapat melakukan hal yang sama dengan powershell2.0
jcolebrand
3

Saya tahu cara menemukan semua informasi yang Anda perlukan untuk membuat skrip objek secara terprogram. Tetapi untuk benar-benar membuat skrip mereka, Anda mungkin harus menulis sendiri kode pembuatan skrip.

Jika Anda menulis kode untuk mencari tahu semua tentang objek yang ada, istilah untuk google adalah "Kamus Data Server SQL".

Saya akan memberikan beberapa contoh awal.

Untuk menemukan semua batasan kunci asing pada tabel tertentu:

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

Untuk menemukan semua batasan kunci asing yang merujuk pada tabel tertentu:

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
sumber