概念 ECM、DMS、EMC、DFS
ECM: Enterprise Content Management
企业内容管理(ECM),Gartner给出了这样的解释——企业内容管理从内涵上应该包括企业内部(Intranet)内容管理、Web内容管理、电子商务交易内容管理和企业外部网(Extranet)信息共享内容管理(如CRM和SCM等)。
企业内容管理的对象,也就是“企业内容管理”中的“内容”泛指各类结构化和非结构化数据的数字内容,包括数据库中的信息,企业的各种文档、报表、账单、网页、图片、传真,甚至多媒体音频、视频、等等各种信息载体和模式。与业务信息系统中大量用于交易记录、流程控制和统计分析的数据相比,“内容”具有某种特定和持续的价值,这种价值在共享、检索、分析等使用过程中得以产生和放大,并最终对企业业务和战略产生影响。企业内容管理的功能覆盖内容采集、创建、加工、存储、发布(出版)以及检索、分析、等等,并随之技术发展和业务创新,将不断演化
计世资讯(CCW Research)的分析和研究表明,目前ECM在中国的发展还处于初级阶段。首先,ECM在国内市场规模很小,2005年的市场规模仅为9.5亿元人民币。此外,用户对ECM的认知较弱。
EMC(易安信)为一家美国信息存储资讯科技公司, 主要业务为信息存储及管理产品、服务和解决方案。EMC公司创建于1979年,总部在马萨诸塞州霍普金顿市。2003年,EMC收购了VMware。2015年10月,EMC被DELL收购。
官方网站:http://www.emc2.com.cn/
ECM 提供了一款文档管理系统 - ECM Documentum , 是集文件存储、流程、文件转换于一体的文档管理系统。
其实更准确的说 Documentum是Documentum公司的产品。
Documentum公司成立于1990年,是市场上第一家利用标准关系型数据库技术以及面向对象方法提供企业级文档管理解决方案的公司。
2003年10月12日,被EMC公司以17亿美元股票并购。
随着互联网的发展,Documentum不断改进,扩展了它的平台,将网络内容管理也包括进来,帮助公司利用网络来进行商业活动。最近,Documentum继续扩展至数字资产管理——对富媒体(如图片、动画、视频、声音)的管理
Documentum,基于webtop作为前台展示,开发技术档案为WDK.
EMC Documentum Foundation Services (DFS) 是一组提供给面向服务编程语言来访问EMC Documentum内容服务器平台和相关产品的技术集合
Alfresco 2.0 解读
一个开源的Documentum 系统
Documentum-ACL
pubFolderACL.revoke 这个和list一样remove一个少一个, 不能在循环中revoke
1. Permit 使用的是dm_user 的user_name 欄位
2. 登錄使用的是 user_login_name
3. owner_name 使用的也是 user_name
Documentum-DB and DQL
drop user ×× cascade
DROP TABLESPACE DM_ecmq_docbase including contents and datafiles;
DROP TABLESPACE DM_ecmq_index including contents and datafiles;
drop user ecmq cascade;
disconnect;
exit;
select * from dm_group_s where group_name ='odr-dept-50043468_m';
Select * From Dm_Group_R Where R_Object_Id='1200000b80000dfb' ;
delete from Dm_Group_R where r_object_id='1200000b80000dfb' and I_Position!='-1' ;
select * from Dm_Group_Rp;
select * from Dm_Group_Rv;
select * from Dm_Group_sp;
select * from Dm_Group_sv;
select * from dm_group_s where group_name like 'odr-dept-50043458%';
Select * From Dm_Group_R Where R_Object_Id='1200000b80000dfb' ;
delete from Dm_Group_R where r_object_id='1200000b80000dfb' and I_Position!='-1' ;
select * from Dm_Group_R where R_Object_Id in (select R_Object_Id from dm_group_s where group_name like 'odr-dept-50043458%');
select * from Dm_Group_R where R_Object_Id in (select R_Object_Id from dm_group_s where group_name like 'odr-dept-50043458%');
delete from Dm_Group_R where R_Object_Id in (select R_Object_Id from dm_group_s where group_name like 'odr-dept-50134213%') and I_Position!='-1' ;
2.
select group_name,group_display_name,description from dm_group where group_display_name like 'groupname%';
1. work item
dmi_workitem
r_object_id 4a 开头
2. workflow 以4d开头 是instance
dm_process 流程的template
select * from dm_process where object_name = 'groupname%';
select * from dm_workflow where r_object_id='4d00000b8001f147'
update dm_workflow object set process_id='4b00000b80363b5d' where r_object_id='4d00000b8001f147'
3. 查找activity
select transition_max_output_cnt from dm_activity where r_object_id='4c00000b80363b71'
transition_type : 手动还是自动
3.
select * from dm_audittrail where DATEDIFF(day,"time_stamp",DATE(now))<3;
select r_creation_date from "dm_folder" where FOLDER ('/XXXX Deliverables/Projects');
select distinct need_approval from XXX_functional where FOLDER ('/Document Type/oscar999 Document/1.0 Administrator Document/Functional',DESCEND);
select * from XXX_functional where FOLDER ('/Document Type/oscar999 Document/1.0 Administrator Document/Functional/HR',DESCEND) and need_approval=1;
select * from dm_dbo.ext_doctype_displayname where type_name='XXX_functional';
select * from dm_audittrail where DATEDIFF(day,"time_stamp",DATE(now))<1 order by time_stamp desc;
select * from dm_audittrail where audited_obj_id = '0b00006f8003fcca' order by time_stamp desc;
select * from dm_audittrail where audited_obj_id = '0b00006f800405a4' and event_name='dm_save' order by time_stamp desc;
select * from dm_audittrail where audited_obj_id = '0b00006f8003fcca' and event_name='dm_save' order by time_stamp desc;
DFC
r_object_id,r_object_type,r_aspect_name,i_is_reference,i_is_replica,i_vstamp
get object id by query 最少需要这几个属性
user/group 无法通过 getobjectbyQuery方式获取
IDfEnumeration enumeration = sess.getObjectsByQuery(dql, null);
删除目录的递归代码
private boolean deleteFolderRecursive(IDfSession session, IDfFolder docFolder, int iLevel) {
if (iLevel > 10)
return false;
iLevel += 1;
IDfCollection collection = null;
boolean isEmpty = true;
try {
collection = docFolder.getContents("r_object_id");
while (collection.next()) {
IDfPersistentObject idfObject = session.getObject(collection.getId("r_object_id"));
if (idfObject.getType().getName() != null && idfObject.getType().isTypeOf("dm_folder")) {
boolean isEmptyTemp = deleteFolderRecursive(session, (IDfFolder) idfObject, iLevel);
if(!isEmptyTemp) isEmpty = isEmptyTemp;
} else {
isEmpty = false;
}
}
if (isEmpty) {
String sFolderPath = docFolder.getFolderPath(0);
log("Delete Empty Folder " + sFolderPath
+ (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(Calendar.getInstance().getTime()));
docFolder.destroyAllVersions();
}
} catch (Exception e) {
isEmpty = false;
e.printStackTrace();
log(e.getMessage());
} finally {
if (null != collection) {
try {
collection.close();
} catch (Exception e) {
log(e.getMessage());
}
}
}
return isEmpty;
}
得到Location
IDfCollection col = sysObject.getLocations("r_object_id,object_name");
String sLocationId = col.getValue("r_object_id").asString();
String sLocationName = col.getValue("object_name").asString();
IDfSysObject locationObject = (IDfSysObject)ObjectCacheUtil.getObject(session, sLocationId);
for (int i = 0; i < locationObject.getFolderIdCount(); i++) {
IDfFolder folder = (IDfFolder) ObjectCacheUtil.getObject(session, locationObject.getFolderId(i).toString());
流程
3. Activity Template
2. 流程发信的Template 的配置的位置是在?
在Process Builder 点击上方 "i"的图标
1. 流程中的自动代理
dm_queue_item的 event的栏位不是dm_delegate , 而是dm_startworkflow
2. Portal的流程签核是调用DFS的Webservice
Workflow
5. 状况:
无法进流程, 报doc 找不到。
使用DA或webtop 都能找到
原因猜测
当前session取的是Cache里面的数据。
解决方法
重启Submitworkflow 的进程, 使其使用新的session取数据
具体三步:
1. 得到Submit的进程id
ps -ef|grep SubmitToWorkflowHandling
2. kill 以上进程
kill -9 进程ID
3. 移除临时文件
rm /tmp/SubmitToWorkflowHandling.lock
注意: 此解决方式尽量谨慎使用
如果一定要使用,请在系统空闲时使用
tag handler pooling
ECM 不支持 tag handler pooling
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<!-- <init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>-->
<!--for ecm-->
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>enablePooling</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
1. 删除目录时, 如果目录下有文件的话,会出错, 不能退出。
docFolder.destroyAllVersions();
Permission
Permission Set 和Permission的关系
Permission Set可以使用DQL找出
select r_accessor_name,r_accessor_permit,acl_class from dm_acl;
perssion是否也可以找出
DM_SYSOBJECT_E_NO_WRITE_ACCESS]error: No write access for sysobject named MoveAudittrallToArch
job 权限不够
可以通过DQL查出相关权限
追踪过程
1. 通过查看ecmq.log, 有发现如下日志
DM_SYSOBJECT_E_NO_WRITE_ACCESS]error: No write access for sysobject named MoveAudittrallToArch。
job的执行权限不足, 至少需要write权限
2. 登录发现dctmecmq对此job没有edit的权限, 而且这些 job都是runing状态。
通过DQL, Query 对应 dm_job的Owner Permit和ACL object, 发现:
owenr 的permit值是2(browser), 权限不够
通过ACL object id 找到对应的Permission set. owner 对应的权限也是browser
综合, 此job的owner(dctmecmq) 对此job没有足够的权限可以运行。
3. 查找系统中的job, 发现此类job还有不少(22), 基本上都是客制的job.
4. 通过DQL修改job owner的permit为 7.
5. 稍等一段时间job status变为正常(空值)。
原因猜测
1. 权限的数据有被改动, 是否是程式修改?或是手动修改?
程式修改可能性不大, 因为权限是从 7-->2. 如果程式修改应该是删除几率较大。
2. 咨询其他同仁, 是有说QA环境之前 admin group有被删除过, 后来有手动修复。 发生的时间段与此问题发生的时间段正好吻合。
dctmecmq位于admin group. admin group 具有 7 的权限。 是否删除admin group时, 系统会自动把相关的权限降级?