SQL 2005 SMO - البحث عن الجدول الرجعي
-
12-09-2019 - |
سؤال
أحتاج إلى تغيير بعض المفاتيح الأولية من غير متفاوت المسافات إلى المسافات ولكن لا يمكنني إسقاط القيد لأنه يشير إلى مفاتيح أجنبية أخرى.
كيف يمكنني العثور على الجداول التي تشير إلى مفتاح أساسي في الجدول الأصل كجزء من علاقة أجنبية دون حلقات من خلال جميع الجداول في DB؟ أحتاج إلى تعطيل القيود على هؤلاء، تغيير PK وإعادة تمكين.
تحديث:
لا أريد استخدام SQL عادي للقيام بذلك ولكن SMO فقط.
مارك، أنا أعرف عن شركتية من قبل أن أحتاج إلى شيء مثل: 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 );
}
}**
**