سؤال

أحتاج إلى تغيير بعض المفاتيح الأولية من غير متفاوت المسافات إلى المسافات ولكن لا يمكنني إسقاط القيد لأنه يشير إلى مفاتيح أجنبية أخرى.

كيف يمكنني العثور على الجداول التي تشير إلى مفتاح أساسي في الجدول الأصل كجزء من علاقة أجنبية دون حلقات من خلال جميع الجداول في DB؟ أحتاج إلى تعطيل القيود على هؤلاء، تغيير PK وإعادة تمكين.

تحديث:

  1. لا أريد استخدام SQL عادي للقيام بذلك ولكن SMO فقط.

  2. مارك، أنا أعرف عن شركتية من قبل أن أحتاج إلى شيء مثل: table.primarykey.forykeys (أي ما هي الجداول التي تشير إلى المفتاح الأساسي للطاولات الخاص بي) أريد فقط تجنب حلقات من خلال جميع الجداول في قاعدة البيانات وتحقق من خاصية Aideekeys على كل منها وكل واحد منهم لمعرفة ما إذا كان أي منهم يشير إلى طاولتي. (غير قابلة للتطوير)

هل كانت مفيدة؟

المحلول

حسنا، أعتقد أنني وجدت ذلك.

table.Columns[0].EnumForeignKeys()

أو مباشرة

table.enumforeignkeys ()

كنت أتوقع عقار بدلا من وظيفة. أنا متأكد تماما وراء الكواليس التي يقوم بها ما اقترحه CMSJR.

نصائح أخرى

باستخدام SMO، يمكنك القيام بذلك:

using Microsoft.SqlServer.Management.Smo;

Server localServer = new Server("your server name");
Database dasecoDB = localServer.Databases["your database name"];

Table table = dasecoDB.Tables["your table name"];
foreach(ForeignKey fk in table.ForeignKeys)
{
  Console.WriteLine("Foreign key {0} references table {1} and key {2}", fk.Name, fk.ReferencedTable, fk.ReferencedKey);
}

مارك

يجب أن يعمل هذا الاستعلام، ويمكن تنفيذه باستخدام قاعدة البيانات. executewithresults

Select fk.Table_Name from 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
      ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
    INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
where PK.Table_Name = 'SomeTable'

على سبيل المثال

SqlConnection sqlConnection =
new SqlConnection(@"Integrated Security=SSPI; Data Source=SomeInstance");
Server server = new Server(serverConnection);
Database db = server.Databases["somedatabase"];
DataSet ds = db.ExecuteWithResults(thesqlabove);

يمكنك استخدام INFORMATION_SCHEMA الآراء.

INFORMATION_SCHEMA.TABLE_CONSTRAINTS سوف تعطيك أسماء المفاتيح الأساسية على هذا الجدول.

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @TableName

بالنظر إلى الأسماء الرئيسية الأساسية التي يمكنك الحصول على قيود المرجعية التي تستخدم هذه المفاتيح من INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

ثم أسماء الجدول عن طريق الاستعلام INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

ليس SMO على هذا النحو، ولكن بالنظر إلى ما سبق، يجب أن تكون قادرا على وضع استعلام سيسرع القيود التي تحتاجها لتعطيلها.

لا يعمل بالنسبة لي.

النظر في العلاقات التالية:

الجدول 1 -> الجدول الرئيسي؛ الجدول 2 -> طاولة الرقيق؛

table2.table1_id هو مفتاح أجنبي من الجدول 1

table1.enumforeignkeys () إرجاع null.

بدلا من ذلك حاولت مع النجاح كائن decorencywalker. تدرج التعليمات البرمجية التالية جميع الجداول التي تربط من مجموعة معينة من الجداول.

            DependencyWalker w = new DependencyWalker(db.Parent);
            DependencyTree tree = w.DiscoverDependencies(urns,false);
            DependencyCollection depends = w.WalkDependencies(tree);

            foreach (DependencyCollectionNode dcn in depends)
            {
                if (dcn.Urn.Type == "Table")
                {
                    dcn.Urn.GetNameForType("Table");
                    Console.WriteLine(dcn.Urn.GetNameForType("Table"));
                }
            }

حيث "urns" هي مجموعة من الجدول. رن.

سوف تضطر إلى السفر من خلال شجرة التبعية. فيما يلي البرنامج النصي الذي يستخدم SMO لتوليد إنشاء جدول وإدراج البرنامج النصي.

**

**ServerConnection conn = new ServerConnection( GetConnection() );
            Server server = new Server( conn );
            Database db = server.Databases[ mDestinationDatabase ];
            // Create database script 
            StringBuilder dbScript = new StringBuilder();
            ScriptingOptions dbCreateOptions = new ScriptingOptions();
            dbCreateOptions.DriAll = true;
            dbCreateOptions.NoCollation = true;
            StringCollection coll = db.Script( dbCreateOptions );
            foreach( string str in coll )
            {
                dbScript.Append( str );
                dbScript.Append( Environment.NewLine );
            }
            sqlInsertCommands = dbScript.ToString();
            // Create dependency tree
            DependencyWalker w = new DependencyWalker(db.Parent);
            UrnCollection urnCollection = new UrnCollection();
            DataTable table = db.EnumObjects( DatabaseObjectTypes.Table );
            string tableName = string.Empty;
            foreach( DataRow row in table.Rows ) 
            {
                urnCollection.Add( new Urn( ( string )row[ "Urn" ] ) ); 
            }
            DependencyTree tree = w.DiscoverDependencies( urnCollection, true );
            DependencyCollection depends = w.WalkDependencies(tree); 
            // walk through the dependency tree and for each table generate create and insert scripts
            foreach (DependencyCollectionNode dcn in depends)
            {
                if (dcn.Urn.Type == "Table")
                {
                    tableName = dcn.Urn.GetNameForType( "Table" );
                     DataTable dataTableWithData = GetTableWithData( tableName);
                     ArrayList columnList = new ArrayList();
                    foreach(DataColumn  dataColumn in  dataTableWithData.Columns)
                    {
                        columnList.Add( dataColumn.ColumnName );
                    }
                    sqlInsertCommands = sqlInsertCommands + Environment.NewLine + Environment.NewLine
                        + GetCreateTableScript(tableName ) 
                        + Environment.NewLine + Environment.NewLine
                        + BuildInsertSQL( columnList, dataTableWithData, tableName );
                    }
            }**

**

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top