系统信息函数
系统信息函数
VITO_ch123 发表于1年前
系统信息函数
  • 发表于 1年前
  • 阅读 19
  • 收藏 2
  • 点赞 0
  • 评论 0
摘要: 本文主要介绍系统信息函数的用法

会话信息函数使用

查询当前数据库名
testdb=# select current_catalog,current_database();
 current_database | current_database 
------------------+------------------
 testdb           | testdb
(1 row)

当前执行的查询文本
testdb=# select current_query();
      current_query      
-------------------------
 select current_query();
(1 row)

当前模式名
testdb=# select current_schema,current_schema();
 current_schema | current_schema 
----------------+----------------
 public         | public
(1 row)

搜索路径中的模式名字,包括可选的隐式模式。
testdb=# select current_schemas('true');
   current_schemas   
---------------------
 {pg_catalog,public}
(1 row)

当前执行坏境下的用户名
testdb=# select current_user;
 current_user 
--------------
 pg94
(1 row)

查询服务器端地址和端口
testdb=# select inet_server_addr(),inet_client_port();
 inet_server_addr | inet_client_port 
------------------+------------------
 10.167.130.63    |            18267
(1 row)

查询客户端地址和端口
testdb=# select inet_client_addr(),inet_client_port();
 inet_client_addr | inet_client_port 
------------------+------------------
 10.167.130.40    |            18267
(1 row)

查询连接服务器当前会话的pid
select pg_backend_pid()
testdb=# select pg_backend_pid();
 pg_backend_pid 
----------------
          13290
(1 row)

查询配置的加载时间
testdb=# select pg_conf_load_time();
       pg_conf_load_time       
-------------------------------
 2016-07-06 23:09:36.770331+08
(1 row)

是否为另一个会话的临时模式
testdb=# select pg_is_other_temp_schema(16794);
 pg_is_other_temp_schema 
-------------------------
 f
(1 row)


正在监听当前会话的信道名称
session A 启动监听
testdb=# listen vito;
LISTEN
查询信道名称
testdb=# select pg_listening_channels();
 pg_listening_channels 
-----------------------
 vito
(1 row)
session B 发送信号
testdb=# notify vito,'1';
NOTIFY
testdb=# notify vito,'2';
NOTIFY
session A 接收信号
testdb=# begin;
BEGIN
Asynchronous notification "vito" with payload "1" received from server process with PID 13290.
Asynchronous notification "vito" with payload "2" received from server process with PID 13290.

会话的临时模式OID
testdb=# create temp table tmptbl(id int);
CREATE TABLE
testdb=# select pg_my_temp_schema();
 pg_my_temp_schema 
-------------------
             16807
(1 row)

查询服务器启动时间
testdb=# select pg_postmaster_start_time();
   pg_postmaster_start_time    
-------------------------------
 2016-07-06 23:09:36.822438+08
(1 row)

查询当前服务器的嵌套级别
testdb=# select pg_trigger_depth();
 pg_trigger_depth 
------------------
                0
(1 row)

会话用户名
testdb=# select session_user;
 session_user 
--------------
 pg94
(1 row)

当前用户
testdb=# select user;
 current_user 
--------------
 pg94
(1 row)

查询数据库版本
testdb=# select version();
                                                    version             
                                       
------------------------------------------------------------------------
---------------------------------------
 PostgreSQL 9.4.5 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4
.7 20120313 (Red Hat 4.4.7-17), 64-bit
(1 row)

访问权限查询函数

查询用户对表所有行的权限
testdb=# select has_any_column_privilege('pg94','testvarchar','update'); has_any_column_privilege 
--------------------------
 t
(1 row)

查询当前用户对表所有行的权限
testdb=# select has_any_column_privilege('testvarchar','update');
 has_any_column_privilege 
--------------------------
 t
(1 row)
表的权限必须为:SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES 或TRIGGER

查询指定用户对指定表的行的权限
testdb=# select has_column_privilege('pg94','testvarchar','id','update');
 has_column_privilege 
----------------------
 t
(1 row)

查询指定用户对指定表的行的权限
testdb=# select has_column_privilege('testvarchar','id','update');
 has_column_privilege 
----------------------
 t
(1 row)
行权限可以是:SELECT,INSERT,UPDATE,REFERENCES.

查询用户对数据的访问权限:

testdb=# select has_database_privilege('pg94','testdb','temp');
 has_database_privilege 
------------------------
 t
(1 row)
查询当前用户对数据库的访问权限
testdb=# select has_database_privilege('testdb','temp');
 has_database_privilege 
------------------------
 t
(1 row)
 用户对数据库的权限必须是:create,connect,temporary,temp.

查询指定用户对外部数据封装器的权限
testdb=# select has_foreign_data_wrapper_privilege('pg94','postgres_fdw','usage');
 has_foreign_data_wrapper_privilege 
------------------------------------
 t
(1 row)
查询当前用户对外部数据封装器的权限
testdb=# select has_foreign_data_wrapper_privilege('postgres_fdw','usage');
 has_foreign_data_wrapper_privilege 
------------------------------------
 t
(1 row)
用户对数据封装器的权限为:USAGE。

用户对函数的访问权限
testdb=# select has_function_privilege('pg94','testfun(int)','execute'); has_function_privilege 
------------------------
 t
(1 row)

当前用户对函数的访问权限
testdb=# select has_function_privilege('testfun(int)','execute'); has_function_privilege 
------------------------
 t
(1 row)
用户对函数的访问权限为:execute.

用户对语言的访问权限
testdb=# select has_language_privilege('pg94','plpgsql','usage');
 has_language_privilege 
------------------------
 t
(1 row)
当前用户对语言的访问权限
testdb=# select has_language_privilege('plpgsql','usage');
 has_language_privilege 
------------------------
 t
(1 row)
 用户对语言的访问权限:usage.

用户对模式的访问权限
testdb=# select has_schema_privilege('pg94','testsc','create');
 has_schema_privilege 
----------------------
 t
(1 row)
当前用户对模式的访问权限
testdb=# select has_schema_privilege('testsc','create,usage');
 has_schema_privilege 
----------------------
 t
(1 row)
 用户对模式的访问权限有:create,usage或者组合。

用户对序列的访问权限
testdb=# select has_sequence_privilege('pg94','testseq','select');
 has_sequence_privilege 
------------------------
 t
(1 row)
当前用户对序列的访问权限
testdb=# select has_sequence_privilege('testseq','select');
 has_sequence_privilege 
------------------------
 t
(1 row)
用户对序列的权限有:USAGE,UPDATE,SELECT之一

用户对外部服务的权限
testdb=# select has_server_privilege('pg94','server_remote_71','usage');
 has_server_privilege 
----------------------
 t
(1 row)
当前用户对外部服务的权限
testdb=# select has_server_privilege('server_remote_71','usage');
 has_server_privilege 
----------------------
 t
(1 row)
用户对外部服务的访问权限:usage

指定用户访问表的权限
testdb=# select has_table_privilege('pg94','testvarchar','select');
 has_table_privilege 
---------------------
 t
(1 row)
当前用户访问表的权限
testdb=# select has_table_privilege('testvarchar','select');
 has_table_privilege 
---------------------
 t
(1 row)
也可以使用OID
用户对表的访问权限:INSERT,DELETE,UPDATE,SELECT,TRUNCATE,REFERENCE,TRIGGER之一。

指定用户对表空间的访问权限
testdb=# select  has_tablespace_privilege('pg94','testspac','create');
 has_tablespace_privilege 
--------------------------
 t
(1 row)
当前用户对表空间的访问权限
testdb=# select  has_tablespace_privilege('testspac','create');
 has_tablespace_privilege 
--------------------------
 t
(1 row)
用户对表空间的权限:create

查询指定用户是否有角色的权限
testdb=# select pg_has_role('pg94','testrole','usage');
 pg_has_role 
-------------
 t
(1 row)
当前用户是否有指定角色权限
testdb=# select pg_has_role('testrole','usage');
 pg_has_role 
-------------
 t
(1 row)
用户对角色的权限:MEMBER,USAGE.

模式可见性查询函数


查询排序在搜索路径中是否可见
testdb=# select pg_collation_is_visible(100); --C排序
 pg_collation_is_visible 
-------------------------
 t
(1 row)

查询转换在搜索路径中是否可见
testdb=# select pg_conversion_is_visible(12201); --ascii_to_mic转换
 pg_conversion_is_visible 
--------------------------
 t
(1 row)


查询该函数在搜索路径中是否可见
testdb=# select pg_function_is_visible('testfun'::regproc);
 pg_function_is_visible 
------------------------
 t
(1 row)

查询操作符类在搜索路径中是否可见
testdb=# select pg_opclass_is_visible(10007); --abstime_ops操作符类
 pg_opclass_is_visible 
-----------------------
 t
(1 row)

查询操作符在搜索路径中是否可见
testdb=# select pg_operator_is_visible(91); =操作符
 pg_operator_is_visible 
------------------------
 t
(1 row)

查询操作符族是否在搜索路径中可见
testdb=# select pg_opfamily_is_visible(431); --char_ops
 pg_opfamily_is_visible 
------------------------
 t
(1 row)

查询表在搜索路径中是否可见   该函数可以用于视图,索引,序列
testdb=# select pg_table_is_visible('testvarchar'::regclass);
 pg_table_is_visible 
---------------------
 t
(1 row)

查询文本检索配置在搜索路径中是否可见
testdb=# select pg_ts_config_is_visible(12434);  --german 配置
 pg_ts_config_is_visible 
-------------------------
 t
(1 row)

查询文本检索词典在搜索路径中是否可见

testdb=# select pg_ts_dict_is_visible(12433); --german_stem
 pg_ts_dict_is_visible 
-----------------------
 t
(1 row)

查收文本搜索解析在搜索路径中是否可见
testdb=# select pg_ts_parser_is_visible(3722); --default
 pg_ts_parser_is_visible 
-------------------------
 t
(1 row)

文本检索模板是否在搜索路径中可见
testdb=# select pg_ts_template_is_visible(12422); --snowball
 pg_ts_template_is_visible 
---------------------------
 t
(1 row)

该类型是否在搜索路经中可见
testdb=# select pg_type_is_visible('int2vector'::regtype);
 pg_type_is_visible 
--------------------
 t
(1 row)

所有的参数均是使用OID
可以使用regclass,regtype,regprocedure,regoperator,regconfig,regdictionary对名称进行转换。


系统表信息函数

 

获取一个数据类型的SQL名称
testdb=# select format_type(atttypid,atttypmod) from pg_attribute limit 1;
 format_type 
-------------
 name
(1 row)


获取一个数据库对象的描述
pg_describe_object(catalog_id, object_id, object_sub_id)
获取一个数据库对象的身份
pg_identify_object(catalog_id oid, object_id oid, object_sub_id integer)


获取一个约束的定义
testdb=# select pg_get_constraintdef(16862);
 pg_get_constraintdef 
----------------------
 PRIMARY KEY (id)
(1 row)

testdb=# select pg_get_constraintdef(16862,'true');
 pg_get_constraintdef 
----------------------
 PRIMARY KEY (id)
(1 row)

反编译一个表达式的内部形式,假设其中的任何 Var 都引用第二个参数指出的关系
pg_get_expr(pg_node_tree, relation_oid) 
pg_get_expr(pg_node_tree, relation_oid, pretty_bool)

获取一个函数的定义
testdb=# select pg_get_functiondef('testfun'::regproc);
                  pg_get_functiondef                   
-------------------------------------------------------
 CREATE OR REPLACE FUNCTION public.testfun(id integer)+
  RETURNS integer                                     +
  LANGUAGE plpgsql                                    +
 AS $function$                                        +
 begin                                                +
 return $1; end;                                      +
 $function$                                           +
 
(1 row)
获取函数定义的参数列表
testdb=# select pg_get_function_arguments('testfun'::regproc);
 pg_get_function_arguments 
---------------------------
 id integer
(1 row)
获取参数列表来确定一个函数
testdb=# select pg_get_function_identity_arguments('testfun'::regproc);
 pg_get_function_identity_arguments 
------------------------------------
 id integer
(1 row)

获取函数的returns子句testdb=# select pg_get_function_result('testfun'::regproc);
 pg_get_function_result 
------------------------
 integer
(1 row)




获取索引的create index 命令
testdb=# select pg_get_indexdef('testvar_idx'::regclass);
                     pg_get_indexdef                      
----------------------------------------------------------
 CREATE INDEX testvar_idx ON testvarchar USING btree (id)
(1 row)

获取索引的create index
testdb=# select pg_get_indexdef('testvar_idx'::regclass,1,'true');
 pg_get_indexdef 
-----------------
 id
(1 row)

如果第二个参数为0,和上面一样,如果不为0则只获取一个字段。
testdb=# select pg_get_indexdef('testvar_idx'::regclass,0,'false');
                     pg_get_indexdef                      
----------------------------------------------------------
 CREATE INDEX testvar_idx ON testvarchar USING btree (id)
(1 row)

获取SQL关键字和类型列表
testdb=# select * from pg_get_keywords() limit 2;
   word   | catcode |  catdesc   
----------+---------+------------
 abort    | U       | unreserved
 absolute | U       | unreserved
(2 rows)

获取rule的create 命令
testdb=# select pg_get_ruledef(16864);  oid位于pg_rewrite
                     pg_get_ruledef                      
---------------------------------------------------------
 CREATE RULE test_rule AS                               +
     ON INSERT TO testvarchar                           +
    WHERE ((new.id > 10) AND (new.id < 100)) DO NOTHING;
(1 row)

testdb=# select pg_get_ruledef(16864,'true');
                  pg_get_ruledef                   
---------------------------------------------------
 CREATE RULE test_rule AS                         +
     ON INSERT TO testvarchar                     +
    WHERE new.id > 10 AND new.id < 100 DO NOTHING;
(1 row)

获取一个serial,smallserial,bigserial字段使用的序列名
testdb=# select pg_get_serial_sequence('testtblseq','id');
  pg_get_serial_sequence  
--------------------------
 public.testtblseq_id_seq
(1 row)

获取触发器的create命令
testdb=# select pg_get_triggerdef(16828); oid位于pg_trigger.oid
                                                     pg_get_triggerdef                         
                            
-----------------------------------------------------------------------------------------------
----------------------------
 CREATE TRIGGER tri_stu_major AFTER INSERT OR DELETE OR UPDATE ON stu_score FOR EACH ROW EXECUT
E PROCEDURE fun_stu_major()
(1 row)

testdb=# select pg_get_triggerdef(16828,'true');
                                                     pg_get_triggerdef                         
                            
-----------------------------------------------------------------------------------------------
----------------------------
 CREATE TRIGGER tri_stu_major AFTER INSERT OR DELETE OR UPDATE ON stu_score FOR EACH ROW EXECUT
E PROCEDURE fun_stu_major()
(1 row)

获取给定OID的角色名称
testdb=# select pg_get_userbyid(16850);  oid位于pg_user.usesysid
 pg_get_userbyid 
-----------------
 testuser
(1 row)

获取视图或者物化视图底层的定义
testdb=# select pg_get_viewdef('test_view');
     pg_get_viewdef      
-------------------------
  SELECT testvarchar.id,+
     testvarchar.content+
    FROM testvarchar;
(1 row)

testdb=# select pg_get_viewdef('test_view'::regclass);
     pg_get_viewdef      
-------------------------
  SELECT testvarchar.id,+
     testvarchar.content+
    FROM testvarchar;
(1 row)

testdb=# select pg_get_viewdef('test_view'::regclass,0);
     pg_get_viewdef      
-------------------------
  SELECT testvarchar.id,+
     testvarchar.content+
    FROM testvarchar;
(1 row)

获取存储选项名称/值对的集合
pg_options_to_table(reloptions)

获取指定的表空间有元素的数据库OID集合
testdb=# select pg_tablespace_databases(16849);
 pg_tablespace_databases 
-------------------------
                   16891
                   16890
(2 rows)
回去到的oid为该表空间中的数据库oid

获取表空间所在的文件系统的路径
tbsdb=# select pg_tablespace_location(16849);
 pg_tablespace_location 
------------------------
 /home/pg94/testspac
(1 row)


查询任意任何值的类型
tbsdb=# select pg_typeof(now());
        pg_typeof         
--------------------------
 timestamp with time zone
(1 row)


获取参数的排序

testdb=# select collation for(content) from testvarchar ;  collation for中间为空格
 pg_collation_for 
------------------
 "default"
(1 row)

获取命名关系的OID
testdb=# select to_regclass('testvarchar')::oid;
 to_regclass 
-------------
       16791
(1 row)

获取命名函数的OID
testdb=# select to_regproc('testfun')::oid;
 to_regproc 
------------
      16844
(1 row)

to_regprocedure(func_name)

获取命名操作符的OID
to_regoper(operator_name)
to_regoperator(operator_name)

获取命名类型的OID
testdb=# select to_regtype('testtbl')::oid;
 to_regtype 
------------
      16886
(1 row)

testdb=# select to_regtype('test_view')::oid;
 to_regtype 
------------
      16876
(1 row)

testdb=# select to_regtype('testseq')::oid;
 to_regtype 
------------
      16847
(1 row)
可以对于表,序列,视图使用。

注释信息函数

查询表字段注释
testdb=# select col_description('testvarchar'::regclass,2); --第二个参数1开始。
 col_description 
-----------------
 表内容
(1 row)

获取一个数据库对象的评注
obj_description(object_id,catalog_name);
obj_description(object_id);
获取一个共享数据库对象的评注
shobj_description(object_oid, catalog_name);

事务ID和快照
 

获取当前事务的ID

testdb=# select txid_current();--单独调用会产生新的事物
 txid_current
--------------
         1957
(1 row)

获取当前快照
testdb=# select txid_current_snapshot();
 txid_current_snapshot 
-----------------------
 1958:1958:
(1 row)


select * from table_name; --对于不影响数据库状态的查询不产生事务。


获取快照中xmax,xmin.

testdb=# select txid_snapshot_xmax(txid_current_snapshot());
 txid_snapshot_xmax 
--------------------
               1959
(1 row)

testdb=# select txid_snapshot_xmin(txid_current_snapshot());
 txid_snapshot_xmin 
--------------------
               1959
(1 row)


在快照中事务ID是否可以
txid_visible_in_snapshot(bigint, txid_snapshot)

获取快照中进行的事务ID
txid_snapshot_xip(txid_snapshot)

txid_snapshot文本表示为:xmin:xmax:xip_list
xmin 最早的事务id(txid)仍然活动,所有较早事务要么可见提交了,要么回滚死掉了
xmax 首先作为尚未分配的txid,所有大于或者等于此txid作为这时的快照都是尚未开始的,不可见的。
xip_list 在在当前快照活动中的xids,这个列表只包含xmin, xmax之间活动的xids,有可能活动的txid高于xmax,一个xmin<txid<xmax
不在这个列表中的txid,是在快照的这个时间完成的,因此,要么可见或者死掉对应它的提交状态,这个列表不包含子事务的xid。

 

共有 人打赏支持
粉丝 2
博文 20
码字总数 68787
×
VITO_ch123
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: