سلام
من یه برنامه حدود 4 سال پیش برای همین منظور نوشتم، یه کمی از اون رو اینجا قرار می دم.
این فقط برای بررسی ساختار داخلی DB ها هست.
تمام کارها رو انجام میده، نوعهای موجود در بانک اطلاعاتی، جداول، ستونها، کلیدهای اصلی و خارجی، توابع و ... رو استخراج میکنه.
try
//fil type list table
SQLScript := 'insert into TypeList'+AddStr+' (TName, Name, Length, CanNull, DefName) '+
'select st.name, '+
'(Select name from ['+srvName+'].'+dbName+'..systypes where xusertype = st.xtype), '+
'case st.status '+
'when 2 then st.length '+
'else 0 '+
'end as Length, '+
'case st.allownulls '+
'when 0 then ''Not'' '+
'else '''' '+
'end as AllowNull, '+
'(select so.name from ['+srvName+'].'+dbName+'..sysobjects so where so.id = st.tdefault) '+
'from ['+srvName+'].'+dbName+'..systypes st '+
'where st.xtype <> st.xusertype '+ #13#10;
//fil col list table
SQLScript := SQLScript + 'insert into ColList'+AddStr+' (TableName, ColName, Type, Length, CanNull, MyType) '+
'select object_name(sc.id), sc.name, '+
'type_name(sc.xusertype), '+
'case sc.typestat '+
'when 2 then sc.Length '+
'when 3 then sc.Length '+
'else ''''' +
'end as Length, '+
'case sc.isNullable '+
' when 0 then ''Not'' '+
' when 1 then '''' '+
'end, '+
'case type_name(sc.xtype) '+
' when type_name(sc.xusertype) then '''' '+
' else ''Yes'' '+
'end as MyType '+
'from ['+srvName+'].'+dbName+'..syscolumns sc inner join sysobjects so '+
'on so.id = sc.id and so.xtype = ''U'' '+#13#10;
//fil default list table
SQLScript := SQLScript + 'insert into DefList'+AddStr+' (TableName, DefName, ColName, DefVal, sysDef) '+
'select object_name(so.parent_obj), object_name(so.id), '+
'(select sc.name from ['+srvName+'].'+dbName+'..syscolumns sc where sc.cdefault = scm.id), scm.text, '+
'case so.parent_obj '+
' when 0 then ''Yes'' '+
' else '''' '+
'end as SysDef '+
'from ['+srvName+'].'+dbName+'..sysobjects so '+
'inner join syscomments scm on scm.id=so.id '+
'and so.xtype = ''D'' '+#13#10;
//fil constraint list table
SQLScript := SQLScript + 'insert into ConsList'+AddStr+' (TableName, ConsName, ConsText, ConsDisable, ConsNotRepl) '+
'select object_name(so.parent_obj), '+
'object_name(scm.id), scm.text, '+
'ConsDisable = case when (ObjectProperty(scm.id, ''CnstIsDisabled'')=1) Then '+
'convert(varchar (3),''Yes'') else convert(varchar (3),'''') end, '+
'ConsNotRepl = CASE when (ObjectProperty(scm.id, ''CnstIsNotRepl'')=1) then '+
'convert(varchar (3),''Yes'') else convert(varchar (3),'''') end '+
'from ['+srvName+'].'+dbName+'..syscomments scm inner join sysobjects so '+
'on so.xtype=''C'' and so.id= scm.id '+#13#10;
//fil primary key list table
SQLScript := SQLScript + 'DECLARE TableName CURSOR FOR '+
'SELECT SO.Name '+
'FROM ['+srvName+'].'+dbName+'..SysObjects SO '+
'WHERE SO.Type = ''U'' ORDER BY SO.Name '+
'CREATE TABLE #Temp_PK ( '+
'TABLE_QUALIFIER varchar(50) NULL, '+
'TABLE_OWNER varchar(50) NULL, '+
'TABLE_NAME varchar(50) NULL, '+
'COLUMN_NAME varchar(50) NULL, '+
'KEY_SEQ varchar(50) NULL, '+
'PK_NAME varchar(50) NULL )' +
'DECLARE @TName VARCHAR(50) '+
'OPEN TableName '+
'FETCH NEXT FROM ['+srvName+'].'+dbName+'..TableName INTO @TName '+
'WHILE @@FETCH_STATUS = 0 '+
'BEGIN '+
'INSERT INTO #Temp_PK EXEC SP_PKeys @TName '+
'FETCH NEXT FROM ['+srvName+'].'+dbName+'..TableName INTO @TName '+
'END '+
'DEALLOCATE TableName '+
'insert into PKList'+AddStr+' (TableName, ColName, PkName) '+
'SELECT TABLE_NAME, COLUMN_NAME, PK_NAME '+
'FROM ['+srvName+'].'+dbName+'..#Temp_PK '+
'DROP TABLE #Temp_PK'+#13#10;
//fil foreign key list table
SQLScript := SQLScript + 'insert into FKList'+AddStr+' (RName, PTable, PkCol, FTable, FkCol, CascUpdate, CascDelete) '+
'select object_name(sf.constid), object_name(sf.rkeyid), '+
'sc1.name, object_name(sf.fkeyid), '+
'sc2.name, '+
'CascUpdate = case when (objectproperty(constid, ''CnstIsUpdateCascade'')=1) Then '+
'convert(varchar (3),''Yes'') else convert(varchar (3),'''') end, '+
'CascDelete = CASE when (objectproperty(constid, ''CnstIsDeleteCascade'')=1) then '+
'convert(varchar (3),''Yes'') else convert(varchar (3),'''') end '+
'from ['+srvName+'].'+dbName+'..sysforeignkeys sf, syscolumns sc1, syscolumns sc2 '+
'where (sc1.colID=sf.rkey and sf.rkeyid=sc1.ID) and '+
'(sc2.colID=sf.fkey and sf.fkeyid=sc2.ID) '+#13#10;
//fil other list table triggers, functions and etc
SQLScript := SQLScript + 'insert into OtherList'+AddStr+' (Name, Type, Text, ColId) '+
'select so.name, so.type, scm.text, scm.colid from ['+srvName+'].'+dbName+'..sysobjects so inner join '+
'syscomments scm on so.id=scm.id and so.xtype in (''p'', ''fn'', ''if'', ''tf'', ''v'', ''tr'') '+
'and so.category <> 2 '+
'group by so.name, scm.colid, so.type, scm.text '+#13#10;
SQLScript := SQLScript + 'insert into SecList'+AddStr+' (Name, DepName, Type, DepType, DepNumber) '+
'select object_name(sd.id) as Name, object_name(sd.depid) as DepName, so.type, '+
'(select so2.type from ['+srvName+'].'+dbName+'..sysobjects so2 where so2.id=sd.depid) as DepType, '+
'sd.depnumber '+
'from ['+srvName+'].'+dbName+'..sysobjects so inner join '+
'sysdepends sd on so.id=sd.id and so.xtype in (''p'', ''fn'', ''if'', ''tf'', ''v'', ''tr'') '+
'and so.category <> 2 '+#13#10;
SQLScript := SQLScript + 'insert into SecList'+AddStr+' (Name, DepName, Type, DepType, DepNumber) '+
'select object_name(id), '''', so.type, ''u'', 0 '+
'from ['+srvName+'].'+dbName+'..sysobjects so '+
'where (not exists(select * from ['+srvName+'].'+dbName+'..sysdepends sd where sd.id=so.id or sd.depid=so.id)) '+
'and so.xtype in (''p'', ''fn'', ''if'', ''tf'', ''v'', ''tr'') '+
'and so.category <> 2 '+ #13#10;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQLScript);
Query.ExecSQL;
Query.Close;
فقط شرمنده با دلفی بود (البته ساختارش باید برات ساده و قابل فهم باشه) و بقیه تیکه ها رو ارسال نکردم، فقط بخش اطلاعات درونی سیستم که اونهم بصورت کامل ارایه شده. بقیش با خودت.
امیدوارم بدردت بخوره.