结构重构正如其名,它改变了数据库schema的结构。
实现结构重构时,需要考虑一些常见问题:
避免触发器循环。如果一个原来的列值发生了改变,新列需要同步更新的话,但是这个更新不应该再次触发对原来列的更新。这样可能导致无限循环或者错误的结果。
修复被破坏的视图。视图定义通常与其他视图或者表的定义耦合在一起,进行结构重构时,可能会破坏视图。
修复被破坏的触发器。触发器与表定义耦合在一起,因此像列改名或移动列这样的结构性变更可能会破坏触发器。
发现被破坏的存储过程。存储过程会调用其他存储过程并访问表、视图和列。
发现被破坏的表。表与其他表的列是通过命名习惯间接耦合在一起的。也就是不同的表存在同名的列,列改名是需要统一修改。
确定转换期。结构重构需要一个转换期,以支持多应用和新旧schema。
以Oracle为例,以下代码可以找出被破坏的触发器:
SELECT Object_Name, Status FROM User_Objects WHERE Object_Type='TRIGGER' AND Status='INVALID';
以下代码可以发现被破坏的存储过程:
SELECT Object_Name, Status FROM User_Objects WHERE Object_Type='PROCEDURE' AND Status='INVALID';
以下代码可以找出所有列名包含“CUSTOMERNUMBER”的表:
SELECT Table_Name,Column_Name FROM User_Tab_Columns WHERE Column_Name LIKE '%CUSTOMERNUMBER%';
1 删除列
从现有的表中删除一个列。
动机
应用“删除列”的首要原因是为了重构数据库的表设计,或者是由于外部应用重构引起的,例如该列已不再使用。
可能的折中
被删除的列可能包含有价值的数据,数据需要保留下来。可以使用“移动数据”将数据移到其他表中。
Schema更新技巧
选择一种删除策略。通常只需要使用ALTER TABLE命令的DROP COLUMN选项。
删除列。有时候数据量很大,为了将影响降到最低,可以在使用最少的时间进行。另一种策略是将列标识为未使用,可以通过ALTER TABLE命令的SET UNUSED选项来实现,然后在非峰值时间删除这些未使用的列。
重建外键。如果FavoriteColor是主键的一部分,必须同时删除其他表中作为外键连接到Customer的对应列。还需要重建这些表上的外键约束。这种情况下,可能需要考虑先进行“引入替代键”或“用自然键取代替代键”重构,再进行“删除列”重构,以此来简化工作。
物理删除该列的另一种策略是通过引入一个不引用FavoriteColor的视图来隐藏它,这可以通过“用视图封装”重构来完成。
在转换期,必须为Customer.FavoriteColor提供一个注释,说明它不久就会被删除。在转换期结束时,通过ALTER TABLE命令删除该列,代码如下:
COMMENT ON Customer.FavoriteColor 'Drop date = September 14 2007';
-- On September 14 2004
ALTER TABLE Customer DROP COLUMN FavoriteColor;
如果使用SET UNUSED选项,代码如下:
ALTER TABLE Customer SET UNUSED COLUMN FavoriteColor;
ALTER TABLE Customer DROP UNUSED COLUMNS;
数据迁移技巧
最简单的方法就是创建一个临时表,其中包含源表的主键和要删除的列,然后将相应的数据迁移到这个新的临时表中。可以选择其他方法来保留数据,例如外部文件。
下面的代码创建了一个临时表,它包含Customer表的主键和FavoriteColor列,以及列中的数据。
CREATE TABLE CustomerFavoriteColor AS SELECT CustomerID, FavoriteColor FROM Customer;
访问程序更新技巧
必须确定并更新所有引用Customer.FavoriteColor的外部程序。需要考虑的问题包括:
重构代码,使用替代数据源。
简化SELECT语句。某些外部程序可能包含读取该列的查询,但随后又忽略了返回的值。
重构数据库的插入和更新。某些外部程序可能在插入数据库时将“假值”放入该列,这种代码需要删除。或者在插入或更新数据库时没有修改FavoriteColor列。另外,可能在应用中使用SELECT * FROM CUSTOMER 来获得一定数量的列,并通过位置引用从结果集中取出列的值。这样的应用代码可能被破坏,因为结果集现在少了一列。通常,SELECT *都不是一个好方法。但是,实际上这里的问题是使用了位置引用,这也是需要考虑重构的。
下面的JAVA代码演示了如何删除对FavoriteColor的引用。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24945919/viewspace-742227/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24945919/viewspace-742227/