كيف بثمن بخس التحقق من وجود عمود في الجدول في آخر مخطط مع الرسول ؟

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

سؤال

بيئة أوراكل 9 و 10.ليس لدي ديسيبل مستوى الوصول.

المشكلة هو التحقق من أن محدد العمود موجود في جدول معين في المخطط.

هناك نوعان من الحالات للتعامل معها.

  1. آخر مخطط في نفس المثال
  2. مخطط في مختلف سبيل المثال ، استخدام db_link

نظرا مخطط فريد آخر مخطط بارني حاولت شيئا من هذا القبيل

SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'

والتي أسفرت [1]:(خطأ):ORA-00942:الجدول أو طريقة العرض غير موجود

بعد مسترخ على هذه لحظة أدركت أن USER_TAB_COLS, ليس حقا الجدول.فمن وجهة نظر.لقد تم اختيار من الجداول كل جانب ، ولكن ليس من وجهة نظر.

حاولت نفس الشيء مع db_link ، وفوجئت لرؤية البيانات أعود.أ db_link وقد جزءا لا يتجزأ من كيفية السر في ذلك ، لذلك فإنه يبدو من المعقول بالنسبة لي أن عملت, كما أنه فعال في سجلات الأخرى مخطط, التي ينبغي أن تجعل آراء قابلة للوصول.

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

ما هي الأساليب المتاحة للحصول على الجدول المستخدم الفوقية من مخطط في نفس المثيل من أجل التحقق من أن محدد العمود موجود ؟

شكرا مقدما.

الشر.

+1 على إجابات جيدة.شكرا لك.

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

المحلول

كما هو الحال مع ردود أخرى ، عادة استخدام ALL_TAB_COLUMNS استعلام مثل هذا.ولكن فقط التي سوف تظهر الأعمدة في الجداول حيث يجب تحديد.وأنه حدد على هذا العمود-في حال من غير المحتمل أنها قد نفذت على مستوى العمود امتيازات هذا الجدول, كنت قد تكون قادرة على انظر الجدول ، ولكن لا نرى محددة عمود من الفائدة.بالنسبة لمعظمنا, هذا نادر للغاية.

DBA_TAB_COLUMNS سوف تظهر جميع الأعمدة ، ولكن عليك اختيار على منح مخطط من قبل DBA الخاصة بك.(في الواقع, سوف تحتاج منحة على ALL_TAB_COLUMNS استخدامه ، ولكن هذا الشائع في معظم المحلات التجارية).على DBMS_METADATA PL/SQL المضمنة في حزمة يمكن أن تستخدم أيضا مع قيود مماثلة ، ولكن أعتقد أنك سوف تجد أنه أكثر تعقيدا.

بالطبع يمكنك أيضا مجرد محاولة لتحديد سجل من barney.some_table.some_column@my_dblink (أو ما قطع من أن كنت ترغب في).ومن ثم التعامل مع الاستثناء.قبيحة, أنا لا أنصح بذلك في معظم الحالات.

نصائح أخرى

يمكنك استخدام الاستعلام التالي:

SELECT 1
FROM ALL_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
  AND OWNER = 'BARNEY';

(User_Tables و User_Tab_Cols هي مجرد آراء على all_tables و all_tab_coumns مع where owner = <Current User> تعلق على ذلك)

إذا كنت يسمح لك أن ترى بارني some_table (أيكنت قد منح على الأقل حدد امتيازات على ذلك) ، ثم عليك أن تعرف إذا كان العمود هناك.إذا كان لديك أي حقوق على الطاولة, أنت لن تكون قادرة على الحصول على المعلومات الوصفية على ذلك.

يمكنك استخدام all_tab_columns على ذلك.

ولكن حذار أن كنت سوف نرى فقط ما يسمح لك أن ترى.

نفس الحالة مختلفة المخطط:

Select Count(*)
From   all_tab_cols
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

عدد(*) لديه ميزة دائما إرجاع صف واحد مع قيمة إما 1 أو 0 ، لذلك لم يكن لديك للتعامل مع NO_DATA_FOUND أخطاء في PL/SQL.

عبر DB رابط نفس المخطط الذي كنت الاتصال:

Select Count(*)
From   user_tab_cols@MY_DB_LINK
Where  table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

عبر DB الرابط مختلفة المخطط من الاتصال مثل:

Select Count(*)
From   all_tab_cols@MY_DB_LINK
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top