在很多時候,干得利索不如想的明白。方案應該根據場景來設計,不是盲目的依靠經驗,當然這也算新經驗!
需求是把公司的幾套公共系統做成通過郵箱用戶名和密碼認證,只需記住一對用戶名密碼,簡單為上,只允許用戶在ExtMail的web頁面修改密碼!在做論壇認證的時候,由於論壇的復雜性,想到了如下的幾個方案:
通過OAuth2.0做認證,或者自己寫接口,問題是只聽過,沒玩過!
在郵箱修改時,也提交到論壇的數據庫。可惜不會ExtMail的Perl代碼,且修改代碼工作量太大!
先前已經把線上郵箱用戶表同步到內網,可以做數據庫復制,可論壇和郵箱的數據庫字段有較大出入,還是要改大量代碼!
使用觸發器更新論壇數據庫的用戶表!
在仔細考慮過前面三種辦法之後,在能力范圍內,已經把PHP編寫的論壇認證方式修改成適應郵箱的加鹽認證方式,並測試了導入郵箱用戶名和密碼認證。已經修改過論壇數據庫字段類型,部分後端代碼!最後一步是自動把郵箱數據庫的用戶表變更同步到論壇數據庫的用戶表。
在討論數據庫復制時,發現還是最後一種觸發器的辦法可行性最好,通過對論壇用戶表的大多數字段設置默認值,做到只添加修改其中的賬號,密碼和郵件三個字段即可完成對論壇用戶的操作,下面是根據實際情況編寫的MySQL觸發器!
觸發器添加用戶
use extmail;
DELIMITER //
create trigger add_bbsuser
after insert on extmail.mailbox
for each row
begin
insert into xiuno_bbs.bbs_user(username,password,email) \
values (new.name,new.password,new.username);
end //
DELIMITER ;
觸發器更新用戶
use extmail;
DELIMITER //
create trigger update_bbsuser
after update on extmail.mailbox
for each row
begin
update xiuno_bbs.bbs_user set username=new.name,\
password=new.password where email=new.username;
end //
DELIMITER ;
觸發器刪除用戶
use extmail;
DELIMITER //
create trigger delete_bbsuser
after delete on extmail.mailbox
for each row
begin
delete from xiuno_bbs.bbs_user where email=old.username;
end //
DELIMITER ;
我踩過的坑
剛開始編寫觸發器,從網上找來的命令都不能用,完全一籌莫展之際領悟到,觸發器和數據庫是綁定的,必須先use extmail到要觸發的extmail數據庫中,才能對這個庫的操作做相應的觸發,後來就沒有問題了!我果然是MySQL小白!