PDA

View Full Version : چک کردن ساختار دو دیتا بیس



Mehrafrooz
سه شنبه 26 اردیبهشت 1385, 19:42 عصر
سلام
چطوری میشه از طریق برنامه نویسی دو دیتا بیس رو از نظر ساختار با همدیگه مقایسه کرد ؟
منظورم اینه که چطوری میشه فهمید که تعداد جداول و نام جداول و روابط جداول و تعداد فیلدها و نوع فیلدها و نام فیلدهای دو دیتا بیس یکی هست ؟
در کل از هر لحاظ به غیر از داده هاشون با هم برابر باشه .
ممنون .

majid_afra222
چهارشنبه 27 اردیبهشت 1385, 18:10 عصر
سلام
با استفاده از Data Dictionary.

Mehrafrooz
پنج شنبه 28 اردیبهشت 1385, 07:52 صبح
میشه کمی بیشتر توضیح بدید .
ممنون .

majid_afra222
پنج شنبه 28 اردیبهشت 1385, 12:06 عصر
سلام
من یه برنامه حدود 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;


فقط شرمنده با دلفی بود (البته ساختارش باید برات ساده و قابل فهم باشه) و بقیه تیکه ها رو ارسال نکردم، فقط بخش اطلاعات درونی سیستم که اونهم بصورت کامل ارایه شده. بقیش با خودت.

امیدوارم بدردت بخوره.

Mehrafrooz
پنج شنبه 28 اردیبهشت 1385, 15:22 عصر
ممنون . روش کار می کنم .

sm
پنج شنبه 15 تیر 1385, 16:46 عصر
سلام
من یه برنامه حدود 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;


فقط شرمنده با دلفی بود (البته ساختارش باید برات ساده و قابل فهم باشه) و بقیه تیکه ها رو ارسال نکردم، فقط بخش اطلاعات درونی سیستم که اونهم بصورت کامل ارایه شده. بقیش با خودت.

امیدوارم بدردت بخوره.

از دوستان کسی تونسته اینو به دات نت تبدیل کنه
کسی معادل اینو توی دات نت داره؟
نهایتا اگه کسی با دلفی آشنا هست میشه که توضیح بده از چه چیزهایی باید استفاده کرد و هرقسمت چیکار میکنه؟
ممنون

majid_afra222
پنج شنبه 15 تیر 1385, 18:35 عصر
سلام sm عزیز
لازم نیست چیزی رو تبدیل کنی، فقط اسکریپتهای Insert مهمه که یه جدول بساز با ساختار لیست ستونهای بازگشتی دستورات insert ها و با نامهای نوشته شده در اون، بعد اونها رو اجرا کن.
یعنی اینجوری


strSQL = '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 ';


بعد اجراش کن.
من اینهارو یه تیکه نوشتم تا یک دفعه اجرابشه و تمام.

Mehrafrooz
پنج شنبه 15 تیر 1385, 20:08 عصر
سلام
میدونید من کاری که کردم این بود که یک کانکش استرینگ با دیتا بیس اصلی ، یعنی اونی که خودم دارم رو ساختم و بعد هر وقت که می خواستم اونو پر کنم ، اگه error میداد یعنی دیتابیس اشتباه انتخاب شده در غیر اینصورت درسته .
البته این ساده ترین راه بود که بنظرم رسید و چون خیلی عجله داشتم همین راه رو انجام دادم . شاید در آینده بتونیم راههای بهتری پیدا کنیم .
البته این مساله خیلی مهمه ، خصوصا برای ما برنامه نویس ها که تا جای ممکن جلوی خطاهای کاربران رو بگیریم و یکی از خطا ها همین انتخاب دیتا بیس اشتباه هست . چون من توی برنامه ای که داشتم ، امکان پشتیبان گیری از دیتا بیس رو گذاشته بودم که این رو راحت انجام میدادم ولی موقع بازیابی دیتابیس ، این کاربر هست که باید محل و نام فایل پشتیبان رو انتخاب کنه و اگه اشتباه باشه ، مشکل پیش میاد .
انشا... با کمک هم به نتیجه قطعی و کامل برسیم .