一般來說,我們未來阻止使用者刪除或者清空表以及資料, 可以直接從許可權下手,給他少量的許可權即可。
比如,防止使用者進行truncate 操作, 可以給如下許可權:
1.t_girl=# create role ytt3 with login connection limit 1  password 'ytt3';   
2.CREATE ROLE
3.t_girl=# alter schema ytt owner to ytt3;
4.ALTER SCHEMA
5.t_girl=# grant select on all tables in schema ytt to ytt3;
6.GRANT



現在用新使用者ytt3登陸並且執行TRUNCATE,發現被禁止。
1.bash-4.1$ psql -U ytt3 t_girl
2.psql (9.3.4)
3.Type "help" for help.
4.t_girl=> truncate table j2;
5.ERROR:  permission denied for relation j2



但是當測試的時候,一般來說,管理員為了方便懶得去分配各種各樣細的許可權。 那麼,我們在創建表的時候, 就得給這張表來做對應的限制。當然了,生產環境不建議這麼做。
這個實現就比較簡單了,創建一個基於語句的觸發器就OK了。
t_girl=# \sf prevent_truncate
02.CREATE OR REPLACE FUNCTION public.prevent_truncate()
03.RETURNS trigger
04.LANGUAGE plpgsql
05.AS $functio$
06.BEGIN
07.RAISE EXCEPTION 'Prevent "%"  to be truncated!', TG_TABLE_SCHEMA||TG_TABLE_NAME;
08.RETURN NEW;
09.END;
10.$function$




1.t_girl=# \d j2
2.Table "ytt.j2"
3.Column |  Type   | Modifiers
4.--------+---------+-----------
5.id     | integer |
6.str2   | text    |
7.Triggers:
8.trigger_truncate_before BEFORE TRUNCATE ON j2 FOR EACH STATEMENT EXECUTE PROCEDURE ytt.prevent_truncate()


1.t_girl=# truncate table j2;
2.ERROR:  Prevent "ytt.j2"  to be truncated!




這種方法也只是對於提供了這項功能的資料庫才OK。 比如MySQL的觸發器只提供了基於行的操作,那麼語句的操作就不能觸發了。 所以如果在MySQL上來實現這點,就比較麻煩。要麼,就從許可權入手,
1.mysql> truncate table j2;
2.ERROR 1142 (42000): DROP command denied to user 'ytt3'@'localhost' for table 'j2'

 


要麼,就對資料庫的操作用SPROC封裝起來,
1.+------------------------------------+
2.| Error                              |
3.+------------------------------------+
4.| Prevent t_girl.j2 to be truncated! |
5.+------------------------------------+
6.1 row in set (0.00 sec)
 
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()