سؤال

لقد قمت بإنشاء حزمة تحتوي على إجراء مخزن وأخطط لاستدعائه من تطبيق منفصل.سيقوم الإجراء المخزن بإرجاع قائمة مرتبة بجميع طرق العرض والجداول في المخطط.للقيام بذلك، يقوم بإجراء تحديد بسيط على مرادفات DBA_TABLES وDBA_VIEWS، كما هو موضح أدناه:

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

لقد تحققت من وجود المرادفات المعنية، وأنها عامة:

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

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

الآن ها هي مشكلتي:يمكنني فتح ورقة عمل في Oracle SQL Developer والاختيار من هذه الجداول جيدًا.أحصل على بيانات ذات معنى على ما يرام (567 صفًا، في واقع الأمر).ولكن عندما أحاول تنفيذ الإجراء المخزن، تشكو أوراكل من حدوث خطأ في الترجمة، كما هو موضح أدناه:

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

عندما أنقر نقرًا مزدوجًا فوق رسالة الخطأ الثانية هذه، يأخذني مطور SQL إلى عبارة FROM الأولى ("FROM DBA_TABLES").

لذلك أنا في حيرة من أمري إلى حد ما.أعرف SQL Server جيدًا، وأنا جديد على Oracle، لذا يرجى التحمل معي.إذا كان بإمكانك تقديم بعض الأدلة، أو توجيهي في الاتجاه الصحيح، سأكون ممتنًا لذلك حقًا.

شكرا لك مقدما!

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

المحلول

استخدم ALL_TABLES وALL_VIEWS بدلا من DBA_TABLES وDBA_VIEWS. وينبغي أن يكون ALL_ وجهات النظر٪ في متناول جميع المستخدمين.

نصائح أخرى

إذا قمت بتحديد من جدول أو طريقة عرض في تخزين PL / SQL-إجراء أو تخزينها PL / SQL وظيفة تحتاج إلى منحة مباشرة. منحة من خلال دور قاعدة البيانات ليست كافية.

وربما كنت في حاجة إلى منحة مباشرة على وجهة نظر dba_tables. (العامة) المرادفات ليست سوى مرادفات (العامة). تحتاج إلى منح مباشرة الحقوق مختارة.

وانظر هنا: <لأ href = "http://asktom.oracle.com/pls/asktom/f؟p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807" يختلط = "نوفولو noreferrer" > http://asktom.oracle.com/pls/asktom/f؟p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

يحرر: عذرًا، لقد تجاهلت الجزء الذي يبدو أنك تقول فيه أنه يمكنك الاختيار من DBA_TABLES مباشرةً.على الأرجح تكمن المشكلة في أن الامتيازات الخاصة بك يتم منحها من خلال الدور الذي يجيب عليه شخص آخر.ولكن لا يزال من المفيد توضيح أن فهمك للمرادفات العامة غير مكتمل، وأن استخدام ALL_TABLES سيكون أفضل إذا كان يحقق ما تحتاجه.

كون المرادف PUBLIC يعني فقط أنه يمكن لجميع المستخدمين الرجوع إلى المرادف؛ولا يمنحهم أي وصول إلى الكائن الذي يشير إليه المرادف.

ما ستفعله لحل هذا الخطأ بشكل مباشر هو منح امتياز SELECT في طرق عرض SYS للمستخدم (المستخدمين) الذي سيقوم بتشغيل هذا الإجراء.ومع ذلك، أعتقد أن هذا هو فكرة سيئة للغاية.

كما اقترح رايموندز، فكر فيما إذا كان بإمكانك الحصول على ما تحتاجه من USER_TABLES أو ALL_TABLES بدلاً من ذلك.ما هو المستخدم الذي يستدعي هذا الإجراء، وما هو الوصول الذي يتمتع به هذا المستخدم إلى جداول SONAR5؟

بشكل عام، إذا كان تطبيقك مهتمًا بجدول، فمن المفترض أنه يحتوي على بعض الامتيازات، وفي هذه الحالة يجب إدراجه في ALL_TABLES.

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