SQL ، كيفية تغيير العمود في جدول SQL دون كسر التبعيات الأخرى؟

StackOverflow https://stackoverflow.com/questions/3084120

سؤال

أنا متأكد من أن هذا قد يكون استعلامًا شائعًا جدًا ولكن لم أتمكن من العثور على إجابة جيدة حتى الآن.

هذا هو سؤالي:

لدي طاولة اسمها جهات الاتصال مع عمود Varchar عنوان. الآن في منتصف التطوير أريد استبدال الحقل عنوان مع titleid وهو المفتاح الخارجي ل contacttiTles الطاولة. على طاولة لحظة جهات الاتصال لديه أكثر من 60 تبعية (جداول أخرى ، وظائف طرق العرض).

كيف يمكنني أن أفعل ذلك أكثر طريقة أمان وأسهل؟

نستخدم: MSSQL 2005 ، تم بالفعل ترحيل البيانات ، فقط تريد تغيير المخطط.

يحرر:

شكرا للجميع على إعادة التشغيل السريع.

كما ذكر جهات الاتصال يحتوي الجدول على أكثر من 60 من المعالين ، ولكن عند تشغيل الاستعلام التالي ، يستخدم 5 منهم فقط عنوان عمودي. تم تشغيل البرنامج النصي للترحيل ، لذلك لا توجد تغييرات في البيانات المطلوبة.

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

ثم مررت بهذه المشاهدات الخمسة وقمت بتحديثها يدويًا.

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

المحلول

بالنسبة إلى Microsoft SQL Server Redgate ، يوجد منتج (ليس مجانيًا) http://www.red-gate.com/products/sql_refactor/index.htm

في الماضي تمكنت من القيام بذلك بسهولة تامة (إذا كانت بدائية) بمجرد الحصول على قائمة بالأشياء للمراجعة

SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(وربما أخذ معلومات التبعيات في الاعتبار والتصفية حسب نوع الكائن)

البرمجة النصية لجميع تلك التي تهم استوديو الإدارة ، ثم ببساطة تنزه في القائمة ومراجعتها جميعًا وتغيير التصميم للتغيير. يجب أن يكون تغييرًا بسيطًا ومتكررًا حتى بالنسبة لـ 60 تبعية ممكنة. بالإضافة إلى ذلك ، إذا كنت تشير إلى عمود غير موجود ، فيجب أن تحصل على رسالة خطأ عند تشغيل البرنامج النصي لتغييره.

كما ترى * في استفساراتك أو adhoc SQL في تطبيقاتك ، من الواضح أن الأمور قد تكون أكثر صعوبة.

نصائح أخرى

يستخدم إعادة بناء التعليمات البرمجية طُرق. ابدأ بإنشاء مجال جديد يسمى TitleID, ، ثم انسخ جميع العناوين إلى ContactTitles الطاولة. ثم ، واحد تلو الآخر ، قم بتحديث كل من التبعيات لاستخدام حقل TitleId. فقط تأكد من أنك لا تزال تحصل على نظام عمل بعد كل خطوة.

إذا كانت البيانات ستتغير ، فسيتعين عليك توخي الحذر والتأكد من أن أي تغييرات على Title العمود أيضا تغيير ContactTitles الطاولة. سيكون عليك فقط الاحتفاظ بها متزامنة أثناء قيامك بإعادة إنشاء.

يحرر: هناك حتى كتاب عن ذلك! إعادة إنشاء قواعد البيانات.

كما أشار آخرون إلى ذلك يعتمد على RDBMS.

هناك نهجان:

  • قم بإجراء تغيير على الطاولة وإصلاح جميع التبعيات
  • قم بعمل عرض يمكنك استخدامه بدلاً من الوصول المباشر إلى الجدول (يمكن أن يحرسك هذا من التغييرات المستقبلية في الجدول (الجدول الأساسي) الأساسي ، ولكن قد تفقد بعض وظائف التحديث ، اعتمادًا على DBMs)

استخدم sp_depend "اسم الجدول" للتحقق من تبعيات الجدول ثم استخدم sp_rename لإعادة تسمية اسم العمود المفيد للغاية. تقوم SP_RENAME تلقائيًا بإعادة تسمية الفهرس المرتبط به كلما تم إعادة تسمية مفتاح أساسي أو قيود فريدة. إذا تم ربط الفهرس المعاد تسميته بقيود المفتاح الأساسي ، يتم إعادة تسمية القيد المفتاح الأساسي تلقائيًا بواسطة SP_RENAME.

ثم ابدأ في تحديث الإجراء والوظائف الواحدة تلو الأخرى ، لا يوجد خيار جيد آخر للتغيير مثل هذا إذا وجدت ثم أخبرني أيضًا.

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