1驻债、問題描述
Flask-Admin插件作項(xiàng)目的后臺管理乳规,有一個用戶表、角色表合呐、用戶角色關(guān)聯(lián)表等驯妄,用戶表中要限制管理員刪除自己,所以在數(shù)據(jù)庫(使用的是postgresql)中的用戶表上加了一個觸發(fā)器做限制合砂。
觸發(fā)器函數(shù)
在刪除用戶之前先去用戶角色關(guān)聯(lián)表中差這個用戶是不是擁有管理員角色青扔,如果有就不允許刪除
CREATE or Replace FUNCTION del_admin() RETURNS trigger AS $del_admin$
BEGIN
If (TG_OP = 'DELETE') THEN
If EXISTS(SELECT * FROM userroles WHERE user_id=OLD.id AND role_id='1') Then
raise notice '不允許刪除管理員: %, id:%', OLD.username, OLD.id;
return null;
ELSE
return OLD;
END IF;
END IF;
END;
$del_admin$ LANGUAGE plpgsql;
在shell
中使用sql
語句刪除擁有管理員角色的用戶時源织,觸發(fā)器起作用,但是在后臺管理界面刪除管理員是能成功刪除的微猖,我的第一感覺是不是Flask-Admin繞過了觸發(fā)器(怎么可能谈息!)
2、解決過程
將后臺在刪除用戶時orm語句轉(zhuǎn)化后的sql語句全部打印出來分析:
2017-07-26 19:15:57,381 INFO sqlalchemy.engine.base.Engine {'param_1': 15}
2017-07-26 19:15:57,385 INFO sqlalchemy.engine.base.Engine DELETE FROM userroles WHERE userroles.user_id = %(user_id)s AND userroles.role_id = %(role_id)s
2017-07-26 19:15:57,385 INFO sqlalchemy.engine.base.Engine ({'user_id': 15, 'role_id': 1}, {'user_id': 15, 'role_id': 4})
2017-07-26 19:15:57,390 INFO sqlalchemy.engine.base.Engine DELETE FROM users WHERE users.id = %(id)s
2017-07-26 19:15:57,390 INFO sqlalchemy.engine.base.Engine {'id': 15}
2017-07-26 19:15:57,394 INFO sqlalchemy.engine.base.Engine COMMIT
從上面打印出來的信息可以看出凛剥,后臺在刪除用戶時先將該用戶所擁有的角色先從用戶角色關(guān)聯(lián)表中刪除侠仇,最后再刪除用戶。
你都先把用戶角色關(guān)聯(lián)表中該用戶所有的角色刪除了犁珠,觸發(fā)器當(dāng)然攔不住了逻炊。
所以如果誰使用Flask-admin做后臺同時也有這樣的需求,最好先看看執(zhí)行刪除之前sql是什么樣的犁享,再決定將觸發(fā)器設(shè)置在那個表上余素。