跳到主要内容

CREATE USER 到 DROP VIEW

命令数:51 条。

CREATE USER​

CREATE USER --- 定义一个新的数据库角色

大纲

CREATE USER name [ [ WITH ] option [ ... ] ]

这里 option 可以是:

SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| BYPASSRLS | NOBYPASSRLS
| CONNECTION LIMIT connlimit
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid

描述

CREATE USER现在是 CREATE ROLE的一个别名。唯一的区别是 CREATE USER中LOGIN 被作为默认值,而NOLOGIN是 CREATE ROLE的默认值。

另见

CREATE ROLE

CREATE USER MAPPING​

CREATE USER MAPPING --- 定义一个用户到一个外部服务器的新映射

大纲

CREATE USER MAPPING [IF NOT EXISTS] FOR { user_name | USER | CURRENT_USER | PUBLIC }
SERVER server_name
[ OPTIONS ( option 'value' [ , ... ] ) ]

描述

CREATE USER MAPPING定义一个用户到一个外部服务器的新映射。一个用户映射通常会包含连接信息,外部数据包装器会使用连接信息和外部服务器中包含的信息一起来访问一个外部数据源。

一个外部服务器的拥有者可以为任何服务器任何用户创建用户映射。还有, 如果一个用户被授予了服务器上的USAGE特权,该用户可以 为他们自己的用户名创建用户映射。

参数

IF NOT EXISTS

如果给定用户到给定外部服务器的映射已经存在,则不要抛出错误。在这种情况下发出通知。请注意,不能保证现有的用户映射与要创建的映射完全相同。

user_name

要映射到外部服务器的一个现有用户的名称。CURRENT_USER和USER匹配当前用户的名称。当PUBLIC被指定时,一个所谓的公共映射会被创建,当没有特定用户的映射可用时将会使用它。

server_name

将为其创建用户映射的现有服务器的名称。

OPTIONS ( option 'value' [, ... ] )

这个子句指定用户映射的选项。这些选项通常定义该映射实际的用户名和 口令。选项名必须唯一。允许的选项名和值与该服务器的外部数据包装器有关。

示例

为用户bob、服务器foo创建一个用户映射:

CREATE USER MAPPING FOR bob SERVER foo OPTIONS (user 'bob', password 'secret');

另见

ALTER USER MAPPING, DROP USER MAPPING, CREATE FOREIGN DATA WRAPPER, CREATE SERVER

CREATE VIEW​

CREATE VIEW --- 定义一个新视图

大纲

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name
[ ( column_name [, ...] ) ]
[ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
AS query
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

描述

CREATE VIEW定义一个查询的视图。该视图不会被物理上物质化。相反,在每一次有查询引用该视图时,视图的查询都会被运行。

CREATE OR REPLACE VIEW与之相似,但是如果已经存在一个同名视图,该视图会被替换。新查询必须产生和现有试图查询相同的列(也就是相同的列序、相同的列名、相同的数据类型),但是它可以在列表的末尾加上额外的列。产生输出列的计算可以完全不同。

如果给定了一个模式名(例如CREATE VIEW myschema.myview ...),那么该视图会被创建在指定的模式中。否则,它会被创建在当前模式中。临时视图存在于一个特殊模式中,因此创建临时视图时不能给定一个模式名。视图的名称不能与同一模式中任何其他视图、表、序列、索引或外部表同名。

参数

TEMPORARY或者TEMP

如果被指定,视图被创建为一个临时视图。在当前会话结束时会自动删掉临时视图。当临时视图存在时,具有相同名称的已有永久视图对当前会话不可见,除非用模式限定的名称引用它们。

如果视图引用的任何表是临时的,视图将被创建为临时视图(不管有没有指

定TEMPORARY)。

RECURSIVE

创建一个递归视图。语法

CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;

等效于

CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names)
AS (SELECT ...) SELECT column_names FROM view_name;

对于一个递归视图必须指定一个视图列名列表。

name

要创建的视图的名字(可以是模式限定的)。

column_name

要用于视图列的名称列表,可选。如果没有给出,列名会根据查询推导。

WITH ( view_option_name [= view_option_value] [, ... ] )

这个子句为视图指定一些可选的参数,支持下列参数:

check_option (enum)

这个参数可以是local或者cascaded,并且它等效于指定 WITH [ CASCADED | LOCAL ] CHECK OPTION(见下文)。可以使用ALTER VIEW在一个现有视图上修改这个选项。

security_barrier (boolean)

如果希望视图提供行级安全性,应该使用这个参数。

query

提供视图的行和列的一个SELECT或者 VALUES命令。

**WITH [ CASCADED | LOCAL ] CHECK OPTION**

这个选项控制自动可更新视图的行为。这个选项被指定时,将检查该视图上的INSERT和UPDATE命令以确保新行满足视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行不满足条件,更新将被拒绝。如果没有指定CHECK OPTION, 会允许该视图上的INSERT和UPDATE命令 创建通过该视图不可见的行。支持下列检查选项:

LOCAL

只根据直接定义在该视图本身的条件检查新行。任何定义在底层基视图上的 条件都不会被检查(除非它们也指定了CHECK OPTION)。

CASCADED

会根据该视图和所有底层基视图上的条件检查新行。如果 CHECK OPTION被指定,并且没有指定 LOCAL和CASCADED,则会假定为 CASCADED。

CHECK OPTION不应该和RECURSIVE视图一起使用。

注意,只有在自动可更新的、没有INSTEAD OF触发器或者 INSTEAD规则的视图上才支持CHECK OPTION。 如果一个自动可更新的视图被定义在一个具有INSTEAD OF 触发器的基视图之上,那么LOCAL CHECK OPTION可以被 用来检查该自动可更新的视图之上的条件,但具有INSTEAD OF 触发器的基视图上的条件不会被检查(一个级联检查选项将不会级联到一个触发器可更新的视图,并且任何直接定义在一个触发器可更新视图上的检查选项将被忽略)。如果该视图或者任何基础关系具有导致 INSERT或UPDATE命令被重写的 INSTEAD规则,那么在被重写的查询中将忽略所有检查选项,包括任何来自于定义在带有INSTEAD规则的关系之上的自动 可更新视图的检查。

注解

使用DROP VIEW语句删除视图。

要小心视图列的名称和类型将会按照你想要的方式指定。例如:

CREATE VIEW vista AS SELECT 'Hello World';

是不好的形式,因为列名默认为?column?,而且列的数据类型默认为text,这可能不是用户想要的。视图结果中一个字符串更好的风格类似于这样:

CREATE VIEW vista AS SELECT text 'Hello World' AS hello;

对视图中引用的表的访问由视图拥有者的权限决定。在某些情况下,这可以 被用来提供安全但是受限的底层表访问。不过,并非所有视图都对篡改是安 全的。在视图中调用的函数会被同样对待,就好像是直接在使用该视图的查询中调用它们一样。因此,一个视图的用户必须具有调用视图所使用的全部函数的权限。

当CREATE OR REPLACE VIEW被用在一个现有视图上时,只有该视图的定义 SELECT 规则被改变。其他包括拥有关系、权限和非 SELECT 规则在内的视图属性不会被更改。要替换视图,你必须拥有它(包括 作为拥有角色的一个成员)。

可更新视图

简单视图是自动可更新的:系统将允许在这类视图上以在常规表上相同的方式使用INSERT、UPDATE以及 DELETE语句。如果一个视图满足以下条件,它就是自动 可更新的:

• 在该视图的FROM列表中刚好只有一项,并且它必须是一个表或者另一个可更新视图。

• 视图定义的顶层不能包含WITH、DISTINCT、 GROUP BY、HAVING、 LIMIT或者OFFSET子句。

• 视图定义的顶层不能包含集合操作(UNION、 INTERSECT或者EXCEPT)。

• 视图的选择列表不能包含任何聚集、窗口函数或者集合返回函数。

一个自动可更新的视图可以混合可更新列以及不可更新列。如果一个列是对底层基本关系中一个可更新列的简单引用,则它是可更新的。否则该列是只读的,并且在一个INSERT或者UPDATE语句尝试对它赋值时会报出一个错误。

如果视图是自动可更新的,系统将把视图上的任何INSERT、UPDATE或者DELETE语句转换成在底层基本关系上的对应语句。带有ON CONFLICT UPDATE子句的 INSERT语句已经被完全支持。

如果一个自动可更新视图包含一个WHERE条件,该条件会限制基本关系的哪些行可以被该视图上的UPDATE以及 DELETE语句修改。不过,一个允许被UPDATE 修改的行可能让该行不再满足WHERE条件,并且因此也不再能 从视图中可见。类似地,一个INSERT命令可能插入不满足WHERE条件的基本关系行,并且因此从视图中也看不到这些行(ON CONFLICT UPDATE可能会类似地影响无法通过该视图见到的现有行)。CHECK OPTION可以被用来阻止INSERT和UPDATE命令创建这类从视图中无法看到的行。

如果一个自动可更新视图被标记了security_barrier属性,那么所有该属性的WHERE条件(以及任何使用标记为 LEAKPROOF的操作符的条件)将在该视图使用者的任何条件之前计算。注意正因为这样,不会被最终返回的行(因为它们不会通过用户的WHERE条件)可能仍会结束被锁定的状态。可以用EXPLAIN来查看哪些条件被应用在关系层面(并且因此不锁定行)以及哪些不会被应用在关系层面。一个更加复杂的不满足所有这些条件的视图默认是只读的:系统将不允许在该视图上的插入、更新或者删除。可以通过在该视图上创建一个 INSTEAD OF触发器来获得可更新视图的效果,该触发器必须把该视图上的尝试的插入等转换成其他表上合适的动作。更多信息请见CREATE TRIGGER。另一种可能性是创建规则(见 CREATE RULE),不过实际中触发器更容易理解和正确使用。

注意在视图上执行插入、更新或删除的用户必须具有该视图上相应的插入、 更新或删除特权。此外,视图的拥有者必须拥有底层基本关系上的相关特权, 但是执行更新的用户并不需要底层基本关系上的任何权限。

示例

创建一个由所有喜剧电影组成的视图:

CREATE VIEW comedies AS
SELECT * FROM films
WHERE kind = 'Comedy';

创建的视图包含创建时film表中的列。尽管* 被用来创建该视图,后来被加入到该表中的列不会成为该视图的组成部分。

创建带有LOCAL CHECK OPTION的视图:

CREATE VIEW universal_comedies AS
SELECT * FROM comedies
WHERE classification = 'U'
WITH LOCAL CHECK OPTION;

这将创建一个基于comedies视图的视图,只显示 kind = 'Comedy'和classification = 'U'的电影。 如果新行没有classification = 'U',在该视图中的任何 INSERT或UPDATE尝试将被拒绝,但是电影的kind将不会被检查。

用CASCADED CHECK OPTION创建一个视图:

CREATE VIEW pg_comedies AS
SELECT * FROM comedies
WHERE classification = 'PG'
WITH CASCADED CHECK OPTION;

这将创建一个检查新行的kind和classification 的视图。

创建一个由可更新列和不可更新列混合而成的视图:

CREATE VIEW comedies AS
SELECT f.* country_code_to_name(f.country_code) AS country,
(SELECT avg(r.rating)
FROM user_ratings r
WHERE r.film_id = f.id) AS avg_rating
FROM films f
WHERE f.kind = 'Comedy';

这个视图将支持INSERT、UPDATE 以及DELETE。所有来自于films表的列都将是可更新的,而计算列country和avg_rating 将是只读的。

创建一个由数字 1 到 100 组成的递归视图:

CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
VALUES (1)
UNION ALL
SELECT n+1 FROM nums_1_100 WHERE n < 100;

注意在这个CREATE中尽管递归的视图名称是方案限定的,但它内部的自引用不是方案限定的。这是因为隐式创建的CTE的名称不能是方案限定的。

另见

ALTER VIEW, DROP VIEW, CREATE MATERIALIZED VIEW

DEALLOCATE​

DEALLOCATE --- 释放一个预备语句

大纲

DEALLOCATE [ PREPARE ] { name | ALL }

描述

DEALLOCATE被用来释放一个之前准备好的 SQL 语句。如果不显式地释放一个预备语句,会话结束时会释放它。

更多关于预备语句的信息请见PREPARE。

参数

PREPARE

这个关键词会被忽略。

name

要释放的预备语句的名称。

ALL

释放所有预备语句。

另见

EXECUTE, PREPARE

DECLARE​

DECLARE --- 定义一个游标

大纲

DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query

描述

DECLARE允许用户创建游标,游标可以被用来在大型查询暂停时检索少量的行。游标被创建后,可以用FETCH从中取得行。

注意:这个页面描述在 SQL 命令层面上游标的用法。如果想要在 PL/pgSQL函数中使用游标,其规则是不同的。

参数

name

要创建的游标的名称。

BINARY

让游标返回二进制数据而不是返回文本格式数据。

INSENSITIVE

指示从游标中检索数据的过程不受游标创建之后在其底层表上发生的更新的影响。这是默认的行为。

SCROLL

NO SCROLL

SCROLL指定游标可以用非顺序(例如,反向)的方式从中检索行。根据查询的执行计划的复杂度,指定 SCROLL可能导致查询执行时间上的性能损失。 NO SCROLL指定游标不能以非顺序的方式从中检索行。默认是允许在某些情况下滚动,但这和指定 SCROLL不完全相同。详情请见 Notes。

WITH HOLD

WITHOUT HOLD

WITH HOLD指定该游标在创建它的事务提交之后还能被继续使用。WITHOUT HOLD指定该游标不能在创建它的事务之外使用。如果两者都没有指定,则默认为 WITHOUT HOLD。

query

用于提供该游标返回的行的SELECT或者 VALUES命令。

关键词BINARY、 INSENSITIVE和SCROLL 可以以任意顺序出现。

注解

普通游标以文本格式返回数据,这和SELECT产生的数据一样。BINARY选项指定游标应该以二进制格式返回数据。这减少了服务器和客户端的转换负担,但程序员需要付出更多工作来处理与平台相关的二进制数据格式。例如,如果一个查询从一个整数列中返回一个值一,用一个默认游标将得到一个字符串1,而使用一个二进制游标将得到该值的四字节内部表示(big-endian 大端字节顺序)。

使用二进制游标时应该小心。很多应用(包括 psql)还没有准备好处理二进制游标,它们仍然期待数据以文本格式到来。

注意:当客户端应用使用"扩展查询"协议发出一个 FETCH命令,绑定协议消息会指定使用文本还是二进制格式检索数据。这种选择会覆盖定义游标时指定的方式。因此在使用扩展查询协议时,这样一个二进制游标的概念实际是被废弃的 --- 任何游标都可以被视作文本或者二进制。

除非指定了WITH HOLD,这个命令创建的游标只能在当前事务中使用。因此,没有WITH HOLD的DECLARE在事务块外是没有用的:游标只会生存 到该语句结束。因此如果这种命令在事务块之外被使用, 系统会报告一个错误。定义事务块需要使用BEGIN和 COMMIT(或者ROLLBACK)。

如果指定了WITH HOLD并且创建游标的事务 成功提交,在同一个会话中的后续事务中还能够继续访问该游标( 但是如果创建事务被中止,游标会被移除)。一个用 WITH HOLD创建的游标可以用一个显式的 CLOSE命令关闭,或者会话结束时它也会被关闭。在当前的实现中,由一个被保持游标表示的行会被复制到一个临时文件或者内存区域中,这样它们才会在后续事务中保 持可用。

当查询包括FOR UPDATE或FOR SHARE时,不能指定WITH HOLD。

在定义一个将被反向取元组的游标时,应该指定SCROLL 选项。这是 SQL 标准所要求的。

不过,为了和早期版本兼容,如果游标的查询计划足够简单到支持它不需要额外的开销,系统会允许在没有 SCROLL的情况下反向取元组。不过,建议应用开发者 不要依赖于从没有用SCROLL创建的游标中反向取 元组。如果指定了NO SCROLL,那么任何情况下都不允许反向取元组。

当查询包括FOR UPDATE或FOR SHARE时,也不允许反向取元组。因此在这种情况下不能指定SCROLL。

小心:如果可滚动和WITH HOLD游标调用了任何不稳定的函数,它们可能给出预期之外的结果。当重新取得一个之前取得过的行时,那些函数会被重新执行,这可能导致得到与第一次不同的结果。对这类情况的一种变通方法是,声明游标为WITH HOLD并且在从其中读取任何行之前提交 事务。这将强制该游标的整个输出被物化在临时存储中,这样针对每一行 只会执行一次不稳定函数。

如果游标的查询包括FOR UPDATE或者FOR SHARE,那么被返回的行会在它们第一次被取得时被锁定,这和带有这些选项的常规SELECT命令一样。此外,被返回的 行将是最新的版本,因此这些选项提供了被 SQL 标准称为 "敏感游标"的等效体(把INSENSITIVE与 FOR UPDATE或者FOR SHARE一起指定是错误)。

小心:如果游标要和UPDATE ... WHERE CURRENT OF或者 DELETE ... WHERE CURRENT OF一起使用,通常推荐使用FOR UPDATE。使用FOR UPDATE可以 阻止其他会话在行被取得和被更新之间修改行。如果没有 FOR UPDATE,当行在游标创建后被更改后,一个后续的WHERE CURRENT OF命令将不会产生效果。 另一个使用FOR UPDATE的原因是,如果没有它,当游标查询不符合 SQL 标准的"简单可更新"规则时,后续的 WHERE CURRENT OF可能会失败(特别地,该游标必须只引用一个表并且没有使用分组或者ORDER BY)。不是简单可更新的游标可能成功也可能不成功,这取决于计划选择的细节。因此在最坏的情况下,应用可能会在测试时成功但是在生产中失败。如果指定了FOR UPDATE,则保证游标是可更新的。 不把FOR UPDATE和WHERE CURRENT OF一起用的主要原因是,需要游标时可滚动的或者对于后续更新不敏感(也就是说,继续显示 旧的数据)。如果这是你的需求,应密切关注安上述警示。

SQL 标准只对嵌入式SQL中的游标做出了规定。当游标被声明时就被认为已经被打开。

示例

声明一个游标:

DECLARE liahona CURSOR FOR SELECT * FROM films;

更多游标的例子请见FETCH。

另见

CLOSE, FETCH, MOVE

DELETE​

DELETE --- 删除一个表的行

大纲

[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
[ USING from_item [, ...] ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

描述

DELETE从指定表中删除满足 WHERE子句的行。如果WHERE 子句没有出现,效果将会是删除表中的所有行。结果是一个合法的空表。

提示:TRUNCATE提供移除表中所有行的快速机制。

有两种方式可以使用数据库中其他表中包含的信息来删除一个表的行:使用子选择或者在USING子句中指定额外的表。哪种技术更合适取决于特定的环境。

可选的RETURNING子句导致DELETE 基于实际被删除的每一行计算并且返回值。任何使用被删除表列或者 USING中提到的其他表的列的表达式都可以被计算。RETURNING列表的语法和SELECT的输出列表语法相同。

要从表中删除行,你必须具有其上的DELETE特权,以及USING子句中任何表以及其值在condition中被读取的表上的 SELECT特权。

参数

with_query

WITH子句允许你指定一个或者多个子查询,在 DELETE查询中可以用子查询的名字来引用它们。

table_name

要从其中删除行的表名(可以是模式限定的)。如果在表名前指定 ONLY,只会从提到的表中删除匹配的行。如果没有指定 ONLY,还会删除该表的任何继承表中的匹配行。可选地,可以在表名后面指定*来显式指定要包括继承表。

alias

目标表的一个别名。提供别名时,它会完全隐藏该表的真实名称。例如,对于DELETE FROM foo AS f, DELETE语句的剩余部分都会用 f而不是 foo来引用该表。

from_item

一个表的表达式允许在WHERE条件中出现来自其他表的列。这使用与SELECT语法的FROM子句相同的语法;例如,可以指定表名的别名。除非您希望建立自联接(在这种情况下,它必须与 from_item中的别名一起出现),否则不要将目标表重复为from_item。

condition

一个返回boolean类型值的表达式。只有让这个表达式返回true的行才将被删除。

cursor_name

要在WHERE CURRENT OF情况中使用的游标的名称。最近一次从这个游标中取出的行将被删除。该游标 必须是DELETE的目标表上的非分组查询。 注意不能在使用WHERE CURRENT OF的同时指定一个布尔条件。有关将游标用于 WHERE CURRENT OF的更多信息请见DECLARE。

output_expression

在每一行被删除后,会被DELETE计算并且返回的表达式。该表达式可以使用table_name以及USING中的表的任何列。写成*可以返回所有列。

output_name

被返回列的名称。

输出

在成功完成时,一个DELETE命令会返回以下形式 的命令标签:

DELETE count

count是被删除行的数目。注意如果有一个BEFORE DELETE触发器抑制删除,那么该数目可能小于匹配condition 的行数。如果count为 0,表示查询没有删除行(这并非一种错误)。

如果DELETE命令包含RETURNING子句,则结果会与包含有RETURNING列表中定义的列和值的SELECT语句结果相似,这些结果是在被该命令删除的行上计算得来。

注解

通过在USING子句中指定其他的表,系统允许在 WHERE条件中引用其他表的列。例如,要删除有一个给定制片人制作的所有电影,可以这样做:

DELETE FROM films USING producers
WHERE producer_id = producers.id AND producers.name = 'foo';

这里实际发生的事情是在films和 producers之间进行连接,然后删除 所有成功连接的films行。这种语法不属于标准。更标准的方式是:

DELETE FROM films
WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

在一些情况下,连接形式比子查询形式更容易书写或者执行更快。

示例

删除所有电影,但音乐剧除外:

DELETE FROM films WHERE kind <> 'Musical';

清空表films:

DELETE FROM films;

删除已完成的任务,返回被删除行的明细:

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

删除tasks中游标c_tasks 当前位于其上的行:

DELETE FROM tasks WHERE CURRENT OF c_tasks;

又见

TRUNCATE

DISCARD​

DISCARD --- 抛弃会话状态

大纲

DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }

描述

DISCARD释放与一个数据库会话相关的内部资源。这个命令有助于部分或者完全重置该会话的状态。有几个子命令来释放不同类型的资源。DISCARD ALL变体把所有 其他形式都包含在内,并且还会重置额外的状态。

参数

PLANS

释放所有已缓存的查询计划,强制在下一次使用相关预备语句时重新做计划。

SEQUENCES

丢弃所有已缓存的序列相关的状态,包括 currval()/lastval()信息以及任何还未被nextval()返回的预分配的序列值(预分配序列值的描述请见 CREATE SEQUENCE);

TEMPORARY or TEMP

删除当前会话中创建的所有临时表。

ALL

释放与当前会话相关的所有临时资源并且把会话重置为初始状态。当前这和执行以下语句序列的效果相同:

SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD SEQUENCES;
DISCARD TEMP;

注解

DISCARD ALL不能在事务块内执行。

DO​

DO --- 执行一个匿名代码块

大纲

DO [ LANGUAGE lang_name ] code

描述

DO执行一个匿名代码块,或者换句话说执行一个以一种过程语言编写的瞬时匿名函数。

代码块就好像是一个没有参数并且返回void的函数的函数体。它会被在一次时间内解析并且执行。

可选的LANGUAGE子句可以卸载代码块之前或者之后。

参数

code

要被执行的过程语言代码。就像在 CREATE FUNCTION中一样,必须把它指定为一个字符串。推荐使用一个美元引用的文本。

lang_name

编写该代码的过程语言的名称。如果省略,默认为plpgsql。

注解

要使用的过程语言必须已经用CREATE EXTENSION安装在当前数据库中。默认已经安装了plpgsql,但是其他语言没有被安装。用户必须拥有该过程语言的USAGE特权,如果该语言是不可信的则必须是一个超级用户。这和创建一个该语言的函数对特权的要求相同。

如果在事务块中执行DO,过程代码则无法执行事务控制语句。只有在自己的事务中执行DO时,才允许使用事务控制语句。

例子

把模式public中所有视图上的所有特权授予 给角色webuser:

DO \$\$DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' ||
quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END\$\$;

另见

CREATE LANGUAGE

DROP ACCESS METHOD​

DROP ACCESS METHOD --- 移除一种访问方法

大纲

DROP ACCESS METHOD [ IF EXISTS ] name [ CASCADE | RESTRICT ]

简介

DROP ACCESS METHOD移除一种现有的访问方法。只有超级用户能够删除访问方法。

参数

IF EXISTS

如果该访问方法不存在,则不会抛出错误。这种情况下会发出一个提示。

name

一种现有的访问方法的名称。

CASCADE

自动删除依赖于该访问方法的对象(例如操作符类、操作符族以及索引),并且接着删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该访问方法,则拒绝删除它。这是默认设置。

示例

删除访问方法heptree:

DROP ACCESS METHOD heptree;

另见

CREATE ACCESS METHOD

DROP AGGREGATE​

DROP AGGREGATE --- 移除一个聚集函数

大纲

DROP AGGREGATE [ IF EXISTS ] name ( aggregate_signature ) [, ...] [ CASCADE | RESTRICT ]

这里aggregate_signature是:

* |
[ argmode ] [ argname ] argtype [ , ... ] |
[ [ argmode ] [ argname ] argtype [ , ... ] ] ORDER BY [ argmode ] [ argname] argtype [ , ... ]

描述

DROP AGGREGATE移除一个现有的聚集函数。要执行这个命令,当前用户必须是该聚集函数的拥有者。

参数

IF EXISTS

如果该聚集不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有聚集函数的名称(可以是模式限定的)。

argmode

一个参数的模式:IN或VARIADIC。 如果被忽略,默认值是IN。

argname

一个参数的名称。注意DROP AGGREGATE 并不真正关心参数名称,因为决定聚集函数的身份时只需要参数数据类型。

argtype

该聚集函数所操作的一个输入数据类型。要引用一个零参数的聚集函数,写 *来替代参数说明列表。要引用一个有序集聚集函数,在直接和聚集参数说明之间写上ORDER BY。

CASCADE

自动删除依赖于该聚集函数的对象(例如使用它的视图),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该聚集函数,则拒绝删除它。这是默认值。

注解

ALTER AGGREGATE下描述了另一种引用有序集聚集的语法。

示例

要为类型integer移除聚集函数myavg:

DROP AGGREGATE myavg(integer);

要移除假想集聚集函数myrank,该函数接收一个排序列的任意列表和直接参数的一个匹配的列表:

DROP AGGREGATE myrank(VARIADIC "any" ORDER BY VARIADIC "any");

要在一个命令中删除多个聚合函数:

DROP AGGREGATE myavg(integer), myavg(bigint);

另见

ALTER AGGREGATE, CREATE AGGREGATE

DROP CAST​

DROP CAST --- 移除一个造型

大纲

DROP CAST [ IF EXISTS ] (source_type AS target_type) [ CASCADE | RESTRICT ]

描述

DROP CAST移除一个之前定义好的造型。

要能删除一个造型,你必须拥有源数据类型或目标数据类型。这也是创建一个造型所要求的特权。

参数

IF EXISTS

如果该造型不存在则不要抛出一个错误,而是发出一个提示。

source_type

该造型的源数据类型的名称。

target_type

该造型的目标数据类型的名称。

CASCADE

RESTRICT

这些关键词没有任何效果,因为在造型上没有依赖性。

示例

要移除从类型text到类型int的造型:

DROP CAST (text AS int);

另见

CREATE CAST

DROP COLLATION​

DROP COLLATION --- 移除一个排序规则

大纲

DROP COLLATION [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP COLLATION移除一个之前定义好的排序规则。要能删除一个排序规则,你必须拥有它。

参数

IF EXISTS

如果该排序规则不存在则不要抛出一个错误,而是发出一个提示。

name

排序规则的名称。排序规则名称可以是模式限定的。

CASCADE

自动删除依赖于该排序规则的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该排序规则,则拒绝删除它。这是默认值。

示例

要删除名为german的排序规则:

DROP COLLATION german;

另见

ALTER COLLATION, CREATE COLLATION

DROP CONVERSION​

DROP CONVERSION --- 移除一个转换

大纲

DROP CONVERSION [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP CONVERSION移除一个之前定义好的转换。要能删除一个转换,你必须拥有该转换。

参数

IF EXISTS

如果该转换不存在则不要抛出一个错误,而是发出一个提示。

name

转换的名称。转换名称可以是模式限定的。

CASCADE

RESTRICT

这些关键词没有任何效果,因为在转换上没有依赖性。

示例

要删除名为myname的转换:

DROP CONVERSION myname;

另见

ALTER CONVERSION, CREATE CONVERSION

DROP DATABASE​

DROP DATABASE --- 移除一个数据库

大纲

DROP DATABASE [ IF EXISTS ] name [ [ WITH ] ( option [, ...] ) ]

其中选项可以是:

FORCE

描述

DROP DATABASE移除一个数据库。它会移除该数据库的系统目录项并且删除包含数据的文件目录。它只能由数据库拥有者执行。当你已经连接到目标数据库时,它不能被执行。另外,如果其他任何人已经连接到目标数据库,这个命令将会失败,除非您 使用以下所述的FORCE选项。

DROP DATABASE不能被撤销。请小心使用!

参数

IF EXISTS

如果该数据库不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的数据库的名称。

FORCE

尝试终止与目标数据库的所有现有连接。如果目标数据库中存在准备好的事务、活跃的逻辑复制槽或订阅,则不会终止。

如果当前用户没有终止其他连接的权限,则此操作将失败。所需权限与描述的 pg_terminate_backend相同。如果我们不能终止连接,则此操作也将会失败。

注解

DROP DATABASE不能在一个事务块内执行。

在连接到目标数据库时,这个命令不能被执行。因此,使用程序 dropdb会更方便,它是这个命令的一个包装器。

另见

CREATE DATABASE

DROP DOMAIN​

DROP DOMAIN --- 移除一个域

大纲

DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP DOMAIN移除一个域。只有域的拥有者才能移除它。

参数

IF EXISTS

如果该域不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有域的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该域的对象(例如表列),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该域,则拒绝删除它。这是默认值。

示例

要移除域box:

DROP DOMAIN box;

另见

CREATE DOMAIN, ALTER DOMAIN

DROP EVENT TRIGGER​

DROP EVENT TRIGGER --- 移除一个事件触发器

大纲

DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP EVENT TRIGGER移除一个已有的事件触发器。要执行这个命令,当前用户必须是事件触发器的拥有者。

参数

IF EXISTS

如果该事件触发器不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的事件触发器的名称。

CASCADE

自动删除依赖于该触发器的对象,然后删除所有依赖于那些对象的对象

RESTRICT

如果有任何对象依赖于该触发器,则拒绝删除它。这是默认值。

示例

销毁触发器snitch:

DROP EVENT TRIGGER snitch;

另见

CREATE EVENT TRIGGER, ALTER EVENT TRIGGER

DROP EXTENSION​

DROP EXTENSION --- 移除一个扩展

大纲

DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP EXTENSION从数据库移除扩展。删除一个扩展会导致其组成对象也被删除。

你必须拥有该扩展才能使用DROP EXTENSION。

参数

IF EXISTS

如果该扩展不存在则不要抛出一个错误,而是发出一个提示。

name

一个已安装扩展的名称。

CASCADE

自动删除依赖于该扩展的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该扩展(而不是它自己拥有的成员对象和其他被列在同一个DROP命令中 的扩展),则拒绝删除它。这是默认值。

示例

要从当前数据库移除扩展hstore:

DROP EXTENSION hstore;

如果hstore的任何对象在该数据库库中正在使用,例如有一个表的列是hstore类型,这个命令都将会失败。加上CASCADE选项可以强制 把这些依赖对象也移除。

另见

CREATE EXTENSION, ALTER EXTENSION

DROP FOREIGN DATA WRAPPER​

DROP FOREIGN DATA WRAPPER --- 移除一个外部数据包装器

大纲

DROP FOREIGN DATA WRAPPER [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP FOREIGN DATA WRAPPER 移除一个已有的外部数据包装器。要执行这个命令,当前用户必须是该外部数据包装器的拥有者。

参数

IF EXISTS

如果该外部数据包装器不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有外部数据包装器的名称。

CASCADE

自动删除依赖于该外部数据包装器的对象(例如服务器),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该外部数据包装器,则拒绝删除它。这是默认值。

示例

删除外部数据包装器dbi:

DROP FOREIGN DATA WRAPPER dbi;

另见

CREATE FOREIGN DATA WRAPPER, ALTER FOREIGN DATA WRAPPER

DROP FOREIGN TABLE​

DROP FOREIGN TABLE --- 移除一个外部表

大纲

DROP FOREIGN TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP FOREIGN TABLE移除一个外部表。只有一个外部表的拥有者才能移除它。

参数

IF EXISTS

如果该外部表不存在则不要抛出一个错误,而是发出一个提示。

name

要删除的外部表的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该外部表的对象(例如视图),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该外部表,则拒绝删除它。这是默认值。

示例

要销毁两个外部表films 和distributors:

DROP FOREIGN TABLE films, distributors;

另见

ALTER FOREIGN TABLE, CREATE FOREIGN TABLE

DROP FUNCTION​

DROP FUNCTION --- 移除一个函数

大纲

DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype
[, ...] ] ) ] [, ...]
[ CASCADE | RESTRICT ]

描述

DROP FUNCTION移除一个已有函数的定义。要执行这个命令用户必须是该函数的拥有者。该函数的参数类型必须被指定,因为多个不同的函数可能会具有相同的函数名和不同的参数列表。

参数

IF EXISTS

如果该函数不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有函数的名称(可以是模式限定的)。 如果未指定参数列表,则该名称在其模式中必须是唯一的。

argmode

一个参数的模式:IN、OUT、 INOUT或者VARIADIC。如果被忽略,则默认为IN。注意DROP FUNCTION并不真正关心 OUT参数,因为决定函数的身份时只需要输入参数。 因此列出IN、INOUT和 VARIADIC参数足以。

argname

一个参数的名称。注意 DROP FUNCTION并不真正关心参数名称,因为决定函数的身份时只需要参数的数据类型。

argtype

如果函数有参数,这是函数参数的数据类型(可以是模式限定的)。

CASCADE

自动删除依赖于该函数的对象(例如操作符和触发器),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该函数,则拒绝删除它。这是默认值。

示例

这个命令移除平方根函数:

DROP FUNCTION
DROP FUNCTION sqrt(integer);

在一个命令中删除多个函数:

DROP FUNCTION sqrt(integer), sqrt(bigint);

如果函数名称在其模式中是唯一的,则可以在不带参数列表的情况下引用它:

DROP FUNCTION update_employee_salaries;

请注意,这与DROP FUNCTION update_employee_salaries();

不同,后者引用一个零个参数的函数,而第一个变体才可以引用具有任意数量参数的函数,包括零,只要该名称是唯一的。

另见

CREATE FUNCTION, ALTER FUNCTION, DROP PROCEDURE, DROP ROUTINE

DROP GROUP​

DROP GROUP --- 移除一个数据库角色

大纲

DROP GROUP [ IF EXISTS ] name [, ...]

描述

DROP GROUP现在是 DROP ROLE的一个别名。

另见

DROP ROLE

DROP INDEX​

DROP INDEX --- 移除一个索引

大纲

DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP INDEX从数据库系统中移除一个已有的索引。要执行这个命令你必须是该索引的拥有者。

参数

CONCURRENTLY

删除索引并且不阻塞在索引基表上的并发选择、插入、更新和删除操作。一个普通的DROP INDEX会要求该表上的排他锁,这样会阻塞 其他访问直至索引删除完成。通过这个选项,该命令会等待直至冲突事务完成。

在使用这个选项时有一些需要注意的事情。只能指定一个索引名称,并且不支持CASCADE选项(因此,一个支持UNIQUE或者 PRIMARY KEY约束的索引不能以这种方式删除)。还有,常规的DROP INDEX命令可以在一个事务块内执行,而 DROP INDEX CONCURRENTLY不能。最后,不能使用此选项删除分区表上的索引。

对于临时表,DROP INDEX始终是非并发的,因为没有其他会话可以访问它们,而且丢弃非并发索引更加便宜。

IF EXISTS

如果该索引不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的索引的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该索引的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该索引,则拒绝删除它。这是默认值。

示例

这个命令将移除索引title_idx:

DROP INDEX title_idx;

另见

CREATE INDEX

DROP LANGUAGE​

DROP LANGUAGE --- 移除一个过程语言

大纲

DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP LANGUAGE移除一个之前注册的过程语言的定义。你必须是一个超级用户或者该语言的拥有者才能使用 DROP LANGUAGE。

参数

IF EXISTS

如果该语言不存在则不要抛出一个错误,而是发出一个提示。

name

一个已有过程语言的名称。为了向前兼容,这个名称可以用单引号包围。

CASCADE

自动删除依赖于该语言的对象(例如该语言中的函数),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该语言,则拒绝删除它。这是默认值。

示例

这个命令移除过程语言plsample:

DROP LANGUAGE plsample;

另见

ALTER LANGUAGE, CREATE LANGUAGE

DROP MATERIALIZED VIEW​

DROP MATERIALIZED VIEW --- 移除一个物化视图

大纲

DROP MATERIALIZED VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP MATERIALIZED VIEW删除一个现有的物化视图。要执行这个命令你必须是该物化视图的拥有者。

参数

IF EXISTS

如果该物化视图不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的物化视图的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该物化视图的对象(例如其他物化视图或常规视图),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该物化视图,则拒绝删除它。这是默认值。

示例

这个命令将移除名为order_summary的物化视图:

DROP MATERIALIZED VIEW order_summary;

另见

CREATE MATERIALIZED VIEW, ALTER MATERIALIZED VIEW, REFRESH MATERIALIZED VIEW

DROP OPERATOR​

DROP OPERATOR --- 移除一个操作符

大纲

DROP OPERATOR [ IF EXISTS ] name ( { left_type | NONE } , { right_type | NONE } ) [, ...] [ CASCADE | RESTRICT ]

描述

DROP OPERATOR从数据库系统中删除一个现有的操作符。要执行这个命令,你必须是该操作符的拥有者。

参数

IF EXISTS

如果该操作符不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有的操作符的名称(可以是模式限定的)。

left_type

该操作符左操作数的数据类型,如果没有左操作数就写 NONE。

right_type

该操作符右操作数的数据类型,如果没有右操作数就写 NONE。

CASCADE

自动删除依赖于该操作符的对象(例如使用它的视图),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该操作符,则拒绝删除它。这是默认值。

示例

为类型integer移除幂操作符 a^b:

DROP OPERATOR \^ (integer, integer);

为类型bit移除左一元按位补操作符 ~b:

DROP OPERATOR ~ (none, bit);

为类型bigint移除右一元阶乘操作符 x!:

DROP OPERATOR ! (bigint, none);

在一条命令中删除多个操作符:

DROP OPERATOR ~ (none, bit), ! (bigint, none);

另见

CREATE OPERATOR, ALTER OPERATOR

DROP OPERATOR CLASS​

DROP OPERATOR CLASS --- 移除一个操作符类

大纲

DROP OPERATOR CLASS [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]

描述

DROP OPERATOR CLASS删除一个现有的操作符类。要执行这个命令,你必须是该操作符类的拥有者。

DROP OPERATOR CLASS不会删除任何被该类引用的操作符或者函数。如果有索引依赖于该操作符类,你将需要指 定CASCADE来完成删除。

参数

IF EXISTS

如果该操作符类不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有的操作符类的名称(可以是模式限定的)。

index_method

该操作符类适用的索引访问方法的名称。

CASCADE

自动删除依赖于该操作符类的对象(例如索引),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该操作符类,则拒绝删除它。这是默认值。

注解

DROP OPERATOR CLASS将不会删除包含该类的操作符族,即使该族中已经没有任何成员(特别是由 CREATE OPERATOR CLASS隐式创建的族)。一个 空操作符族是无害的,但是为了整洁你可能希望用 DROP OPERATOR FAMILY移除该操作符族,或者 一开始就使用DROP OPERATOR FAMILY会更好。

示例

移除 B-树操作符类widget_ops:

DROP OPERATOR CLASS widget_ops USING btree;

如果有任何使用该操作符类的索引存在,这个命令都不会成功。增加 CASCADE可以把这类索引与该操作符类一起删除。

另见

ALTER OPERATOR CLASS, CREATE OPERATOR CLASS, DROP

OPERATOR FAMILY

DROP OPERATOR FAMILY​

DROP OPERATOR FAMILY --- 移除一个操作符族

大纲

DROP OPERATOR FAMILY [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]

描述

DROP OPERATOR FAMILY删除一个现有的操作符族。要执行这个命令,你必须是该操作符族的拥有者。

DROP OPERATOR FAMILY包括删除该族所包含的任何操作符类,但是它不会删除该族所引用的任何操作符或函数。如果有任何依赖于该族中操作符类的索引存在,你将需要指定CASCADE来完成删除。

参数

IF EXISTS

如果该操作符族不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有操作符族的名称(可以是模式限定的)。

index_method

该操作符族适用的索引访问方法的名称。

CASCADE

自动删除依赖于该操作符族的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该操作符族,则拒绝删除它。这是默认值。

示例

移除 B-树操作符族float_ops:

DROP OPERATOR FAMILY float_ops USING btree;

如果有任何使用该族中操作符类的索引存在,这个命令都不会成功。增加 CASCADE可以把这类索引与该操作符族一起删除。

另见

ALTER OPERATOR FAMILY, CREATE OPERATOR FAMILY, ALTER OPERATOR CLASS, CREATE

OPERATOR CLASS, DROP OPERATOR CLASS

DROP OWNED​

DROP OWNED --- 移除一个数据库角色拥有的数据库对象

大纲

DROP OWNED BY { name | CURRENT_USER | SESSION_USER } [, ...] [ CASCADE | RESTRICT ]

描述

DROP OWNED删除当前数据库中被指定角色之一拥有的所有对象。任何已被授予给给定角色在当前数据库中对象上或者在共享对象(数据库、表空间)上的特权也将会被收回。

参数

name

其对象将被删除并且其特权将被收回的角色的名称。

CASCADE

自动删除依赖于受影响对象的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何其他数据库对象依赖于一个受影响的对象,则拒绝删除一个角色所拥有的对象。这是默认值。

注解

DROP OWNED常常被用来为移除一个或者多个角色做准备。因为DROP OWNED 只影响当前数据库中的对象,通常需要在包含将被移除角色所拥有的对象的每一个数据库中都执行这个命令。

使用CASCADE选项可能导致这个命令递归去删除由其他用户所拥有的对象。

REASSIGN OWNED命令是另一种选择,它可以把一个或多个角色所拥有的所有数据库对象重新授予给其他角色。不过,REASSIGN OWNED不处理其他对象的特权。

角色所拥有的数据库、表空间将不会被移除。

另见

REASSIGN OWNED, DROP ROLE

DROP POLICY​

DROP POLICY --- 从一个表移除一条行级安全性策略

大纲

DROP POLICY [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]

描述

DROP POLICY从该表移除指定的策略。注意如果从一个移除了最后一条策略并且该表的行级安全性仍被 ALTER TABLE启用,则默认的否定策略将被使用。 不管该表的策略存在与否,ALTER TABLE ... DISABLE ROW LEVEL SECURITY都可以被用来禁用一个表的行级安全性。

参数

IF EXISTS

如果该策略不存在也不抛出一个错误。这种情况下会发出一个提示。

name

要删除的策略的名称。

table_name

该策略所在的表的名称(可以被模式限定)。

CASCADE

RESTRICT

这些关键词不会产生效果,因为它们不依赖于策略。

例子

要在名为my_table上删除策略p1:

DROP POLICY p1 ON my_table;

另见

CREATE POLICY, ALTER POLICY

DROP PROCEDURE​

DROP PROCEDURE --- 移除一个过程

大纲

DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype
[, ...] ] ) ] [, ...]
[ CASCADE | RESTRICT ]

简介

DROP PROCEDURE移除一个现有过程的定义。为了执行这个命令,用户必须是该过程的拥有者。该过程的参数类型必须指定,因为可能存在多个不同的过程具有相同名称和不同参数列表。

参数

IF EXISTS

如果该过程不存在也不抛出一个错误。这种情况下会发出一个提示。

name

现有过程的名称(可以是被方案限定的)。如果没有指定参数列表,则该名称在其所属的方案中必须是唯一的。

argmode

参数的模式:IN或者VARIADIC。如果省略,默认为IN。

argname

参数的名称。注意,其实DROP PROCEDURE并不在意参数名称,因为只需要参数的数据类型来确定过程的身份。

argtype

该过程如果有参数,参数的数据类型(可以是被方案限定的)。

CASCADE

自动删除依赖于该过程的对象,然后接着删除依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该过程,则拒绝删除它。这是默认选项。

示例

DROP PROCEDURE do_db_maintenance();

另见

CREATE PROCEDURE, ALTER PROCEDURE, DROP FUNCTION, DROP ROUTINE

DROP PUBLICATION​

DROP PUBLICATION --- 删除一个发布

大纲

DROP PUBLICATION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP PUBLICATION从数据库中删除一个现有的发布。

发布只能被它自己的所有者或超级用户删除。

参数

IF EXISTS

如果发布不存在,不要抛出一个错误。在这种情况下发出一个提示。

name

现有发布的名称。

CASCADE

RESTRICT

这些关键词没有任何作用,因为发布没有依赖关系。

示例

删除一个发布:

DROP PUBLICATION mypublication;

又见

CREATE PUBLICATION, ALTER PUBLICATION

DROP ROLE​

DROP ROLE --- 移除一个数据库角色

大纲

DROP ROLE [ IF EXISTS ] name [, ...]

描述

DROP ROLE移除指定的角色。要删除一个超级用户角色,你必须自己就是一个超级用户。要删除一个非超级用户角色,你必须具有CREATEROLE特权。

如果一个角色仍然被集簇中任何数据库中引用,它就不能被移除。如果尝试 移除将会抛出一个错误。在删除该角色前,你必须删除(或者重新授予所有 权)它所拥有的所有对象并且收回该已经授予给该角色的在其他对象上的特 权。REASSIGN OWNED和DROP OWNED 命令可以用于这个目的。

不过,没有必要移除涉及该角色的角色成员关系。DROP ROLE会自动收回目标角色在其他角色中的成员关系,以及其他角色在目标角色中的成员关系。其他角色不会被删除也不会被影响。

参数

IF EXISTS

如果该角色不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的角色的名称。

注解

Halo包括一个程序dropuser具有和这个命令完全相同的功能(事实上它会调用这个命令),但是该程序可以从shell 运行。

示例

要删除一个角色:

DROP ROLE jonathan;

另见

CREATE ROLE, ALTER ROLE, SET ROLE

DROP ROUTINE​

DROP ROUTINE --- 删除一个例程

大纲

DROP ROUTINE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype
[, ...] ] ) ] [, ...]
[ CASCADE | RESTRICT ]

简介

DROP ROUTINE删除一个现有例程的定义,它可以是一个聚集函数、一个普通函数或者过程。

有关参数的描述、更多的示例以及进一步的细节请参考DROP AGGREGATE、DROP FUNCTION以及DROP PROCEDURE。

示例

删除类型integer的例程foo:

DROP ROUTINE foo(integer);

不管foo是一个聚集、函数或是一个过程,这个命令都能起作用。

另见

DROP AGGREGATE, DROP FUNCTION, DROP PROCEDURE, ALTER ROUTINE

注意CREATE ROUTINE命令不存在。

DROP RULE​

DROP RULE --- 移除一个重写规则

大纲

DROP RULE [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]

描述

DROP RULE删除一个重写规则。

参数

IF EXISTS

如果该规则不存在则不要抛出一个错误,而是发出一个提示。

name

要删除的规则的名称。

table_name

该规则适用的表或视图的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该规则的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该规则,则拒绝删除它。这是默认值。

示例

要删除重写规则newrule:

DROP RULE newrule ON mytable;

另见

CREATE RULE, ALTER RULE

DROP SCHEMA​

DROP SCHEMA --- 移除一个模式

大纲

DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP SCHEMA从数据库中移除模式。

一个模式只能由其拥有者或一个超级用户删除。注意即使拥有者不拥有该模式中的某些对象,也能删除该模式(以及所有含有的对象)。

参数

IF EXISTS

如果该模式不存在则不要抛出一个错误,而是发出一个提示。

name

一个模式的名称。

CASCADE

自动删除包含在该模式中的对象(表、函数等),然后删除所有依赖于那些对象的对象。

RESTRICT

如果该模式含有任何对象,则拒绝删除它。这是默认值。

注解

使用CASCADE选项可能会使这条命令移除除指定模式之外其他模式中的对象。

示例

要从数据库中移除模式mystuff及其中所包含的对象:

DROP SCHEMA mystuff CASCADE;

另见

ALTER SCHEMA, CREATE SCHEMA

DROP SEQUENCE​

DROP SEQUENCE --- 移除一个序列

大纲

DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP SEQUENCE移除序数生成器。一个序列只能被其拥有者或超级用户删除。

参数

IF EXISTS

如果该序列不存在则不要抛出一个错误,而是发出一个提示。

name

一个序列的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该序列的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该序列,则拒绝删除它。这是默认值。

示例

要移除序列serial:

DROP SEQUENCE serial;

另见

CREATE SEQUENCE, ALTER SEQUENCE

DROP SERVER​

DROP SERVER --- 移除一个外部服务器描述符

大纲

DROP SERVER [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP SERVER移除一个现有的外部服务器描述符。要执行这个命令,当前用户必须是该服务器的拥有者。

参数

IF EXISTS

如果该服务器不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有服务器的名称。

CASCADE

自动删除依赖于该服务器的对象(例如用户映射),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该服务器,则拒绝删除它。这是默认值。

示例

如果一个服务器foo存在则删除它:

DROP SERVER IF EXISTS foo;

另见

CREATE SERVER, ALTER SERVER

DROP STATISTICS​

DROP STATISTICS --- 删除扩展统计

大纲

DROP STATISTICS [ IF EXISTS ] name [, ...]

描述

DROP STATISTICS删除数据库中的统计对象。只有统计对象的所有者、模式的所有者或超级用户可以删除统计对象。

参数

IF EXISTS

name

要删除的统计对象的名称(可以有模式修饰)。

示例

删除不同模式中的两个统计对象,如果不存在时不会失败:

DROP STATISTICS IF EXISTS
accounting.users_uid_creation,
public.grants_user_role;

又见

ALTER STATISTICS, CREATE STATISTICS

DROP SUBSCRIPTION​

DROP SUBSCRIPTION --- 删除一个订阅

大纲

DROP SUBSCRIPTION [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP SUBSCRIPTION删除数据库集群中的一个订阅。

只有超级用户才可以删除订阅。

如果订阅与复制槽相关联,就不能在事务块内部执行DROP SUBSCRIPTION。 (可以使用ALTER SUBSCRIPTION取消关联复制槽。)

参数

name

要删除的订阅的名称。

CASCADE

RESTRICT

这些关键词没有任何作用,因为订阅没有依赖关系。

注意

当删除与远程主机(正常状态)上的复制槽相关联的订阅时,DROP SUBSCRIPTION 将连接到远程主机,并尝试删除该复制槽,作为其操作的一部分。这是必要的,以便释放远程主机上为订阅分配的资源。如果失败,因为远程主机不可访问,或者因为远程复制槽不能被删除,或者复制槽不存在或从不存在, 则DROP SUBSCRIPTION命令将失败。要在这种情况下继

续,请执行ALTER SUBSCRIPTION ... SET (slot_name = NONE) 来解除复制槽与订阅的关联。之后,DROP SUBSCRIPTION 将不再尝试对远程主机执行任何操作。请注意,如果远程复制槽仍然存在,则应手动删除该插槽;否则将继续保留WAL,最终可能导致磁盘空间不足。

如果订阅与复制槽相关联,那么不能在事务块内部执行DROP SUBSCRIPTION。

示例

删除一个订阅:

DROP SUBSCRIPTION mysub;

又见

CREATE SUBSCRIPTION, ALTER SUBSCRIPTION

DROP TABLE​

DROP TABLE --- 移除一个表

大纲

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP TABLE从数据库移除表。只有表拥有者、模式拥有者和超级用户能删除一个表。要清空一个表中的行但是不销毁该表,可以使用DELETE或者TRUNCATE。

DROP TABLE总是移除目标表的任何索引、规则、触发器和约束。不过,要删除一个被视图或者另一个表的外键约束所引用的表,必须指定CASCADE(CASCADE将会把依赖的视图也完全移除,但是对于外键它将只移除外键约束,而完全不会移除其他表)。

参数

IF EXISTS

如果该表不存在则不要抛出一个错误,而是发出一个提示。

name

要删除的表的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该表的对象(例如视图),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该表,则拒绝删除它。这是默认值。

示例

要销毁两个表films和 distributors:

DROP TABLE films, distributors;

另见

ALTER TABLE, CREATE TABLE

DROP TABLESPACE​

DROP TABLESPACE --- 移除一个表空间

大纲

DROP TABLESPACE [ IF EXISTS ] name

描述

DROP TABLESPACE从系统中移除一个表空间。

一个表空间只能被其拥有者或超级用户删除。在一个表空间能被删除前,其中必须没有任何数据库对象。即使当前数据库中没有对象正在使用该表空间,也可能有其他数据库的对象存在于其中。还有,如果该表空间被列在任何活动会 话的temp_tablespaces设置中,DROP也可能会失败,因为可能有临时文件存在其中。

参数

IF EXISTS

如果该表空间不存在则不要抛出一个错误,而是发出一个提示。

name

一个表空间的名称。

注解

DROP TABLESPACE不能在一个事务块内执行。

示例

要从系统移除表空间mystuff:

DROP TABLESPACE mystuff;

另见

CREATE TABLESPACE, ALTER TABLESPACE

DROP TEXT SEARCH CONFIGURATION​

DROP TEXT SEARCH CONFIGURATION --- 移除一个文本搜索配置

大纲

DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP TEXT SEARCH CONFIGURATION 删除一个现有的文本搜索配置。要执行这个命令,你必须是该配置的拥有者。

参数

IF EXISTS

如果该文本搜索配置不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有文本搜索配置的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该文本搜索配置的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该文本搜索配置,则拒绝删除它。这是默认值。

示例

移除文本搜索配置my_english:

DROP TEXT SEARCH CONFIGURATION my_english;

如果有任何在to_tsvector调用中引用该配置的索引存在,这个命令都不会成功。增加CASCADE 可以把这类索引与该文本搜索配置一起删除。

另见

ALTER TEXT SEARCH CONFIGURATION, CREATE TEXT SEARCH CONFIGURATION

DROP TEXT SEARCH DICTIONARY​

DROP TEXT SEARCH DICTIONARY --- 移除一个文本搜索字典

大纲

DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP TEXT SEARCH DICTIONARY删除一个现有的文本搜索字典。要执行这个命令,你必须是该字典的拥有者。

参数

IF EXISTS

如果该文本搜索字典不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有文本搜索字典的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该文本搜索字典的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该文本搜索字典,则拒绝删除它。这是默认值。

示例

移除文本搜索字典english:

DROP TEXT SEARCH DICTIONARY english;

如果有任何使用该字典的文本搜索配置存在,这个命令都不会成功。增加 CASCADE可以把这类配置与字典一起删除。

另见

ALTER TEXT SEARCH DICTIONARY, CREATE TEXT SEARCH DICTIONARY

DROP TEXT SEARCH PARSER​

DROP TEXT SEARCH PARSER --- 移除一个文本搜索解析器

大纲

DROP TEXT SEARCH PARSER [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP TEXT SEARCH PARSER删除一个 现有的文本搜索解析器。你必须作为一个超级用户来使用这个命令。

参数

IF EXISTS

如果该文本搜索解析器不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有文本搜索解析器的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该文本搜索解析器的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该文本搜索解析器,则拒绝删除它。这是默认值。

示例

移除文本搜索解析器my_parser:

DROP TEXT SEARCH PARSER my_parser;

如果有任何使用该解析器的文本搜索配置存在,这个命令都不会成功。增加 CASCADE可以把这类配置与解析器一起删除。

另见

ALTER TEXT SEARCH PARSER, CREATE TEXT SEARCH PARSER

DROP TEXT SEARCH TEMPLATE​

DROP TEXT SEARCH TEMPLATE --- 移除一个文本搜索模板

大纲

DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] name [ CASCADE | RESTRICT ]

描述

DROP TEXT SEARCH TEMPLATE删除一个现有的文本搜索模板。你必须作为一个超级用户来使用这个命令。

参数

IF EXISTS

如果该文本搜索模板不存在则不要抛出一个错误,而是发出一个提示。

name

一个现有文本搜索模板的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该文本搜索模板的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该文本搜索模板,则拒绝删除它。这是默认值。

示例

移除文本搜索模板thesaurus:

DROP TEXT SEARCH TEMPLATE thesaurus;

如果有任何使用该模板的文本搜索字典存在,这个命令都不会成功。增加 CASCADE可以把这类字典与模板一起删除。

另见

ALTER TEXT SEARCH TEMPLATE, CREATE TEXT SEARCH TEMPLATE

DROP TRANSFORM​

DROP TRANSFORM --- 移除转换

大纲

DROP TRANSFORM [ IF EXISTS ] FOR type_name LANGUAGE lang_name [ CASCADE | RESTRICT ]

简介

DROP TRANSFORM移除一个之前定义的转换。

为了删除一种转换,你必须拥有该类型和语言。这些同样也是创建转换所需要的特权。

参数

IF EXISTS

如果该转换不存在也不要抛出一个错误。这种情况下会发出一个提示。

type_name

该转换的数据类型的名称。

lang_name

该转换的语言的名称。

CASCADE

自动删除依赖于该转换的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该转换,则拒绝删除它。这是默认行为。

示例

要删除用于类型hstore和语言plpythonu 的转换:

DROP TRANSFORM FOR hstore LANGUAGE plpythonu;

另见

CREATE TRANSFORM

DROP TRIGGER​

DROP TRIGGER --- 移除一个触发器

大纲

DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]

描述

DROP TRIGGER移除一个现有的触发器定义。要执行这个命令,当前用户必须是触发器基表的拥有者。

参数

IF EXISTS

如果该触发器不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的触发器的名称。

table_name

定义了该触发器的表的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该触发器的对象,然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该触发器,则拒绝删除它。这是默认值。

示例

销毁表films上的触发器 if_dist_exists:

DROP TRIGGER if_dist_exists ON films;

另见

CREATE TRIGGER

DROP TYPE​

DROP TYPE --- 移除一个数据类型

大纲

DROP TYPE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP TYPE移除一种用户定义的数据类型。 只有一个类型的拥有者才能移除它。

参数

IF EXISTS

如果该类型不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的数据类型的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该类型的对象(例如表列、函数、操作符),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该类型,则拒绝删除它。这是默认值。

示例

要移除数据类型box:

DROP TYPE box;

另见

ALTER TYPE, CREATE TYPE

DROP USER​

DROP USER --- 移除一个数据库角色

大纲

DROP USER [ IF EXISTS ] name [, ...]

描述

DROP USER现在是 DROP ROLE另一种写法。

另见

DROP ROLE

DROP USER MAPPING​

DROP USER MAPPING --- 移除一个用于外部服务器的用户映射

大纲

DROP USER MAPPING [ IF EXISTS ] FOR { user_name | USER | CURRENT_USER | PUBLIC }
SERVER server_name

描述

DROP USER MAPPING从外部服务器移除一个已有的用户映射。

一个外部服务器的拥有者可以为该服务器的任何用户删除用户映射。如果 该服务器上的USAGE特权被授予了一个用户,它也能删除用于它们自己的用户名的用户映射。

参数

IF EXISTS

如果该用户映射不存在则不要抛出一个错误,而是发出一个提示。

user_name

该映射的用户名。CURRENT_USER 和USER匹配当前用户的名称。PUBLIC 被用来匹配系统中所有现存和未来的用户名。

server_name

用户映射的服务器名。

示例

删除一个用户映射bob(服务器foo),如果它存在:

DROP USER MAPPING IF EXISTS FOR bob SERVER foo;

另见

CREATE USER MAPPING, ALTER USER MAPPING

DROP VIEW​

DROP VIEW --- 移除一个视图

大纲

DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

描述

DROP VIEW删除一个现有的视图。要执行这个命令你必须是该视图的拥有者。

参数

IF EXISTS

如果该视图不存在则不要抛出一个错误,而是发出一个提示。

name

要移除的视图的名称(可以是模式限定的)。

CASCADE

自动删除依赖于该视图的对象(例如其他视图),然后删除所有依赖于那些对象的对象。

RESTRICT

如果有任何对象依赖于该视图,则拒绝删除它。这是默认值。

示例

这个命令将移除名为kinds的视图:

DROP VIEW kinds;

另见

ALTER VIEW, CREATE VIEW