一般來說,我們未來阻止使用者刪除或者清空表以及資料, 可以直接從許可權下手,給他少量的許可權即可。
比如,防止使用者進行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)
全站熱搜
留言列表