-
示例 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 --创建一个表tb_for_label。
gaussdb=# CREATE TABLE tb_for_label(col1 text, col2 text, col3 text);
--基于表创建资源标签。
gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label);
--再次创建已存在的表资源标签,对比加参数IF NOT EXISTS与不加IF NOT EXISTS参数的区别。
gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label);
NOTICE: table_label label already defined, skipping
CREATE RESOURCE LABEL
gaussdb=# CREATE RESOURCE LABEL table_label add TABLE(public.tb_for_label);
ERROR: table_label label already defined
--基于列创建资源标签。
gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS column_label add COLUMN(public.tb_for_label.col1);
--创建一个模式schema_for_label。
gaussdb=# CREATE SCHEMA schema_for_label;
--基于模式创建资源标签。
gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS schema_label add SCHEMA(schema_for_label);
--创建一个视图view_for_label。
gaussdb=# CREATE VIEW view_for_label AS SELECT 1;
--基于视图创建资源标签。
gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS view_label add VIEW(view_for_label);
--创建一个函数func_for_label。
gaussdb=# CREATE FUNCTION func_for_label RETURNS TEXT AS $$ SELECT col1 FROM tb_for_label; $$ LANGUAGE SQL;
--基于函数创建资源标签。
gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS func_label add FUNCTION(func_for_label);
--删除表资源标签table_label。
gaussdb=# DROP RESOURCE LABEL IF EXISTS table_label;
--删除列资源资源标签column_label。
gaussdb=# DROP RESOURCE LABEL IF EXISTS column_label;
--删除函数资源标签func_for_label。
gaussdb=# DROP FUNCTION func_for_label;
--删除视图资源标签view_for_label。
gaussdb=# DROP VIEW view_for_label;
--删除模式资源标签schema_for_label。
gaussdb=# DROP SCHEMA schema_for_label;
--删除表tb_for_label。
gaussdb=# DROP TABLE tb_for_label;
-
注意事项 所有该角色在当前数据库里和共享对象(数据库,表空间) 上的所有对象上的权限都将被撤销。 DROP OWNED常常被用来为移除一个或者多个角色做准备。因为DROP OWNED只影响当前数据库中的对象,通常需要在包含将被移除角色所拥有的对象的每一个数据库中都执行这个命令。 使用CASCADE选项可能导致这个命令递归去删除由其他用户所拥有的对象。 角色所拥有的数据库、表空间将不会被移除。 角色所拥有的私有DATABASE LINK连接需要添加CASCADE才可删除。
-
示例 --向gs_global_config系统表中插入单个弱口令。
gaussdb=# CREATE WEAK PASSWORD DICTIONARY WITH VALUES ('********');
--查看gs_global_config系统表现有的弱口令。
gaussdb=# SELECT * FROM gs_global_config WHERE NAME LIKE 'weak_password';
name | value
-----------------+--------------
weak_password | ********
(1 rows)
--清空gs_global_config系统表中所有弱口令。
gaussdb=# DROP WEAK PASSWORD DICTIONARY;
--查看现有弱口令。
gaussdb=# SELECT * FROM gs_global_config WHERE NAME LIKE 'weak_password';
name | value
------+-------
(0 rows)
-
示例 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 --查看现有预备语句。
gaussdb=# SELECT name, statement, parameter_types FROM pg_prepared_statements;
name | statement | parameter_types
------+-----------+-----------------
(0 rows)
--创建q1,q2,q3,q4四个预备语句。
gaussdb=# PREPARE q1 AS SELECT 1 AS a;
PREPARE
gaussdb=# PREPARE q2 AS SELECT 1 AS a;
PREPARE
gaussdb=# PREPARE q3 AS SELECT 1 AS a;
PREPARE
gaussdb=# PREPARE q4 AS SELECT 1 AS a;
PREPARE
--再次查看现有预备语句。
gaussdb=# SELECT name, statement, parameter_types FROM pg_prepared_statements;
name | statement | parameter_types
------+------------------------------+-----------------
q1 | PREPARE q1 AS SELECT 1 AS a; | {}
q4 | PREPARE q4 AS SELECT 1 AS a; | {}
q3 | PREPARE q3 AS SELECT 1 AS a; | {}
q2 | PREPARE q2 AS SELECT 1 AS a; | {}
(4 rows)
--删除q4预备语句并查看剩余预备语句。
gaussdb=# DEALLOCATE q4;
gaussdb=# SELECT name, statement, parameter_types FROM pg_prepared_statements;
name | statement | parameter_types
------+------------------------------+-----------------
q1 | PREPARE q1 AS SELECT 1 AS a; | {}
q3 | PREPARE q3 AS SELECT 1 AS a; | {}
q2 | PREPARE q2 AS SELECT 1 AS a; | {}
(3 rows)
--删除所有预备语句并查看剩余预备语句。
gaussdb=# DEALLOCATE ALL;
DEALLOCATE ALL
gaussdb=# SELECT name, statement, parameter_types FROM pg_prepared_statements;
name | statement | parameter_types
------+-----------+-----------------
(0 rows)
-
示例 --创建源表及触发表。
gaussdb=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT);
gaussdb=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); INSERT触发器的使用。 --创建insert触发器函数。
gaussdb=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
RETURN NEW;
END
$$ LANGUAGE plpgsql;
--创建INSERT触发器。
gaussdb=# CREATE TRIGGER insert_trigger
BEFORE INSERT ON test_trigger_src_tbl
FOR EACH ROW
EXECUTE PROCEDURE tri_insert_func();
--执行INSERT触发事件并检查触发结果。
gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300);
gaussdb=# SELECT * FROM test_trigger_src_tbl;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
(1 row)
gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
(1 row) 匿名块和OR REPLACE语法创建触发器。 --使用匿名块语法创建INSERT触发器。
gaussdb=# CREATE TRIGGER insert_trigger_with_anonyblock
BEFORE INSERT ON test_trigger_src_tbl
FOR EACH ROW
DECLARE
BEGIN
INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
RETURN NEW;
END;
/
--使用OR REPLACE语法创建INSERT触发器。
gaussdb=# CREATE OR REPLACE TRIGGER insert_trigger_with_anonyblock
BEFORE INSERT ON test_trigger_src_tbl
FOR EACH ROW
DECLARE
BEGIN
INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
RETURN NEW;
END;
/
--删除触发器。
gaussdb=# DROP TRIGGER insert_trigger_with_anonyblock ON test_trigger_src_tbl; -- 会将隐式创建的函数insert_trigger_with_anonyblock一起删除 UPDATE触发器的使用。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 --创建UPDATE触发器函数。
gaussdb=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1;
RETURN OLD;
END
$$ LANGUAGE plpgsql;
--创建UPDATE触发器。
gaussdb=# CREATE TRIGGER update_trigger
AFTER UPDATE ON test_trigger_src_tbl
FOR EACH ROW
EXECUTE PROCEDURE tri_update_func();
--执行UPDATE触发事件并检查触发结果。
gaussdb=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100;
gaussdb=# SELECT * FROM test_trigger_src_tbl;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 400
(1 row)
gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。
id1 | id2 | id3
-----+-----+-----
100 | 200 | 400
(1 row)
DELETE触发器的使用。 --创建DELETE触发器函数。
gaussdb=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1;
RETURN OLD;
END
$$ LANGUAGE plpgsql;
--创建DELETE触发器。
gaussdb=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func();
--执行DELETE触发事件并检查触发结果。
gaussdb=# DELETE FROM test_trigger_src_tbl WHERE id1=100;
gaussdb=# SELECT * FROM test_trigger_src_tbl;
id1 | id2 | id3
-----+-----+-----
(0 rows)
gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。
id1 | id2 | id3
-----+-----+-----
(0 rows) 修改触发器名称。 1
2 --修改触发器的名称。
gaussdb=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed;
禁用触发器。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 --禁用insert_trigger触发器。
gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger;
gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300);
gaussdb=# SELECT * FROM test_trigger_src_tbl;
id1 | id2 | id3
-----+-----+-----
100 | 200 | 300
(1 row)
gaussdb=# SELECT * FROM test_trigger_des_tbl; //可以看到触发器没有生效。
id1 | id2 | id3
-----+-----+-----
(0 rows)
--禁用当前表上所有触发器。
gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL;
删除触发器。 1
2
3
4
5 gaussdb=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl;
gaussdb=# DROP TRIGGER update_trigger ON test_trigger_src_tbl;
gaussdb=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl;
删除函数。 1
2
3
4
5 gaussdb=# DROP FUNCTION tri_insert_func;
gaussdb=# DROP FUNCTION tri_update_func;
gaussdb=# DROP FUNCTION tri_delete_func;
1
2
3 --删除源表及触发表。
gaussdb=# DROP TABLE test_trigger_src_tbl;
gaussdb=# DROP TABLE test_trigger_des_tbl;
-
参数说明 IF EXISTS 如果指定的触发器不存在,则发出一个notice而不是抛出一个错误。 trigger_name 要删除的触发器名称。 取值范围:已存在的触发器。 table_name 要删除的触发器所在的表名称。 取值范围:已存在的含触发器的表。 CASCADE | RESTRICT CASCADE:级联删除依赖此触发器的对象。 RESTRICT:如果有依赖对象存在,则拒绝删除此触发器。此选项为缺省值。
-
注意事项 DROP TABLE删除表后,依赖该表的索引会被删除,而使用到该表的函数和存储过程将无法执行。删除分区表,会同时删除分区表中的所有分区。 表的所有者、表所在模式的所有者、被授予了表的DROP权限的用户或被授予DROP ANY TABLE权限的用户,有权删除指定表,三权分立关闭时,系统管理员默认拥有该权限。 DROP TABLE时,如果被指删除的表作为外键表引用了另一张表,会级联删除被引用表上的触发器,此时需要对被引用表加八级锁,可能造成业务的阻塞。
-
参数说明 IF EXISTS 如果指定的表不存在,则发出一个notice而不是抛出一个error。 schema 模式名称。 table_name 表名称。 CASCADE | RESTRICT CASCADE:表示允许级联删除依赖于该表的对象(比如视图、触发器、索引;注:关联的表对象无法被级联删除)。 RESTRICT:表示有依赖于该表的对象存在时,该表无法被删除。此选项为缺省值。 PURGE 该参数表示即使开启回收站功能,使用DROP TABLE删除表时,也会直接物理删除表,而不是将其放入回收站中。
-
示例 --创建角色role11。
gaussdb=# CREATE ROLE role11 PASSWORD '********';
CREATE ROLE
--删除role11角色。
gaussdb=# DROP ROLE IF EXISTS role11;
DROP ROLE
--删除不存在的角色role12。
gaussdb=# DROP ROLE IF EXISTS role12;
NOTICE: role "role12" does not exist, skipping
DROP ROLE
-
示例 -- 创建自定义函数。
gaussdb=# CREATE OR REPLACE FUNCTION int_add(int,int)
RETURNS int AS $BODY$
declare
begin
return $1 + $2;
end;
$BODY$ language plpgsql;
-- 创建聚合函数。
gaussdb=# CREATE AGGREGATE myavg(int)
(
sfunc = int_add,
stype = int,
initcond = '0'
);
--将int类型的聚合函数myavg删除。
gaussdb=# DROP AGGREGATE myavg(int);
-- 删除自定义函数。
gaussdb=# DROP FUNCTION int_add(int,int);
-
注意事项 须使用CASCADE级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的线程被终止。 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即DROP USER不支持跨数据库进行级联删除。 在删除用户时,需要先删除该用户拥有的所有对象并且收回该用户在其他对象上的权限,或者通过指定CASCADE级联删除该用户拥有的对象和被授予的权限。
-
参数说明 IF EXISTS 使用该参数时,如果指定的用户不存在,发出一个notice而不是抛出一个错误,故使用该参数可以避免出现报错。 user_name 待删除的用户名。 取值范围:数据库中已存在的用户名。 CASCADE | RESTRICT CASCADE:级联删除依赖用户的对象,并收回授予该用户的权限。 RESTRICT:如果用户还有任何依赖的对象或被授予了其他对象的权限,则拒绝删除该用户(缺省行为)。 在
GaussDB 中,存在一个配置参数enable_kill_query,此参数在配置文件gaussdb.conf中。此参数影响级联删除用户对象的行为: 当参数enable_kill_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的线程,并删除用户。 当参数enable_kill_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的线程结束之后再删除用户。
-
示例 --创建用户jim,登录密码为********。
gaussdb=# CREATE USER jim PASSWORD '********';
--删除不存在的tom用户。
gaussdb=# DROP USER IF EXISTS tom;
NOTICE: role "tom" does not exist, skipping
DROP ROLE
--删除用户。
gaussdb=# DROP USER jim CASCADE;
-
注意事项 只有表空间所有者或者被授予了表空间DROP权限的用户有权限执行DROP TABLESPACE命令,系统管理员默认拥有此权限。 在删除一个表空间之前,表空间里面不能有任何数据库对象,否则会报错。 DROP TABLESPACE不支持回滚,因此,不能出现在事务块内部。 执行DROP TABLESPACE操作时,如果有另外的会话执行\db查询操作,可能会由于TABLESPACE事务的原因导致查询失败,请重新执行\db查询操作。 如果执行DROP TABLESPACE失败,需要再次执行一次DROP TABLESPACE IF EXISTS。
-
功能描述 DECLARE命令既可以定义一个游标,用于在一个大的查询里面检索少数几行数据,也可以作为一个匿名块的开始。 本节主要描述定义为游标的用法,定义为匿名块的用法见BEGIN。 为了处理SQL语句,存储过程线程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 通常游标和SELECT一样返回文本格式。因为数据在系统内部是用二进制格式存储的,系统必须对数据做一定转换以生成文本格式。一旦数据是以文本形式返回,客户端应用需要把它们转换成二进制进行操作。使用FETCH语句,游标可以返回文本或二进制格式。