Oracle-11g-R2
使用另一個使用者部署帶有數據庫連結的物化視圖
我們的數據庫部署過程以 sys 身份登錄以部署數據庫對象。當我們想為另一個使用者 (AU) 部署私有數據庫連結時遇到了問題。我們的解決方案是:
- 創建一個由 AU 擁有的過程,該過程使用立即執行來創建連結
- 執行程序
- 放下程序。
這很好用!不幸的是,當我們嘗試編寫使用其私有數據庫連結的 AU 擁有的物化視圖的創建腳本時,它不起作用。它似乎使用登錄使用者(sys)而不是擁有連結(AU)的使用者連接到遠端數據庫,因此失敗:
ORA-04052: error occurred when looking up remote object AU.Table_Name@Private_Link_Name ORA-00604: error occurred at recursive SQL level 2 ORA-01017: invalid username/password; login denied ORA-02063: preceding line from Private_Link_Name ORA-06512: at "AU.temporary_procedure", line 3 ORA-06512: at line 1
由 AU 直接完成時,物化視圖創建良好。程序如下所示:
create procedure AU."tmp_doit_20180509" is Begin execute immediate 'create materialized view m1 as select 1 from dual@private_link_name'; End; /
數據庫連結沒有定義憑據,因此它使用連接使用者的憑據。當以 AU 身份登錄時,這些在數據庫之間是相同的,但對於 sys,它們是不同的。
以下是我考慮過的一些替代方案:
- 以每個需要使用數據庫連結創建物化視圖的使用者身份手動登錄 - 這會破壞我們的自動化部署過程。
- 使用 dbms_scheduler 作業來創建 mview - 這也不起作用,並且與過程方法類似,因為作業在創建它的使用者的上下文中執行,即使它在另一個模式中也是如此。
- 儲存使用者憑據並以每個特定使用者身份登錄以進行部署 - 取決於這是如何完成的,似乎建構起來很複雜以使其安全或維護起來很複雜,也許兩者兼而有之。
- 以代理使用者身份連接 - 給出相同的錯誤。
這是我現在使用的解決方案。我不喜歡它,但在我找到更好的東西之前,這是我能做的最好的。
- 在部署開始時,會創建一個帶有命名憑據的公共數據庫連結,該連結使用與私有數據庫連結將使用的名稱相同的名稱。
- 物化視圖的創建和工作是因為它使用帶有嵌入式憑據的公共連結。
- 創建一個由“另一個使用者”(AU)擁有的過程,該過程使用立即執行來創建私有數據庫連結。
- 執行該過程以創建私有數據庫連結。
- 該過程被丟棄。
- 公共數據庫連結被刪除。
不幸的是,這需要在任何使用連結創建物化視圖的部署之前和之後交換公共和私有數據庫連結的存在。臨時創建帶有嵌入式憑據的公共數據庫連結也是一種安全風險,實際上是我們正在努力解決的問題。
代理使用者。使用該功能。忘記SYS。
create user app1 identified by app1; create user app2 identified by app2; create user app3 identified by app3; create user deploy_user identified by deploy_user; grant create session to app1, app2, app3, deploy_user; alter user app1 grant connect through deploy_user; alter user app2 grant connect through deploy_user; alter user app3 grant connect through deploy_user; connect deploy_user[app1]/deploy_user SQL> show user USER is "APP1" .. run scripts .. connect deploy_user[app2]/deploy_user SQL> show user USER is "APP2" .. run scripts .. connect deploy_user[app3]/deploy_user SQL> show user USER is "APP3" .. run scripts ..