Có cách nào để lập trình kịch bản tất cả các đối tượng được liên kết với một bảng đã cho không?


9

Tôi biết rằng trong phòng quản lý SQL, tôi có thể nhấp chuột phải vào bảng / kích hoạt / khóa và script object as.... Có cách nào để làm điều này theo chương trình, được đặt tên của một đối tượng không?

Nếu vậy, có cách nào để tìm tất cả các đối tượng (khóa chính, khóa ngoại, trình kích hoạt) được liên kết với một bảng đã cho và tập lệnh tất cả chúng theo lập trình không?

Câu trả lời:


5

Một cách để bắt đầu với điều này sẽ là như sau:

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)

Các SysDepends "bảng" sẽ cho bạn biết đối tượng là phụ thuộc vào nhau. Nó là phân cấp, vì vậy bạn có thể phải chạy đệ quy qua SysDepends cho đến khi bạn bắt đầu nhận được null. Đôi khi, sysdepends không đầy đủ, đây là một bài viết với một số gợi ý khác .

Các sysobjects "bảng" sẽ cho bạn biết một số nội dung về các đối tượng trong cơ sở dữ liệu. Các cột loại (cũng là xtype) cho bạn biết mục này là gì: bảng do người dùng xác định, Proc được lưu trữ, kích hoạt, v.v.

Sau đó, bạn sẽ muốn sp_helptext nhổ văn bản của một thủ tục được lưu trữ. Điều này sẽ không tái tạo văn bản của một thủ tục lưu trữ được mã hóa.

Bất kỳ giải pháp đầy đủ và hoàn chỉnh nào cũng sẽ liên quan đến việc lập trình một cái gì đó, đặc biệt là khi các thủ tục và trình kích hoạt được lưu trữ được mã hóa có liên quan. Một bài viết mẫu về lập trình xác định các mục trong DB. Kiểu dữ liệu cần thiết để giải mã các procs lưu trữ SQL Server 2000 xuất hiện trong SQL Server 2005, vì vậy bạn không thể sử dụng SQL trong SQL Server 2000 để giải mã các procs được lưu trữ được mã hóa của riêng nó (nhưng bạn có thể giải mã chúng trong SQL trong SQL Server 2005) và nó sẽ không làm tôi ngạc nhiên nếu điều tương tự cũng đúng với giai đoạn chuyển đổi 2005 sang 2008. Tôi đã mất hứng thú với việc giải mã các thủ tục lưu trữ vài năm trước.


5

Đây là một kỹ thuật trong C # bằng cách sử dụng Đối tượng quản lý máy chủ - Tôi không biết cách nào để thực hiện điều đó trong T-SQL thuần túy.


Thêm vào điều này trong tinh thần, bạn cũng có thể làm tương tự với powershell2.0
jcolebrand

3

Tôi biết làm thế nào để lập trình tìm tất cả các thông tin mà bạn cần để kịch bản các đối tượng. Nhưng để thực sự viết kịch bản cho chúng, bạn có thể phải tự viết mã tạo tập lệnh.

Nếu bạn đang viết mã để tìm hiểu tất cả về các đối tượng hiện có, thuật ngữ google là "Từ điển dữ liệu máy chủ SQL".

Tôi sẽ cung cấp cho bạn một số ví dụ bắt đầu.

Để tìm tất cả các ràng buộc khóa ngoại trên một bảng cụ thể:

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

Để tìm tất cả các ràng buộc khóa ngoài tham chiếu một bảng cụ thể:

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.