Answers:
一种开始的方法如下:
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年的过渡也是如此,我就不会感到惊讶。几年前,我对解密存储过程失去了兴趣。
我知道如何以编程方式找到编写对象脚本所需的所有信息。但是要实际编写脚本,您可能必须自己编写脚本生成代码。
如果您要编写代码以查找有关现有对象的全部信息,则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'