2010-05-24 67 views
3

我在一個相當新的項目中,我們仍在修改Oracle 11g數據庫表的設計。因此,我們經常刪除並重新創建表,以確保我們的表創建腳本在我們進行更改時按預期工作。如何使一個GRANT持久存儲被刪除並重新創建的表?

我們的數據庫由2個模式組成。一個模式具有一些表格,其中INSERT觸發器會導致數據有時被複制到我們的第二個模式中的表中。這要求我們使用管理員帳戶(例如sysdbaGRANT)訪問第一個模式的數據庫登錄到第二個模式的必要表,例如,

GRANT ALL ON schema_two.SomeTable TO schema_one; 

我們的問題是,每次我們作出改變到我們的數據庫設計,並希望刪除並重新創建數據庫表,我們GRANT -ed到schema_one走了,當表被刪除的訪問。因此,這又產生了另一個煩人的步驟,其中我們必須使用管理員帳戶登錄,以在每次刪除和重新創建這些表中的一個時重新訪問該訪問權GRANT

這不是一個大問題,但我很想從我們的開發和測試程序中消除儘可能多的步驟。有沒有辦法以GRANT訪問表的方式使得GRANT -ed權限在表被刪除並重新創建之後存活?如果這不可能,那麼是否有更好的方法來解決這個問題?

回答

3

你可以授予select any table,insert any table等schema_one,但這似乎是矯枉過正,並不會反映你在生產(希望)做什麼。爲什麼不能在創建表的同時發佈授權,而以schema_two身份登錄?我一直在創建腳本中這樣做,並且只能使用管理員帳戶授予第三方或系統權限。我懷疑我錯過了一些東西...

+1

是的 - 對我們來說,這是表格創建腳本的一部分。我還必須錯過問題描述中的某些內容。 – DaveE 2010-05-24 22:31:34

+0

謝謝;我實際上不知道「SELECT ANY TABLE」特權;我知道沒有''GRANT ALL ON schema_one。*''等同於我沒有意識到我可以給這樣的模式權限。 – 2010-05-25 14:04:13

+1

雖然這可能不是你想要製作的東西,或者應該假設你會被允許擁有,除非你擁有該env。我不確定爲什麼你不能在創建表的同一個腳本中進行授權; schema_two應該能夠將自己的對象的權限授予任何人,並且當您進行生產安裝時,它也會爲您節省一個步驟。有沒有理由不能這樣做? – 2010-05-25 14:15:06

3

你在做什麼不能被ALTER TABLE語句處理?

下一個最好的選擇可能是創建一個視圖,該視圖引用了occaisionally消失的表 - 視圖不會消失,如果在這種情況下表不存在,則會出現錯誤。 IE:

CREATE VIEW table_vw AS 
    SELECT t.* 
    FROM DISAPPEARING_TABLE t 

使用*表示法也意味着您不必不斷更新視圖以顯示錶中的列。

+2

IIRC:如果將列添加到基礎表中,SELECT *將無法幫助 - Oracle將*轉換爲創建點處的列列表 - 將其他列添加到基礎表中隨後不會將其添加到視圖和刪除列使視圖無效 – 2010-05-24 22:39:25

+0

簡單地執行ALTER TABLE語句的問題是我們想重新測試我們的表創建腳本以及最初使用數據填充新創建的表的腳本。理想情況下,我們希望每當我們做出更改以儘早檢測破損時就進行測試。這就是爲什麼我們想要刪除並重新創建我們的表格。 – 2010-05-24 23:12:21

1

您可能有一個DDL觸發器或每幾分鐘運行一次的批處理作業,它會自動授予權限。但這是一個安全漏洞,不會代表產量。

6

所以撥款被撤銷的原因是新表是一個不同的對象。

SQL> select object_id from user_objects 
    2 where object_name = 'T72' 
    3/

OBJECT_ID 
---------- 
    659195 

SQL> drop table t72 
    2/

Table dropped. 

SQL> create table t72 (id number) 
    2/

Table created. 

SQL> select object_id from user_objects 
    2 where object_name = 'T72' 
    3/

OBJECT_ID 
---------- 
    659212 

SQL> 

授權在對象上,而不是對象的名稱。

我不明白你的問題是這樣的:你有一個過程,在schema_two下降並重新創建表格。爲什麼這個過程還沒有授予這些表的授予權限schema_one?爲什麼你有一個管理員帳戶,而不是?我假設你連接爲schema_two來運行DROP和CREATE語句。爲什麼不把GRANT語句添加到該步驟?

因爲授予對象的特權與創建表一樣重要。所以你應該有一個可以做所有事情的過程。

1

我建議你可以給你用來創建表的帳戶提供運行授權的能力。

分享和享受。

相關問題