ALTER GROUP向组中增加用户或从组中删除用户 ALTER GROUP Name ALTER GROUP -- 向组中增加用户或从组中删除用户 Synopsis ALTER GROUP name ADD USER username [, ... ] ALTER GROUP name DROP USER username [, ... ] 输入 Name 要更改的组名称。 Username 准备向组中增加或从组中删除的用户名。用户名必须已经存在。 输出 ALTER GROUP 更改成功的返回信息。 描述 ALTER GROUP用于向组中增加用户或者从组中删除用户。 只有数据库超级用户才能使用这条命令。向组中增加用户并不创建用户。同样从组中删除用户也不删除用户本身。 使用 CREATE GROUP创建新组以及 DROP GROUP删除一个组。 用法 向组中增加用户: ALTER GROUP staff ADD USER Karl, john; 从组中删除用户: ALTER GROUP workers DROP USER Beth; 兼容性 SQL92 里没有 ALTER GROUP 语句。角色(roles)的概念与之类似。
ALTER TABLE修改表的定义 ALTER TABLE Name ALTER TABLE -- 修改表的定义 Synopsis ALTER TABLE [ ONLY ] table [ * ] ADD [ COLUMN ] column type [ column constraint [ ... ] ]
ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT } ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column SET STATISTICS integer ALTER TABLE [ ONLY ] table [ * ] RENAME [ COLUMN ] column TO new column ALTER TABLE RENAME TO new table ALTER TABLE ADD table constraint definition ALTER TABLE [ ONLY ] table DROP CONSTRAINT constraint { RESTRICT | CASCADE } ALTER TABLE table OWNER TO new owner
输入 table 试图更改的现存表的名称. column 现存或新的列名称. type 新列的类型. newcolumn 现存列的新名称. new table 表的新名称. table constraint definition 表的新的约束定义. New user 该表的新所有者的用户名. 输出 ALTER 从被改名的列或表返回的信息. ERROR 如果一个列或表不存在返回的信息. 描述 ALTER TABLE变更一个现存表的定义. ADD COLUMN形式使用与 CREATE TABLE一样的语法向表中增加一个新列/字段。 ALTER COLUMN SET/DROP DEFAULT形式允许你从列/字段中设置或者删除缺省(值)。 注意缺省(值)只适用于随后的 INSERT 命令。 它们不会改变已经存在于表中的行. ALTER COLUMN SET STATISTICS形式允许你为 随后的 ANALYZE 操作 设置收集统计信息的对象. RENAME 子句可以在不影响任何相关数据的情况下更改 一个表,字段,索引或者序列名称。因此, 在此命令执行后数据仍将是相同尺寸和类型。 ADD table constraint definition子句使用与 CREATE TABLE一样的语法向表中增加一个新的约束。 DROP CONSTRAINT constraint子句删除所有表上匹配 constraint 的 CHECK 约束(以及其子表) OWNER 把该表的所有者改为用户 new user. 如果要改变表的纲要,你必须是表的所有者. 注意 COLUMN 关键字是多余的,可以省略. 在目前的 ADD COLUMN实现里还不支持 新列/字段的缺省(值)和 NOT NULL 子句。不过你可以随后用 ALTER TABLE 的 SET DEFAULT 形式设置缺省(值)。(你可能还想用 UPDATE 把已存在行更新为缺省值。) 目前只有 CHECK 约束可以从表中删除.RESTRICT 关键字是必须的,尽管 并不检查依赖性.还不支持 CASCADE 选项.要删除一个 PRIMARY 或者 UNIQUE 约束,用 DROP INDEX 命令删除相关的索引. 要删除 FOREIGN KEY 约束,你需要重新创建并重新装载该表, 创建的时候使用 CREATE TABLE命令的其它参数. 比如,要删除在表 distributors 上的所有约束∶ CREATE TABLE temp AS SELECT * FROM distributors; DROP TABLE distributors; CREATE TABLE distributors AS SELECT * FROM temp; DROP TABLE temp;
要修改表的结构,你必须是表的所有人。不允许更改系统表结构的任何部分。 PostgreSQL 用户手册里有关于继承的更多信息. 请参考CREATE TABLE 部分获取更多有效参数的描述. 用法 向表中增加一个 varchar 列: ALTER TABLE distributors ADD COLUMN address VARCHAR(30); 对现存列改名: ALTER TABLE distributors RENAME COLUMN address TO city; 更改现存表的名字∶ ALTER TABLE distributors RENAME TO suppliers; 给一个表增加一个检查约束∶ ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5); 删除一个表和它的所有子表的监查约束∶ ALTER TABLE distributors DROP CONSTRAINT zipchk; 向表中增加一个外键约束: ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL; 给表增加一个(多字段)唯一约束∶ ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode); 兼容性 SQL92 ADD COLUMN 形式是兼容的,除了上面说的缺省(值)和 NOT NULL 约束外。 ALTER COLUMN 形式是完全兼容的。 对 ALTER TABLE 声明了一些附加的 PostgreSQL 目前还不直接支持的功能: ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
从一个表中删除一个列. 目前,要删除一个现存的列,表必须重新创建和重新装载: CREATE TABLE temp AS SELECT did, city FROM distributors; DROP TABLE distributors; CREATE TABLE distributors ( did DECIMAL(3) DEFAULT 1, name VARCHAR(40) NOT NULL ); INSERT INTO distributors SELECT * FROM temp; DROP TABLE temp;
ALTER USER ALTER USER Name ALTER USER -- 改变数据库用户帐号. Synopsis ALTER USER username [ [ WITH ] option [ ... ] ] 这里 option 可以是∶ [ ENCRYPTED | UNENCRYPTED ] PASSWord 'password' | CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | VALID UNTIL 'abstime' 输入 username 想进行更改的用户的名字。 [ encrypted | unencrypted ] password 此帐号所使用的新口令。 Encrypted/ unencrypted 控制该口令在数据库里是否以加密形式存储. CREATEDB NOCREATEDB 这个子句定义该用户创建数据库的能力。 如果声明了 CREATEDB,该用户可以创建她自己的数据库。用 NOCREATEDB 将剥夺一个用户创建数据库的能力。 CREATEUSER NOCREATEUSER 这个子句决定一个用户能否创建新用户。 这个选项同样还令该用户成为超级用户,可以超越所有访问限制。 abstime 该用户帐号口令的有效日期(和可选的时间)。 输出 ALTER USER 更改成功的返回信息. ERROR: ALTER USER: user "username" does not exist 如果数据库不认识你所声明的用户返回的信息. 描述 ALTER USER用于更改用户的 PostgreSQL 帐号的属性.没有在该命令中出现的属性保持原值. 只有一个数据库超级用户可以用这个命令更改权限和口令有效期。 普通用户只能更改他们自己的口令。 ALTER USER无法改变一个用户的组的成员性. 用 ALTER GROUP实现这个目地. 使用 CREATE USER创建新用户和 DROP USER删除用户。 用法 更改一用户口令: ALTER USER divide WITH PASSWORD 'hu8jmn3'; 更改一用户有效期 ALTER USER Manuel VALID UNTIL 'Jan 31 2030'; 更改一用户有效期, 声明其权限应该在用比UTC早一小时的时区记时的1998年5月4日正午失效 ALTER USER Chris VALID UNTIL 'May 4 12:00:00 1998 +1'; 赋予一用户创建新用户和新数据库的权限: ALTER USER Miriam CREATEUSER CREATEDB; 兼容性 SQL92 里没有 ALTER USER. 该标准将用户定义部分交给具体数据库实现处理.
CLOSE CLOSE Name CLOSE -- 关闭一个游标 Synopsis CLOSE cursor 输入 cursor 一个待关闭的游标的名字. 输出 CLOSE 游标关闭成功返回的信息. NOTICE PerformPortalClose: portal "cursor" not found 如果该 cursor 没有声明或已经关闭,返回该信息. 描述 CLOSE释放和一个游标关联的资源. 一个游标关闭后,不允许对其再做任何操作.一个不再使用的游标应该关闭掉. 如果用 COMMIT 或 ROLLBACK 提交了一个事务,将对每个打开的游标执行隐含的关闭操作. 注意 PostgreSQL 没有明确的 OPEN (打开)游标的语句; 我们认为一个游标在声明时就打开了.使用 DECLARE 语句声明一个游标. 用法 关闭游标liahona: CLOSE liahona; 兼容性 SQL92 CLOSE与 完全兼容.
CLUSTER Name CLUSTER -- 根据一个索引对某个表集簇 Synopsis CLUSTER indexname ON table name
输入 indexname 一个索引名称. table 准备建簇的表的名称. 输出 CLUSTER 成功建簇. ERROR: relation <tablerelation_number> inherits "table" ERROR: Relation table does not exist! 描述 CLUSTER指示PostgreSQL 近似地基于索引 indexname 的度量对表 table 进行存储建簇. 索引必须已经在表 table name. 上定义了. 当对一个表建簇后,该表的物理存储将基于索引信息进行. 建簇是静态的,也就是说,当表被更新后,改变的内容不会建簇. 不会试图对更新过的记录重新建簇.如果需要,可以通过手工执行该命令的方法重建簇. 注意 该表实际上按索引顺序拷贝到了一个临时表中,然后重新改成原名. 因此,在建簇时所有赋予的权限和其它索引都将丢失. 如果你只是随机的访问表中的行, 那么在堆表中的数据的实际存储顺序是无关紧要的. 但是,如果你对某些数据的访问多于其他数据,而且有一个索引将这些数据分组,那你就将从 使用 CLUSTER 中获益. 另一个CLUSTER 很有帮助的例子是当你用索引从一个表中取出几个记录时. 如果你从一个表中请求一定索引范围的值,或者是一个索引过的值对应多行, CLUSTER 也会有助于应用,因为如果索引标识出第一匹配行所在的堆存储页,所有 其他行也可能已经在同一堆存储页里了,这样便节省了磁盘访问的时间,加速了查询. 有两种建簇的数据.第一种是用 CLUSTER 命令,此命令将原表按你声明的索引重新排列.这个动作在操作大表时可能会很慢,因为每一行都从堆存储页里按索引顺序取出,如果存储页表没有排序,整个表是随机存放在各个页面的,因而每行都要进行依次磁盘页面操作. PostgreSQL 有一个缓冲, 但一个大表的主体是不可能都放到缓冲去的. 另一个对数据建簇的方法是使用 SELECT column list INTO TABLE new table FROM table ORDER BY column list
这个用法使用PostgreSQL 排序的代码 ORDER BY 来匹配索引,在对未排序的数据操作时速度快得多. 然后你可以删除旧表,用 ALTER TABLE...RENAME将 new table 改成旧表名, 并且重建该表所有索引.唯一的问题是 OID 将不保留.这时再做 CLUSTER 将快得多, 因为大多数堆栈数据已经排过序了而且使用现有的索引. 用法 以雇员的薪水属性对雇员关系建簇. CLUSTER emp_ind ON emp; 兼容性 SQL92 在 规范里没有 CLUSTER 语句.
COMMENT COMMENT Name COMMENT -- 定义或者改变一个对象的评注 Synopsis COMMENT ON [ [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] object_name | COLUMN table_name.column_name| AGGREGATE agg_name agg_type| FUNCTION func_name (arg1, arg2, ...)| OPERATOR op (leftoperand_type rightoperand_type) | TRIGGER trigger_name ON table_name ] IS 'text' 输入 object_name, table_name, column_name, agg_name, func_name, op, trigger_name 要加入评注的对象名称. text 要加入的评注. 输出 COMMENT 成功对表评注后的返回. 描述 COMMENT 存储一个数据库对象的评注, 这个评注可以很容易用 psql的 /dd或 /d+ 或者 /l+ 命令检索出来.其它检索评注的用户接口可以建设在 psql 所用地同样地内部函数的基础上,也就是 obj_description() 和 col_description(). 要修改一个评注,为同一个对象发出一条新的 COMMENT 命令即可.每个对象只存储一条评注. 要删除评注,在文本字串的位置写上 NULL.当删除对象时,评注自动被删除掉. 需要说明的是目前评注没有安全机制∶任何联接到某数据库上地用户 都可以看到所有该数据库对象地评注(尽管只有超级用户可以修改 不属于它地对象的评注).因此,不要在评注里放安全性敏感地信息. 用法 给表mytable 加评注: COMMENT ON mytable IS 'This is my table.'; 一些例子: COMMENT ON DATABASE my_database IS 'Development Database'; COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee id'; COMMENT ON RULE my_rule IS 'Logs UPDATES of employee records'; COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys'; COMMENT ON TABLE my_table IS 'Employee Information'; COMMENT ON TYPE my_type IS 'Complex Number support'; COMMENT ON VIEW my_view IS 'View of departmental costs'; COMMENT ON COLUMN my_table.my_field IS 'Employee ID number'; COMMENT ON AGGREGATE my_aggregate (double precision) IS 'Computes sample variance'; COMMENT ON FUNCTION my_function (timestamp) IS 'Returns Roman Numeral'; COMMENT ON OPERATOR ^ (text, text) IS 'Performs intersection of two text'; COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for R.I.'; 兼容性 SQL92 里没有COMMENT.
输入 name 要创建的数据库名. dbpath 在文件系统里存储新数据库的可选位置;用字串文本声明. 或者用 DEFAULT 表示使用缺省位置. template 从哪个模板创建新数据库,这是模板名.或者用 DEFAULT 使用缺省模板(template1). encoding 创建新数据库用的多字节编码方法.声明一个字串文本名字 (比如,'SQL_ASCII'),或者一个整数编号,或者是 DEFAULT 表示使用缺省编码. 输出 CREATE DATABASE 命令成功执行的返回信息. ERROR: user 'username' is not allowed to create/drop databases 你必须有特殊的 CREATEDB 权限来创建数据库。参阅 See CREATE USER。 ERROR: createdb: database "name" already exists 如果声明的数据库 name 已经存在返回的信息. ERROR: database path may not contain single quotes 数据库路径名 dbpath 不能包含单引号。这样要求是为了创建数据库目录的 shell 命令能够正确执行。 ERROR: CREATE DATABASE: may not be called in a transaction block 如果你有一个明确的事务块正在处理,你不能调用 CREATE DATABASE。你必须先结束事务。 ERROR: Unable to create database directory 'path'. ERROR: Could not initialize database directory. 这种情况最有可能是因为对数据目录权限不够, 磁盘已满或其他文件系统问题。数据库服务器运行的机器上的用户必 须能访问该路径。 描述 CREATE DATABASE创建一个新的 PostgreSQL 数据库.创建者成为新数据库的管理员. 可以声明一个可选的数据库位置,例如,在另一块硬盘上存放数据库。 该路径必须是事先用 initlocation命令准备好了的. 如果路径名不包含斜杠,那么它被解释成一个环境变量, 该变量必须为服务进程所知。这样数据库管理员可以对能够在那里创建数据库进行控制。(例如,一个用户化的选择是 'PGDATA2'。)如果服务器带着 ALLOW_ABSOLUTE_DBPATHS (缺省时没有)选项编译,那么也允许使用以斜杠开头为标识的绝对路径(例如, ' '/usr/local/pgsql/data')。 缺省时,新数据库将通过克隆标准系统数据库 template1 来创建.不同的模板可以用 TEMPLATE = name 来写.尤其是,如果你用 TEMPLATE = template0,你可以创建一个很纯净的数据库,只包括你的版本的 PostgreSQL 预定义的标准对象.这个方法可以避免把任何已经加入到template1 里的本地安装对象拷贝到新数据库. 可选的编码参数允许选择数据库编码, 如果你的服务器是带着多字节编码支持编译的话. 如果没有声明,缺省是所选用的模板数据库用的编码. 可选参数可以以任意顺序写,而不仅是上面显示的顺序. 注意 CREATE DATABASE是 PostgreSQL 语言的扩展. 使用 DROP DATABASE删除一个数据库. 程序 createdb是 是这个命令的 shell 脚本的封装,提供来方便使用。 在用绝对路径指定的可选数据库位置时, 有一些安全和数据完整性的问题, 而且缺省时只有后端识别的环境变量可以声明为可选的路径.参考管理员手册获取更多的信息. 尽管我们可以通过把某数据库名声明为模板从非template1数据库拷贝数据库,但是这(还)不是一个通用的 COPY DATABASE 功能. 因此,我们建议当做模板使用的数据库都应该是以只读方式对待的.参阅管理员手册获取更多信息. 用法 创建一个新的数据库: olly=> create database lusiadas;
在另一个地方 ~/private_db创建新数据库: $ mkdir private_db $ initlocation ~/private_db The location will be initialized with username "olly". This user will own all the files and must also own the server process. Creating directory /home/olly/private_db Creating directory /home/olly/private_db/base
initlocation is complete. $ psql olly Welcome to psql, the PostgreSQL interactive terminal.
Type: /copyright for distribution terms /h for help with SQL commands /? for help on internal slash commands /g or terminate with semicolon to execute query /q to quit olly=> CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db'; CREATE DATABASE 兼容性 SQL92 在 里没有 CREATE DATABASE 语句. 数据库等同于目录,其创建是由实现决定的.
CREATE FUNCTION CREATE FUNCTION Name CREATE FUNCTION -- 定义一个新函数 Synopsis CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype AS 'definition' LANGUAGE 'langname' [ WITH ( attribute [, ...] ) ] CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype AS 'obj_file' , 'link_symbol' LANGUAGE langname [ WITH ( attribute [, ...] ) ]
描述 CREATE FUNCTION定义一个新的函数. CREATE OR REPLACE FUNCTION 将要么创建一个新函数,要么替换现有的定义. 参数 name 要创建的函数名字.这个名字可以不是唯一的, 因为函数可以重载,胆识同名的函数必须有不同的参数类型. argtype 该函数的数据类型(如果有).输入类型可以是基本类型,也可以是复合类型,opaque,或者和一个现有字段相同的类型. Opaque 表示该函数接受非 SQL 类型,比如 char *. 一个字段的类型是用 tablename.columnname%TYPE 表示的;使用这个东西可以帮助函数独立于表定义的修改. rettype 返回数据类型.输出类型可以声明为一个基本类型,复合类型, setof 类型,opaque, 或者和现有字段同类型. setof 修饰词表示该函数将返回一套条目,而不是一条条目.返回类型声明为 opaque 的函数不返回数值.它们不能直接调用;触发器函数可以利用这个 特性. definition 一个定义函数的字串;含义取决于语言.它可以是一个内部函数名字, 一个指向某个目标文件的路径,一个 SQL 查询,或者一个用过程语言 写的文本. obj_file, link_symbol 这个形式的 AS 子句用于在函数的 C 源文件 名字和 SQL 函数的名字不同的时候动态联接 C 语言函数. 字串 obj_file 是包含可动态装载的对象的文件名,而 link_symbol 是对象的联接符号,也就是该函数在 C 源文件列的名字. langname 可以是 SQL,C, internal,或者 plname,这里的 plname 是一种已创建过程语言的名字. 参阅 CREATE LANGUAGE获取细节. 为了保持向下兼容,该名字可以用单引号包围. attribute 一段可选的有关该函数的信息,用于优化.见下文获取细节. 创建该函数的用户成为该函数所有者. 下面的属性可以出现在 WITH 子句里∶ iscachable Iscachable 表示此函数在输入相同时总是返回相同的值 (也就是说, 它不做数据库查找或者是使用没有直接在它的参数列表出现的信息)。 优化器使用 iscachable 来认知对该函数的调用进行预先计算是否安全。 isstrict isstrict 表明如果它的任何参数是 NULL,此函数总是返回 NULL. 如果声明了这个属性,则如果存在 NULL 参数时不会执行该函数;而只是自动假设一个 NULL 结果.如果没有声明 isstrict 该函数将为 NULL 输入调用并进行处理.那么剩下的事就是函数作者的责任来检查 NULL 是否必须并且做相应响应. 注意 请参阅 PostgreSQL 程序员手册 关于通过函数扩展 PostgreSQL 的章节获取更多关于书写外部函数的信息. 我们允许你将完整的 SQL 类型语法用于 输入参数和返回值.不过,有些类型声明的细节(比如, numeric 类型的精度域)是由下层函数实现负责的, 并且会被 CREATE FUNCTION 命令悄悄地吞掉. (也就是说,不再被识别或强制). PostgreSQL 允许函数 重载;也就是说,同一个函数名可以用于几个不同的函数, 只要它们的参数可以区分它们。不过,这个功能在用于 internal(内部)和 C 语言 的函数时要小心。 两个 internal 函数拥有相同 C 名称时肯定会发生链接时错误。 要解决这个问题,给它们赋予不同的 C 名称(例如,使用参数类型做为 C 名称的一部分),然后在 CREATE FUNCTION 的 AS 子句里面声明这些名字。 如果 AS 子句为空,那么 CREATE FUNCTION 假设函数的 C 名称与SQL名称一样。 类似的还有,如果用多个 C 语言函数重载 SQL 函数, 给每个 C 语言函数的实例一个独立的名称,然后使用 CREATE FUNCTION 语法里的 AS 句的不同形式来选择每个重载的 SQL 函数的正确的 C 语言实现. 如果重复调用 CREATE FUNCTION,并且都指向同一个目标文件,那么该文件只装载一次.要卸载和恢复装载 该文件(可能是在开发过程中),你可以使用 LOAD命令. 使用 DROP FUNCTION 删除一个用户定义函数. 要更新现存函数的定义,用 CREATE OR REPLACE FUNCTION.请注意不可能用这种方法改变一个函数的名字或者参数类型 (如果你这么干,你只是会创建一个新的,不同的函数). 同样,CREATE OR REPLACE FUNCTION 也不会让你改变一个现存函数的返回类型.要干这些事,你必须删除并 重新创建该函数. 如果你删除然后重新创建一个函数,新函数和旧的并非相同实体; 你会破坏现存的引用了原有函数的规则,视图,触发器等等.使用 CREATE OR REPLACE FUNCTION 可以改变一个函数的定义而又不会破坏引用该函数的对象. 例子 要创建一个简单的 SQL 函数∶ CREATE FUNCTION one() RETURNS integer AS 'SELECT 1 AS RESULT;' LANGUAGE SQL; SELECT one() AS answer; answer -------- 1 这个例子通过调用一个用户创建的名为 funcs.so (扩展名因平台而异)的共享库过程创建一个 C 函数.该共享库文件应该位于服务器的动态搜索路径里.该路径计算一个检测位并且如果函数参数里的检测位 正确就返回一个 TRUE .这些可以通过用一个 CHECK 约束实现的. CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean AS 'funcs' LANGUAGE C; CREATE TABLE product ( id char(8) PRIMARY KEY, eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}') REFERENCES brandname(ean_prefix), eancode char(6) CHECK (eancode ~ '[0-9]{6}'), CONSTRAINT ean CHECK (ean_checkdigit(eanprefix, eancode)) ); 这个例子创建一个在用户定义类型 complex 和内部类型 point 之间做类型转换的函数。该函数是用一个从 C 源代码编译的动态装载的对象来实现的。(我们演示了使用声明共享目标文件 的准确路径名的过时方法). 对于 PostgreSQL 而言,要自动寻找类型转换函数,SQL 函数必须和返回类型同名,因而重载是不可避免的。 该函数名通过使用 SQL定义里 AS 子句的第二种类型来重载: CREATE FUNCTION point(complex) RETURNS point AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point' LANGUAGE C; 该函数的 C 声明可以是∶ Point * complex_to_point (Complex *z) { Point *p; p = (Point *) palloc(sizeof(Point)); p->x = z->x; p->y = z->y; return p; } 兼容性 SQL92 在 SQL99 里的确定义了一个CREATE FUNCTION PostgreSQL 的和它类似但是不兼容.这个属性是不可移植的,可以使用的不同语言也是如此. 又见 DROP FUNCTION , LOAD, PostgreSQL程序员手册
CREATE GROUP CREATE GROUP Name CREATE GROUP -- 定义一个新的用户组 Synopsis CREATE GROUP name [ [ WITH ] option [ ... ] ]
这里 option 可以是∶
SYSID gid | USER username [, ...]
输入 name 组名。 gid SYSID 子句可以用于选择 PostgreSQL 里新组的组标识(group id)。 不过,这样做不是必须的。 如果没有声明这个,将使用从 1 开始的,已分配的最高组标识加一作为缺省值。 username 包括到组里面的用户列表。用户必须已经存在。 输出 CREATE GROUP 成功创建组后的返回。 描述 CREATE GROUP 将在数据库节点上创建一个新组。参考管理员手册获取关于使用组来认证的信息。 要使用这条命令, 你必须是数据库超级用户。 使用 ALTER GROUP修改组成员,DROP GROUP删除一个组。 用法 创建一个空组: CREATE GROUP staff 创建一个有成员的组: CREATE GROUP marketing WITH USER jonathan, david 兼容性 SQL92