做的项目中,有一个环节是第三方公司将文件推送到我方文件服务器,同时记录日志。这个日志,当然也是保存进我方数据库。
这个日志实现,最自然的想法就是调接口。我方提供接口,第三方调用。但大家都嫌麻烦,业主方决定让第三方直接写数据库。
这就涉及到权限等问题了。权限应能做到:
1、仅能插入,不能修改、删除
2、为方便和安全计,仅能插入部分字段
3、对第三方,能插入的字段才可见,否则透明
思路如下:
1、建立视图,仅包含部分字段,让第三方操作视图
2、对于未插入的字段,如主键ID,时间戳,用触发器自动完成
3、为第三方建立专用数据库账号,赋最小必要权限;且使用别名,屏蔽表空间等细节
具体如下:
1、创建第三方表空间及用户
CREATE USER pub identified by--无须创建默认表空间
grant connect to
2、在表空间work下创建触发器、视图
--日志表
CREATE TABLE "WORK"."ACCEPTLOG"
( "ID" VARCHAR2(64) NOT NULL ENABLE, --主键
"F1" VARCHAR2(50),
"F2" VARCHAR2(50),
"F3" VARCHAR2(50),
"FILENAME" VARCHAR2(100),
"SUFFIX" VARCHAR2(10),
"FILESIZE" NUMBER(9,0),
"SENDDATE" DATE NOT NULL ENABLE,
"CREATEDATE" DATE, --时间戳
"NOTE" VARCHAR2(200),
CONSTRAINT "PK_ACCEPTLOG" PRIMARY KEY ("ID"))
--建立触发器
create or replace trigger trg_pub_acceptlog
before insert on acceptlog
for each row
declare
-- local variables here
begin
select sys_guid() into :NEW.ID from--自动填上ID
select sysdate into :NEW.createdate from--自动填上时间戳
end
--视图
create or replace view v_acceptlog as
select f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,filename,suffix,filesize,senddate from work.acceptlog;
--权限
grant select on work.v_acceptlog to
grant insert on work.v_acceptlog to
--创建别名权限
grant create synonym to
为什么ID,时间戳这些不由第三方公司填写呢?一是省工夫,方便;二主要是不想让他们来控制。他们甚至不需要知道有这些字段,日志嘛,他们只管记录就行,查询和显示、分析日志是我们的事。
3、用pub登录
--创建一个别名,蒙骗第三方,让他们以为这是一个物理表,而不是视图
create or replace synonym acceptlog for work.v_acceptlog;
--如此,第三方公司即可直接使用acceptlog进行数据插入矣
insert into acceptlog(f1,senddate) values('原始资料',sysdate);
select * from
视图不只是用于查询,只要对应单个表,其实也可以用于插入等操作。