PostgreSQL环境下,触发器、索引和角色的创建

做~自己de王妃 提交于 2019-11-29 10:16:17

创建表触发器的SQL语句

CREATE TRIGGER example_trigger BEFORE INSERT ON teaches

FOR EACH ROW

EXECUTE PROCEDURE example_function();

 

实例 :

首先创建测试表、视图

CREATE TABLE COMPANY(  
       ID INT PRIMARY KEY NOT NULL,  
       NAME TEXT NOT NULL,  
       AGE INT NOT NULL,  
       ADDRESS CHAR(50),  
       SALARY REAL  
    );
 
   CREATE TABLE AUDIT_HIS(  
       EMP_ID INT NOT NULL,
       EMP_NAME TEXT NOT NULL,  
       ENTRY_DATE TEXT NOT NULL  
   );
 
   CREATE TABLE AUDIT(  
       EMP_ID INT NOT NULL,
       EMP_NAME TEXT NOT NULL,  
       ENTRY_DATE TEXT NOT NULL  
   );
 
   CREATE OR REPLACE VIEW "public"."company_view" AS 
   SELECT company.id,company.name,company.age

 2.创建触发器函数

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $$  
        BEGIN  
            INSERT INTO AUDIT_HIS(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (OLD.ID,OLD.NAME,current_timestamp); 
            INSERT INTO AUDIT(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (NEW.ID,NEW.NAME,current_timestamp);   
        RETURN NULL;   
        END;  
    $$ LANGUAGE plpgsql;

注:

a.触发器函数是触发器触发时调用函数返回的类型必须是TRIGGER ,且不能有任何参数

b.postgresql触发器函数中自带一些特殊变量:

NEW:数据类型是record,在insert、update操作触发时存储新的数据行
OLD:数据类型是record,在update、delete操作触发时存储旧的数据行
TG_OP:内容为“INSERT”,“UPDATE”,“DELETE”,“TRUNCATE”,用于指定DML语句类型
TG_TABLE_NAME:触发器所在表的表名称 TG_SCHEMA_NAME:触发器所在表的模式 
 

创建触发器

表触发器

 CREATE TRIGGER example_trigger AFTER INSERT OR UPDATE ON COMPANY  
    FOR EACH ROW EXECUTE PROCEDURE auditlogfunc()

意思 :在company表中插入或更新后创建触发器example_trigger

对于每一行执行过程auditlogfunc();

 

视图触发器

 CREATE TRIGGER company_view_trigger AFTER UPDATE ON company_view 
    EXECUTE PROCEDURE auditlogfunc();

删除触发器

删除company表中的example_trigger触发器

DROP TRIGGER example_trigger on COMPANY;

删除函数

drop function function_name (parameters_list);

查看所有触发器

SELECT * FROM pg_trigger;

测试


INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
UPDATE COMPANY SET NAME ='阿里巴巴' WHERE ID ='1';

实例 :

1.建表

CREATE TABLE student (
  id   int primary key,
  name varchar(50)
);
 
CREATE TABLE score (
  studentId  int,
   math     int 
);
2.插入数据

INSERT INTO student VALUES(1,'April');
INSERT INTO student VALUES(2,'Harris');
 
INSERT INTO score VALUES(1, 98);
INSERT INTO score VALUES(2,77);
3.创建执行函数

   为触发器创建一个执行函数,函数的返回类型是触发器类型。

CREATE OR REPLACE FUNCTION student_delete_trigger()
RETURNS TRIGGER AS $$
BEGIN
   DELETE FROM score where studentId = OLD.id;
    RETURN OLD;
END;
$$
LANGUAGE plpgsql;

 

查看创建的触发器

postgres=# SELECT * FROM pg_trigger;


3.创建触发器

CREATE TRIGGER delete_trigger 
    AFTER DELETE ON student
    FOR EACH ROW EXECUTE PROCEDURE student_delete_trigger();
4.删除数据

    现在,为了验证触发器正常工作,删除学生表中id为2的学生信息,然后查看其成绩信息是否也被删除了?

DELETE FROM student where id = 2;
select * from student;
select * from score;
    执行结果:

           表student                                                                  图:表score

    结论:当删除学生表中的一条记录时,通过触发器,把其在成绩表中的记录也删除了。

 

 

 

PostgreSql INDEX 索引总结

1.创建索引
create index index_name on table_name(field_name1, field_name2,······);

 

create index index_name on table_name using btree 

create index idx_t_hash_1 on t_hash using btree (info); 创建索引 idx_t_hash_1,在t_hash表中的info列中。

 

create index  tbl_bb_index  on  tbl_bb(id,name);

注:tbl_bb  位表名称,  tbl_bb_index  为创建的索引名称,  id 和 name 为 表里的字段

注:默认创建B-tree索引,-- 使用b-tree索引会报错,因为长度超过了1/3的索引页大小。

使得添加的index 生效:

ANALYSE index_name;

 

2.查询索引
    1、select * from pg_indexes where tablename ='table_name';

runoobdb=#  select * from pg_indexes where tablename ='company';           #查询company表的索引
                                                          RUNOOBDB
 schemaname | tablename |     indexname     | tablespace |                     
        indexdef                              
------------+-----------+-------------------+------------+---------------------
----------------------------------------------
 public     | company   | company_pkey      |            | CREATE UNIQUE INDEX 
company_pkey ON company USING btree (id)
 public     | company   | unique_table_a_id |            | CREATE UNIQUE INDEX 
unique_table_a_id ON company USING btree (id)
(2 rows)

    2、   select * from pg_statio_all_indexes where relname='tbname';

runoobdb=# select * from pg_statio_all_indexes where relname='company';
                                           RUNOOBDB
 relid | indexrelid | schemaname | relname |   indexrelname    | idx_blks_read 
| idx_blks_hit 
-------+------------+------------+---------+-------------------+---------------
+--------------
 16487 |      16493 | public     | company | company_pkey      |             1 
|            1
 16487 |      16518 | public     | company | unique_table_a_id |             1 
|            1
(2 rows)

 

3.删除索引
drop index index_name;

index_name是要删除的索引名

注意 : 无法删除DBMS为主键约束和唯一约束自动创建的索引

 

 

 

常见无需创建索引情况
a. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;

b.表记录太少,不需要创建索引;

c.经常增删改的表,不需要创建索引;

d.表中包含大量重复数据,不需要创建索引,例如性别字段,只有男女,不适合建立索引; 

常见索引无效情况
a. 没有查询条件,或者查询条件没有建立索引;

b. 在查询条件上没有使用引导列;

c. 查询的数量是大表的大部分,应该是30%以上;

d. 使用内部函数导致索引失效,例:select * from test where round(id)=10;

e. 表记录较少

f. 隐式转换导致索引失效,例如:表的字段tu_mdn定义为varchar2(20), 但在查询时把该字段作为number类型以where条件传给数据库:

错误的例子:select * from test where tu_mdn=13333333333; 

正确的例子:select * from test where tu_mdn='13333333333'; 

g. 索引列进行运算导致索引失效,运算包括(+,-,*,/,! 等),例:

select * from test where round(id)=10; 

runoobdb=#  select * from company where round(id)=10; 
              RUNOOBDB
 id | name | age | address | salary 
----+------+-----+---------+--------
(0 rows)

h. like "%_" 百分号在前;

i.单独引用复合索引里非第一位置的索引列;

j. B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走  
 

创建角色

在创建用户时赋予角色属性

postgres=# CREATE  ROLE test_user_3 CREATEDB;                /*具有创建数据库的属性*/  

postgres=# CREATE ROLE test_user_4 CREATEDB PASSWORD '123456';            /*具有创建数据库及带有密码登陆的属性 */  

 

CREATE ROLE david;  //默认不带LOGIN属性

CREATE USER sandy;  //默认具有LOGIN属性

连接数据库

psql –h IP  -U david;    //不能登录

psql –h IP  -U sandy;   //能登录

修改david 的权限,增加LOGIN权限
 ALTER ROLE david LOGIN ;

ALTER ROLE davidwith password 'david';

ALTER ROLE sandywith password 'sandy';

再次验证LOGIN属性
 psql -h 127.0.0.1 -U sandy -d postgres

查看系统表 select * from pg_roles;

 

创建角色renee 并赋予其创建数据库及带有密码登录的属性。 
postgres=# CREATE ROLE renee CREATEDB PASSWORD 'abc123' LOGIN;

 

 创建角色bella 并赋予其CREATEDB 的权限。

CREATE ROLE bella CREATEDB ;

查看现在的角色属性

ALTER ROLE bella WITH LOGIN;

赋予renee 创建角色的权限
postgres=# ALTER ROLE renee WITH CREATEROLE;

赋予david 带密码登录权限
postgres=# ALTER ROLE david WITH PASSWORD 'ufo456';

设置sandy 角色的有效期
postgres=# ALTER ROLE sandy VALID UNTIL '2014-04-24';

postgres=# SELECT * from pg_roles ;

 

链接 :

 

PostgreSQL的用户、角色和权限管理:https://blog.csdn.net/eagle89/article/details/80363365

PostgreSql INDEX 索引总结 :https://blog.csdn.net/nioqnw/article/details/84750297

PostgreSql TRIGGER 触发器简单样例 :https://blog.csdn.net/nioqnw/article/details/84633181

PostgreSQL触发器(一)创建触发器 :https://blog.csdn.net/liyazhen2011/article/details/82800446

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!