كيفية تصحيح ORA-01775:حلقات سلسلة من المرادفات ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أنا على دراية مسألة وراء ORA-01775:حلقات سلسلة من المترادفات ، ولكن هل هناك أي خدعة التصحيح أو هل علي أن "إنشاء أو استبدال" طريقي للخروج من ذلك ؟

هل هناك طريقة الاستعلام عن المخطط أو مهما لمعرفة ما التعريف الحالي مرادف العام ؟

أكثر من رائع أن تكون أداة رسومية, لكن في هذه المرحلة أي شيء من شأنه أن يكون مفيدا.

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

المحلول

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

وأوراكل على ما يبدو أخطاء بها باعتبارها سلسلة حلقات في هذه الحالة.

نصائح أخرى

إذا كنت تستخدم العلجوم، انتقل إلى عرض> خيارات العلجوم> أوراكل> عام وإزالة TOAD_PLAN_TABLE من شرح قسم PLAN ووضع PLAN_TABLE

والجدول DBA_SYNONYMS قاموس البيانات لديها معلومات عن جميع المرادفات في قاعدة بيانات. حتى تتمكن من تشغيل الاستعلام

SELECT table_owner, table_name, db_link
  FROM dba_synonyms 
 WHERE owner        = 'PUBLIC'
   AND synonym_name = <<synonym name>>

لمعرفة ما يشير مرادف العام حاليا في.

والحل أقل بديهية لرمز الخطأ هذا ويبدو أن المشاكل مع الكائنات التي مرادف يشير إلى.

وهنا هو SQL بلدي لإيجاد المرادفات التي تشير إلى الأشياء الخاطئة.

SELECT S.OWNER as SYN_OWNER, S.SYNONYM_NAME as SYN_NAME,
    S.TABLE_OWNER as OBJ_OWNER, S.TABLE_NAME as OBJ_NAME,
    CASE WHEN O.OWNER is null THEN 'MISSING' ELSE O.STATUS END as OBJ_STATUS
FROM DBA_SYNONYMS S
    LEFT JOIN DBA_OBJECTS O ON S.TABLE_OWNER = O.OWNER AND S.TABLE_NAME = O.OBJECT_NAME
WHERE O.OWNER is null
    OR O.STATUS != 'VALID';

وهذه محاولة حدد لإيجاد مرادفات إشكالية، وهو يسرد جميع المرادفات التي يتم الإشارة إلى كائن غير موجود (الجداول وجهات النظر، وتسلسل، وحزم، والإجراءات، وظائف)

SELECT *
FROM dba_synonyms
WHERE table_owner = 'USER'
    AND (
        NOT EXISTS (
            SELECT *
            FROM dba_tables
            WHERE dba_synonyms.table_name = dba_tables.TABLE_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_views
            WHERE dba_synonyms.table_name = dba_views.VIEW_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_sequences
            WHERE dba_synonyms.table_name = dba_sequences.sequence_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_dependencies
            WHERE type IN (
                    'PACKAGE'
                    ,'PROCEDURE'
                    ,'FUNCTION'
                    )
                AND dba_synonyms.table_name = dba_dependencies.NAME
            )
        )

واليوم حصلت على هذا الخطأ، وبعد التصحيح فكنت أحسب أن الجداول الفعلية وmisssing، وهو ما كان يشير استخدام المرادفات. لذلك أقترح - تحقق أولا أن ما إذا كانت الجداول موجودة !! : -))

ومطور كتب عن طريق الخطأ التعليمات البرمجية التي ولدت وركض CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; بيان SQL التالية والتي تسببت select * from dba_synonyms where table_name = 'DUAL'; للعودة PUBLIC DUAL SOME_USER DUAL بدلا من PUBLIC DUAL SYS DUAL.

وكنا قادرين على اصلاحها (بفضل كيفية إعادة مرادف العام "DUAL" ؟ ) عن طريق تشغيل

ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=FALSE SCOPE=MEMORY;
CREATE OR REPLACE PUBLIC SYNONYM DUAL FOR SYS.DUAL;
ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=true SCOPE=MEMORY;

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

وكان لدينا نفس الخطأ ORA-01775 ولكن في حالتنا، المستخدم مخطط كان في عداد المفقودين بعض 'منحة اختر' على زوجين من مرادفات العامة.

والخطوة 1) انظر ما كائنات موجودة مع اسم:

select * from all_objects where object_name = upper('&object_name');

ويمكن أن يكون هذا مرادف موجود ولكن لا يوجد جدول؟


والخطوة 2) إذا كان هذا ليس هو المشكلة، والتحقيق في مرادف:

select * from all_synonyms where synonym_name = upper('&synonym_name');

ويمكن أن يكون ذلك في الجدول الأساسي أو عرض لأنه مرادف مفقود؟

واجهنا هذا الخطأ اليوم.هذا هو كيف يمكننا تصحيحه و ثابتة.

  1. حزمة ذهب إلى صالح الدولة بسبب هذا الخطأ ORA-01775.

  2. الخطأ رقم السطر , ذهبنا من خلال package قانون هيئة وجدت الرمز الذي كان يحاول ادخال البيانات في table.

  3. ركضنا تحت استفسارات للتحقق إذا كان أعلاه table و synonym موجود.

    SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME';  -- No rows returned
    
    SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
    
  4. مع هذا استنتجنا أن الجدول يجب أن تكون إعادة إنشاء.كما synonym كان يشير إلى table التي لم تكن موجودة.

  5. DBA فريق إعادة إنشاء الجدول و هذا ثابت في هذه المسألة.

وORA-01775: حلقات سلسلة من المرادفات أنا واجهت الخطأ أعلاه في حين كنت أحاول تجميع حزمة الذي تم باستخدام الكائن الذي تم إنشاء مرادف لكن الكامنة كان الكائن غير متوفر.

وأنا باستخدام SQL التالية للعثور على إدخالات في all_synonyms حيث لا يوجد كائن المقابلة للOBJECT_NAME (في user_objects):

 select * 
   from all_synonyms 
   where table_owner = 'SCOTT' 
     and synonym_name not like '%/%'
     and table_name not in (
       select object_name from user_objects
         where object_type in (
           'TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE',
           'PROCEDURE', 'FUNCTION', 'TYPE'
         )
    );

وعلى الرغم الجواب السهل الممتنع هي فكرة جيدة، وأدرك مجموعة واسعة من المشاكل ذات الصلة، لقد وجدت هذا الاستعلام وجدت في المنتديات أوراكل لمعالجة أكثر مباشرة (ذكر في الأصل) المشكلة:

select owner, synonym_name, connect_by_iscycle CYCLE
from dba_synonyms
where connect_by_iscycle > 0
connect by nocycle prior table_name = synonym_name
and prior table_owner = owner
union
select 'PUBLIC', synonym_name, 1
from dba_synonyms
where owner = 'PUBLIC'
and table_name = synonym_name
and (table_name, table_owner) not in (select object_name, owner from dba_objects
where object_type != 'SYNONYM')

https://community.oracle.com/message/4176300#4176300

وسوف لا يكون لديك لويد من خلال أنواع أخرى من الكائنات غير صالحة. فقط تلك التي هي في الواقع في الحلقات التي لا نهاية لها.

http://ora-01775.ora-code.com/ يقترح:

على ORA-01775 : لحلقات سلسلة من المرادفات
السبب : من خلال سلسلة من عبارات CREATE مرادف، تم تعريف مرادف يشير إلى نفسه. على سبيل المثال، التعاريف التالية دائرية:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
العمل : تغيير تعريف مرادف واحد بحيث ينطبق على الجدول الأساسي أو عرض وإعادة العملية

.

إذا كنت تجميع الداخلي وربما هذا يشير إلى جدول أو الرأي القائل بأن لا وجود لها كما يتم إنشاؤه في نفس الإجراء. في هذه الحالة الحل هو جعل الاستعلام أعلن وسلسلة مثل v_query: = 'insert into table select * from table2 ومن ثم تنفيذ فوري على v_query؛

وذلك لأن المترجم لا تعترف حتى الان الكائن، وبالتالي لا تجد الإشارة. تحية طيبة.

وكان لي وظيفة محددة في مخطط الخطأ ودون مرادف العام. بمعنى آخر. كان لي بروك في مخطط "الكلاب"، وكانت وظيفة في مخطط "القطط". وقال إن وظيفة لا يكون مرادفا العام على ذلك للسماح الكلاب للوصول إلى وظيفة القطط ".

وبالنسبة لي، واسم الجدول ومرادف موجودتين لكن تحت أسماء مختلفة المالك. I إعادة إنشاء الجداول تحت اسم المالك أن يقابل اسم المالك في المترادفات.

ولقد استخدمت الاستفسارات المرسلة بواسطة @ Mahi_0707

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