当前位置:首页 > 技术与方案 > 数据库技术相关

Informix DBA,SQL方法

(2012-09-26 15:02:50)

所有优秀的 DBA 都有一些使工作更轻松的技巧。我喜欢使用的一个技巧是,编写一个针对 Informix 系统表的 SQL 查询,并使用这个查询的输出生成另一个 SQL 脚本。如果您要操作包含许多表的大型数据库,这个技巧可以节省大量时间(并减少错过某个表的可能性)。

假设您需要将一个数据库中的所有表从页面级锁改为行级锁,或者需要将所有表上外键约束延迟实施,以便进行加载。可以编写一个每次对一个表进行这一操作的 SQL 脚本,但是如果有数百个表,这个任务就会变得冗长乏味。也可以编写一个 SQL 语句来查询系统表并生成所需的 SQL 脚本。我将用三个示例说明这种方法是非常有用的。第一个示例改变数据库中所有表的锁模式,第二个示例改变数据库特权。第三个示例说明如何生成脚本来启用或禁用数据库中所有表的所有约束。如果需要大批加载或修改数据,而约束会妨碍这个过程,那么这个脚本就非常有帮助了。

改变页面级锁

在最初创建表时,要定义一个锁模式。两个锁模式是页面级(当锁定一行时,会锁定一个页面中的所有行)和行级(只锁定正在使用的一行)。由于性能的原因,页面级锁是默认模式。但是,为了使并发度最大化,DBA 常常需要将页面级锁改为行级锁。可以创建一个脚本,它首先检查数据库中所有表的锁级别,然后生成 SQL 代码,将使用页面级锁的所有表改为使用行级锁模式。清单 1 给出这个 SQL 脚本,它会生成第二个 SQL 脚本,把所有表的锁模式改为行级锁。清单 2 给出产生的输出。

所有这些脚本中的基本过程是,在 SQL 中结合使用系统表和文本字符串,输出一个包含 SQL 命令的文本文件。可以创建脚本来卸载数据、修改扩展块大小、检查表的特权以及自动执行许多其他 DBA 任务。

在清单 1 中,“output to lockmod.sql without headings” 行创建一个包含 SQL 命令的文件来执行所需的操作,但是不包含 SQL 一般会生成的列标题。注意,将使用 “dbaccess” 创建输出,而 dbaccess 会使输出文件在 80 个字符处自动换行。许多 SQL 命令行会超过 80 个字符,但是自动换行不会导致生成的 SQL 出现问题 —— 它只影响代码的外观。

生成脚本来撤消特权

我常常需要修改的另一项 Informix 默认设置是 “public” 的特权。在创建表时,“public” 被默认授予对这个表的选择、更新、删除和插入特权。换句话说,能够访问这个数据库的任何用户都能够修改这个表中的所有数据。清单 3 给出一个 SQL 脚本,它生成 SQL 来取消 public 对数据库中表的所有特权。

因为这个脚本会读取系统表,所以它可以在任何数据库上运行。但是,无法撤消别人授予的特权,所以这个脚本只对您授予 “public” 特权的表起作用。如果有多个开发人员在一个数据库中创建表,那么每个开发人员都需要运行这个脚本,才能撤消 public 特权。可以将这个脚本改为向特定的用户或用户组授予特权。清单 4 给出运行这个脚本产生的输出。

生成脚本来启用或禁用约束

在包含数百个表的大型数据库上,编写 SQL 命令来启用或禁用所有约束是非常麻烦的。清单 5 是一个简短的 SQL 脚本,它可以为您节省大量时间和精力。这个脚本会生成 SQL 语句,这些语句启用或禁用数据库中的所有外键约束。

脚本的其他用途

我在这里只展示了几个使用 SQL 和系统表创建的脚本示例,但是可以按照这种方式创建许多有用的脚本。在包含许多表的大型数据库上,手工编写脚本既冗长乏味,又容易出错。通过在脚本中使用系统表,可以存储数据库中所有表和列的相关信息,从而确保操作不会漏掉任何表。在 International Informix User Group Web 站点的软件部分中可以找到更多的示例。

 

更多
关闭窗口 打印 
网站首页    -    联系我们    -   收藏本站    -    网站地图                                                               客户服务热线:0571-85023000
本网站所有网页信息已申请知识产权和著作权保护,版权归四海光纤公司所有,未经授权禁止任何人复制或镜像,违者必究。
公司主营:杭州光纤光缆视频会议系统,是专业的通信网络工程、视频会议系统建设专家

中华人民共和国备案号:浙ICP备10018243号