نمایش نتایج 1 تا 8 از 8

نام تاپیک: چک کردن ساختار دو دیتا بیس

  1. #1

    Question چک کردن ساختار دو دیتا بیس

    سلام
    چطوری میشه از طریق برنامه نویسی دو دیتا بیس رو از نظر ساختار با همدیگه مقایسه کرد ؟
    منظورم اینه که چطوری میشه فهمید که تعداد جداول و نام جداول و روابط جداول و تعداد فیلدها و نوع فیلدها و نام فیلدهای دو دیتا بیس یکی هست ؟
    در کل از هر لحاظ به غیر از داده هاشون با هم برابر باشه .
    ممنون .

  2. #2
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    تهران
    پست
    558
    سلام
    با استفاده از Data Dictionary.

  3. #3
    میشه کمی بیشتر توضیح بدید .
    ممنون .

  4. #4
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    تهران
    پست
    558
    سلام
    من یه برنامه حدود 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 : پنج شنبه 28 اردیبهشت 1385 در 12:09 عصر

  5. #5
    ممنون . روش کار می کنم .

  6. #6
    کاربر دائمی آواتار sm
    تاریخ عضویت
    اردیبهشت 1383
    محل زندگی
    ایساتیس
    پست
    1,389
    نقل قول نوشته شده توسط majid_afra222
    سلام
    من یه برنامه حدود 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;


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

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

  7. #7
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    تهران
    پست
    558
    سلام 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 ';


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

  8. #8
    سلام
    میدونید من کاری که کردم این بود که یک کانکش استرینگ با دیتا بیس اصلی ، یعنی اونی که خودم دارم رو ساختم و بعد هر وقت که می خواستم اونو پر کنم ، اگه error میداد یعنی دیتابیس اشتباه انتخاب شده در غیر اینصورت درسته .
    البته این ساده ترین راه بود که بنظرم رسید و چون خیلی عجله داشتم همین راه رو انجام دادم . شاید در آینده بتونیم راههای بهتری پیدا کنیم .
    البته این مساله خیلی مهمه ، خصوصا برای ما برنامه نویس ها که تا جای ممکن جلوی خطاهای کاربران رو بگیریم و یکی از خطا ها همین انتخاب دیتا بیس اشتباه هست . چون من توی برنامه ای که داشتم ، امکان پشتیبان گیری از دیتا بیس رو گذاشته بودم که این رو راحت انجام میدادم ولی موقع بازیابی دیتابیس ، این کاربر هست که باید محل و نام فایل پشتیبان رو انتخاب کنه و اگه اشتباه باشه ، مشکل پیش میاد .
    انشا... با کمک هم به نتیجه قطعی و کامل برسیم .

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •