Chapter 6. 管理数据库

Table of Contents
6.1. 创建数据库
6.2. 访问数据库
6.3. 删除数据库

数据库是一些 SQL 对象(“数据库对象”)的命名集合; 每个数据库对象(表,函数等等)属于并且只属于一个数据库. 一个与数据库服务器联接的应用应该在它的联接请求里面带有它想于之联接 的数据库名称.不允许在一次联接里面对多个数据库访问.(不过 没有限制一个应用与同一个或者其他数据库可以建立的联接数量.)

注意: SQL 把数据库称作“目录”,不过这两个东西实际上 没有什么区别.

为了创建和删除数据库,Postgres postmaster 必须已经运行(参阅 Section 3.3).

6.1. 创建数据库

数据库是用查询语言命令CREATE DATABASE创建的: CREATE DATABASE:

CREATE DATABASE name
这里的 name 是你可以自由选择.(就目前的实现而言, 你可能不能使用某些字符,因为它们对下层操作系统有特殊意义. 对此我们有运行时检查.) 当前用户自动成为此新数据库的所有者.同时,以后删除这个数据库 也是这个用户的特权(同时还会删除其中的所有对象,即使那些对象 有不同的所有者也一样.)

创建数据库是一个有限制的操作.参阅 Section 7.1.1 获取如何赋权限的信息.

创世之初. 因为你需要与数据库服务器联接才能执行命令 CREATE DATABASE, 那么还有一个问题是任意节点的第一个数据库是怎样创建的? 第一个数据库总是由initdb命令在初始化数据存储区的时候 创建的.(参阅Section 3.2.)这个数据库叫 template1而且不能被删除. 因此要创建第一个“真正”的数据库的时候 你可以与template1联接.

“template1”的名字可不是随便取的,当创建一个新的数据库时, 实际上就是克隆了(复制)了模板数据库. 这就意味着你对template1做的任何修改都会传播到所有 随后创建的数据库.这就意味着说你不能把模板数据库用于真正的工作中, 但是如果明智地使用这个特性,那它可以带来许多方便.(译注:比如增加 用户定义函数等等.)

另外,为了更方便一些,你还可以用一个 shell 脚本来创建新数据库, createdb.

createdb dbname
createdb 没变什么魔术,它和 template1 联接并执行 CREATE DATABASE 命令. 和上面介绍地完全一样.它在内部使用 psql 程序. createdb 的手册页包含使用它的细节.尤其是不带任何参数调用 createdb 将以当前用户名为名称创建数据库,这可能是也可能不是你 要的.

6.1.1. 变更位置

我们可以不在缺省位置创建的数据库.请注意所有数据库访问发生在数据 库服务器后端,因此声明的任何位置必须可以被后端访问.

可选数据库位置是通过环境变量引用的,环境变量里给出你想用的 存储位置的绝对路径.环境变量必须在后端启动之前定义.任何有效 的环境变量名都可以用于引用一个可选路径,尽管我们建议使 用带有PGDATA前缀的环境变量名以避免和其他变量混淆或冲突。

要在服务器进程的环境里定义环境变量,你必须先停止服务器,然后定义变量, 初始化数据区,最后重新启动服务器. (参阅Section 3.6Section 3.3.) 要设置环境变量,在 Bourne shell 系列里面键入

PGDATA2=/home/postgres/data
export PGDATA2

或者是在 csh 或 tcsh 里面键入

setenv PGDATA2 /home/postgres/data

你必须确保这些环境变量总是在服务器环境中存在,否则你就不能 访问数据库.因此你可能会希望把它们设置在 shell 启动脚本文件 或者服务器启动脚本里.

要使用环境变量PGDATA2创建数据存储区,确信 /home/postgres 已经存 在并且可以被启动服务器的用户帐户写 (参阅 Section 3.1)。然后在命令行上键入:

initlocation PGDATA2

然后重新启动服务器.

要在新的位置创建一个数据库,使用下面命令

CREATE DATABASE name WITH LOCATION = 'location'
这里 location 是你用的环境变量, 本例中是 PGDATA2createdb 命令有个选项 -D 做此用途.

用这个方法在变更的位置创建的数据库可以象其他数据库一样访问和删除.

注意: 也可以直接给 CREATE DATABASE 命令声明一个绝对路径 而不需要定义环境变量.缺省时这是不允许的,因为有安全风险. 要允许这么做,你必须带着 C 预编译宏ALLOW_ABSOLUTE_DBPATHS 编译Postgres.你可以这么干: gmake CPPFLAGS=-DALLOW_ABSOLUTE_DBPATHS all