在很多时候,干得利索不如想的明白,方案应该根据场景来设计,不是盲目的依靠经验,当然这也算新经验!
需求是把公司的几套公共系统做成通过邮箱用户名和密码认证,只需记住一对用户名密码,简单为上,只允许用户在ExtMail的web页面修改密码,在做论坛认证的时候,由于论坛的复杂性,想到了如下的几个方案:
通过OAuth2.0做认证,或者自己写接口,问题是只听过,没玩过,在邮箱修改时,也提交到论坛的数据库,可惜不会ExtMail的Perl代码,且修改代码工作量太大.
先前已经把线上邮箱用户表同步到内网,可以做数据库复制,可论坛和邮箱的数据库字段有较大出入,还是要改大量代码!
使用触发器更新论坛数据库的用户表.
在仔细考虑过前面三种办法之后,在能力范围内,已经把PHP编写的论坛认证方式修改成适应邮箱的加盐认证方式,并测试了导入邮箱用户名和密码认证。已经修改过论坛数据库字段类型,部分后端代码!最后一步是自动把邮箱数据库的用户表变更同步到论坛数据库的用户表。
在讨论数据库复制时,发现还是最后一种触发器的办法可行性最好,通过对论坛用户表的大多数字段设置默认值,做到只添加修改其中的账号,密码和邮件三个字段即可完成对论坛用户的操作,下面是根据实际情况编写的MySQL触发器.
触发器添加用户:
- useextmail;
- DELIMITER//
- createtriggeradd_bbsuser
- afterinsertonextmail.mailbox
- foreachrow
- begin
- insertintoxiuno_bbs.bbs_user(username,password,email)\
- values(new.name,new.password,new.username);
- end//
- DELIMITER;
触发器更新用户:
- useextmail;
- DELIMITER//
- createtriggerupdate_bbsuser
- afterupdateonextmail.mailbox
- foreachrow--phpfensi.com
- begin
- updatexiuno_bbs.bbs_usersetusername=new.name,\
- password=new.passwordwhereemail=new.username;
- end//
- DELIMITER;
触发器删除用户:
- useextmail;
- DELIMITER//
- createtriggerdelete_bbsuser
- afterdeleteonextmail.mailbox
- foreachrow
- begin
- deletefromxiuno_bbs.bbs_userwhereemail=old.username;
- end//
- DELIMITER;
我踩过的坑:刚开始编写触发器,从网上找来的命令都不能用,完全一筹莫展之际领悟到,触发器和数据库是绑定的,必须先use extmail到要触发的extmail数据库中,才能对这个库的操作做相应的触发,后来就没有问题了,我果然是MySQL小白.