客戶帳號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.建立同名時,同名對應的數據庫對象已經被刪除掉了(這種狀況頗有意思)。