ORA-00980: 同義詞轉換再也不有效

客戶帳號TB在操做軟件時,報錯:「[Microsoft][ODBC driver for Oracle][Oracle]ORA-00980: 同義詞轉換再也不有效」。數據庫

 

使用擁有dba權限的帳號sys的登陸,進行相同的操做沒有報錯正常運行。安全

 

-------執行查找全部失效的同義詞,生成刪除腳本以下:spa

select 'drop 'code

 

       || decode(s.owner,對象

 

                 'PUBLIC',table

 

                 'public synonym ',登錄

 

                 'synonym ' || s.owner || '.')軟件

 

       || s.synonym_nameobject

 

       || ';' as "Dropping invalid synonyms:"select

 

  from dba_synonyms s

 

 where table_owner not in ('SYSTEM', 'SYS')

 

   and db_link is null

 

   and not exists

 

 (select null

 

          from dba_objects o

 

         where s.table_owner = o.owner

 

           and s.table_name = o.object_name);

發現其中對應的存儲過程zl_人員表_INSERT的同義詞失效,處理辦法刪除重建:

SQL>Drop public synonym zl_人員表_INSERT;

SQL>Create public synonym zl_人員表_INSERT for zlhis.zl_人員表_INSERT;

 

----PS:查詢當前用戶下,沒有建立同義詞的對象有哪些?

Select *

 

  from dba_objects s

 

 where owner in ('ZLHIS') And object_type In('TABLE','PROCEDURE','FUNCTIONS')

 

   and Not exists

 

 (select null

 

          from dba_synonyms o

 

         Where o.table_owner = s.owner

 

           and o.table_name = s.object_name And o.db_link is null)

 

藉此引出了幾個思考:

1、什麼是同義詞?爲何要建立同義詞?同義詞失效的影響?

2、哪些對象能夠建立同義詞?

3、同義詞的操做? 

 

1同義詞定義:Oracle的同義詞(synonyms)從字面上理解就是別名的意思,和視圖的功能相似,就是一種映射關係

經常使用於簡化對象訪問和提升對象訪問的安全性。

同義詞並不佔用實際存儲空間,只有在數據字典中保存了同義詞的定義。

 

爲何要建立?

簡單的說就是,爲了直接使用特定用戶(例如:用戶ZS的表"人員表")的某個數據庫對象!!!

ZS用戶將表"人員表"的權限授予給用戶LS,在沒有建立公共同義詞的前提下,LS用戶登錄後要使用該表,須要在表名字前加"ZS.表名".

 

例如:

查詢:SQL>select * from ZS.人員表;

爲表建立公共同義詞: SQL>create public synonym 人員表 for ZS.人員表;

建立表後能夠直接訪問SQL>select * from 人員表

 

2、在Oracle數據庫中的大部分數據庫對象,如表、視圖、同義詞、序列、存儲過程、包等等,數據庫管理員均可以根據實際狀況爲他們定義同義詞。 

 

三、建立、刪除、查詢操做

(1).建立同義詞語句:

create public synonym table_name for user.table_name;

(2).刪除同義詞:

drop public synonym table_name;

(3).3.查看全部同義詞:

select * from dba_synonyms

 

致使「ORA-00980」錯誤的緣由小結:

1.刪除了數據庫對象,可是忘記刪除同名;

2.刪除一個用戶,可是忘記刪除與此用戶中相關的同名;

3.建立同名時,同名對應的數據庫對象已經被刪除掉了(這種狀況頗有意思)。

相關文章
相關標籤/搜索