2016-02-24 39 views
0

所以,我有一個表,例如:創建可寫別名在Oracle 11g中列

CREATE TABLE FOO (
    id INTEGER PRIMARY KEY, 
    blah VARCHAR2(20) NOT NULL 
); 

,我想列blah重命名爲bleh - 在barbaz等同列表被稱爲bleh,並且使表名在表中統一可以讓我簡化一些訪問這個數據庫的代碼。然而,僅僅使用ALTER TABLE重命名列不會做,因爲生成的架構變化是尚未修改,以符合它的代碼向後兼容。

所以,我想讓它的bleh作爲blah的別名。起初,虛擬列看起來像一個方式來實現這一點:

ALTER TABLE FOO ADD (bleh AS blah); 

然而,由此產生bleh列不能被更新或插入,這使得它不適合我的目的。 有沒有一種方法來創建可寫(可更新/插入)列別名在甲骨文11gR2的?

+0

我想你可以重命名'foo'到'foo_base',創建一個名爲'foo'該映射'blah'在'foo_base'在兩個視'blah'和'bleh'視圖。你不應該在視圖上使用觸發器,除非有''update''試着修改兩列的內容。另一種選擇是在表格中創建兩個物理列,並且只需要一個觸發器即可同步兩個物理列,直到您可以刪除舊列。 –

+0

@JustinCave - 這聽起來像一個答案......頭腦發佈這樣的? – LThode

回答

0

只需創建的圖,並且在該視圖中定義的別名blee列「blah`,
然後使用該視圖來代替表。

簡單的例子:

CREATE TABLE FOO (
    id INTEGER PRIMARY KEY, 
    blah VARCHAR2(20) NOT NULL 
); 

CREATE VIEW foooo as 
SELECT id, blah as blee 
FROM foo; 

insert into foooo(id, blee) values (1, 'aaaa'); 

update foooo set blee = 'bbbb' where id = 1; 

select * from foo; 
     ID BLAH    
---------- -------------------- 
     1 bbbb     
1

兩個選項浮現在腦海中。

選項1。將重命名foofoo_base,上foo_base創建視圖foo然後在foo露出柱既blah並在視圖bleh

alter table foo 
    rename to foo_base; 

alter table foo_base 
    rename column blah to bleh; 

create view foo 
as 
select id, bleh as blah, bleh as bleh 
    from foo_base; 

只要你不嘗試在同一update語句更新fooblahbleh,我不希望這造成任何問題。

選項2是將bleh列添加到表中,然後寫一個觸發器,以保持兩列同步在之前的插入或更新行級觸發器。這意味着,該數據將被複制和邏輯將得到一個有點痛苦如果update語句嘗試更新兩列。只要你只更新一列或另一列,那應該沒問題。