有没有办法以编程方式编写与给定表关联的所有对象的脚本?


9

我知道在SQL Management Studio中,我可以右键单击表/触发器/键,然后单击script object as...。给定对象的名称,有没有办法以编程方式执行此操作?

如果是这样,是否可以找到与给定表关联的所有对象(主键,外键,触发器)并以编程方式对所有对象进行脚本编写?

Answers:


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运行,直到开始获取空值为止。有时,sysdepends是不完整的,这里有一些其他建议

系统对象 “表”将告诉你一些东西有关数据库中的对象。类型(也称为xtype)列告诉您该项是什么:用户定义的表,存储的proc,触发器等。

然后,您将希望sp_helptext吐出存储过程的文本。这将不会重现加密存储过程的文本。

任何完整的解决方案都将涉及编程,尤其是当涉及加密的存储过程和触发器时。一篇有关通过编程确定数据库中各项的示例文章。解密SQL Server 2000存储的proc所需的数据类型显示在SQL Server 2005中,因此您不能在SQL Server 2000中使用SQL解密自己的加密存储的proc(但是您可以在SQL Server 2005的SQL中对其进行解密),并且它将如果2005年到2008年的过渡也是如此,我就不会感到惊讶。几年前,我对解密存储过程失去了兴趣。



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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.