Latest Entries »

Webtop Shortcuts

For day today Webtop support point of view , these shortcuts are very helpful for me.
Also its very interesting to play with shortcuts. Try it out.

Useful DQL Queries

1. DQL to create user

create “dm_user” object
set client_capability=2,
set default_folder=’’,
set home_docbase=’’,
set mailto:user_address=’a@abc.com’,
set user_os_domain=’’,
set user_name=’’,
set user_os_name=’’,
set user_privileges=0;

2. DQL to execute stored procedure (works for all supported DBMSes)

execute exec_sql with query=’execute my_sp_test ”123”,”prasad” ‘;

3. Running DQL in batch mode

a. Create a dql file

b. Run the following from command prompt

$idql docbasename -Uusername -Ppassword -Rtest.dql

Example command

C:\Documentum\product\5.3\bin>idql32 docbasename-Uusername -Ppassword -RC:
\test.dql

test.dql would contain something like this

go

go

4. DQL to Get all Files under a Particular Cabinet

select r_object_id, object_name from dm_document(all) where folder(’/Cabinet name’, descend);

The above DQL gives all versions. To get only current versions

select * from dm_document where folder (’/Cabinet name’, descend)

5. DQL to get total number of documents and folders under a cabinet

SELECT count(*) as cnt, ‘Docs’ as category FROM dm_document(all)
WHERE FOLDER (’/Cabinet Name’,DESCEND)
UNION
SELECT count(*) as cnt, ‘Folders’ as category FROM dm_folder
WHERE FOLDER (’/Cabinet Name’,DESCEND)

6. DQL to find whether a document is a part of virtual document

SELECT object_name,r_object_id FROM dm_sysobject
WHERE r_object_id IN
(SELECT parent_id FROM dmr_containment
WHERE component_id = (SELECT i_chronicle_id FROM dm_sysobject WHERE r_object_id = ‘’))

7. Repeating attributes

Repeated attribute queries are always a fun. I am going to present here more repeated attribute queries. But for starters, recognize the importance of ANY keyword

select r_folder_path from dm_folder where object_name
=’myFolder’ and any r_folder_path =’/Cabinet Name/test’;

8. DQL to find object type of a document

select r_object_type from dm_document where object_name=’ObjectName’;

9. DQL for index

Following query creates index
EXECUTE make_index WITH type_name=’dmi_workitem’,attribute=’r_workflow_id’

Using the query below, one can find out whether index has been succesfully created or alternatively whether the index exists or not

Select r_object_id,index_type,attribute,attr_count,data_space from dmi_index where index_type in (select r_object_id from dm_type where name=’dmi_workitem’);

10. DQL to see sessions

execute show_sessions

11. Enable FTDQL

SELECT
r_object_id,
score,
text,
object_name,
r_object_type,
r_lock_owner,
owner_name,
r_link_cnt,
r_is_virtual_doc,
r_content_size,
a_content_type,
i_is_reference,
r_assembled_from_id,
r_has_frzn_assembly,
a_compound_architecture,
i_is_replica,
r_policy_id,acl_name,
r_creation_date,
r_modify_date,
subject
FROM
custom_document
WHERE
(custom_attr1 = ’search1′ AND
(custom_attr2 = ’search2′ AND
)) AND
(a_is_hidden = FALSE)
ENABLE
(FTDQL)

12. DQL to get current date, time
select DATE(now) as systime from dm_server_config;

13. DQL to list all available templates in Webpublisher

select * from my_document where folder(’/WebPublisher Configuration/Content Templates/myTemplates’,descend) and any r_version_label =’Approved’;

14. DQL to list objects having duplicate names

SELECT object_name, count(*) FROM dm_document
GROUP BY object_name
HAVING count(*) > 1
ORDER BY object_name

15. Clear INBOX

delete dmi_queue_item objects where delete_flag=0

16. DQL to retrieve all required attributes of a particular type
SELECT attr_name FROM dmi_dd_attr_info WHERE type_name=’dm_document’ AND is_required 0

17. DQL to list workflow attachments

select r_component_id, r_component_name from dmi_wf_attachment where r_workflow_id = ‘’

18. If your statistics are not up to date, database may choose a very inefficient execution plan. Be sure toupdate statistics often. It is recommended that you use the dm_UpdateStatistics job as it will calculateextended statistics on particular tables and columns which provide additional performance benefits. If the DBA uses their own scripts to calculate the statistics, then these enhancements will not be available.

19.Use the script “dctm_indexes_by_table.sql” to generate a list of all indexes on Documentum tables, ordered by table name. (Available from http://developer.documentum.com.)
Use the script “dctm_indexes_by_index.sql” to generate a list of all indexes on Documentum tables,
ordered by index name. (Available from http://developer.documentum.com.)

20.It is strongly recommended that all indexes on Documentum base tables be created from within Documentum and not at the database level.
There are two reasons for this:
The internal conversion process from DQL to SQL will check for the presence of a dmi_index object for repeating valued attributes and will generate different SQL according to what it finds.
If indexes are created directly through SQL*Plus, then Documentum will not know anything about them and will assume it is unindexed. This may result in a less efficient SQL query.
Secondly, if the indexes are created from within Documentum, and they are inadvertently dropped, the dm_DBWarning job will automatically recreate them at next execution.
The syntax for creating new indexes is as follows:

In DQL:
EXECUTE make_index WITH type_name=object_type,
attribute=attribute_name{,attribute=attribute_name,…)
or
Using APIs:
dmAPIGet(”apply,session,NULL,MAKE_INDEX,TYPE_NAME,S,object_type,ATTRIBUTE,S
,attribute_name(,ATTRIBUTE,S,attribute_name,…}
These indexes will be created in the tablespace identified by the index_store server.ini parameter.
Be sure to create the index on the appropriate type table.
For example, although ‘keywords’ is an attribute of the dm_document type, it is actually inherited from ‘keywords’ from the dm_sysobject type.

Drop the Index if Necessary
If there is no performance improvement, OR the optimizer is not using the new index, drop it using:
EXECUTE drop_index [[FOR] dmi_index_id] [WITH name = index_name]
or
dmAPIGet(”apply,session,dmi_index_id,DROP_INDEX [,NAME,S,index_name]“)

21. Using the iapi utility and the trace API you can generate log information that contains the SQL resulting from a DQL query.
This is useful when it is a DQL query that is performing poorly and you wish to test using a nonsuperuser account. Non-query type APIs are not traced.
Here is an example of tracing a simple DQL query.
trace,c,10,,DM_QUERY.

More on TKPROF here

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/sqltrace.htm

22. DQL Hints

SELECT object_name FROM dm_document ENABLE (RETURN_TOP 10)

For DB2, performance can be improved using
SELECT object_name FROM dm_document ENABLE (RETURN_TOP 10, OPTIMIZE_TOP 10)

The FETCH_ALL_RESULTS N hint fetches all the results from the database
immediately and closes the cursor. The hint does not affect the execution plan,
but may free up database resources more quickly.
To fetch all the results, set N to 0.
On SQL Server, it is recommended that you use SQL_DEF_RESULT_SETS
instead of the FETCH_ALL_RESULTS hint. SQL_DEF_RESULTS_SETS
provides the same benefits and is the recommended way to access SQL Server
databases.

Passthrough hints are hints that are passed to the RDBMS server. They are not
handled by Content Server.

To include a passthrough hint, you must identify the database for which the
hint is valid. To identify the target database, keywords precede the hints. The
valid keywords are: ORACLE, SQL_SERVER, SYBASE, and DB2. For
example, the following statement includes passthrough hints for SQL Server:
SELECT “r_object_id” FROM “dm_document”
WHERE “object_name” =’test’
ENABLE SQL_SERVER(’ROBUST PLAN’,’FAST 4’,’ROBUST PLAN’)
For portability, you can include passthrough hints for multiple databases in
one statement. The entire list of hints must be enclosed in parentheses. The
syntax is:
(database_hint_list {,database_hint_list})
where database_hint_list is:
db_keyword(’hint’{,’hint})
db_keyword is one of the valid keywords identifying a database. hint is any hint
valid on the specified database.
For example:
SELECT object_name FROM dm_document doc dm_user u
WHERE doc.r_creator_name = u.user_name ENABLE
(ORACLE(’RULE’,’PARALLEL’), SYBASE(’AT ISOLATION READ
UNCOMMITTED’),SQL_SERVER(’LOOP JOIN’,’FAST 1’)

Use FETCH_ALL_RESULTS if you want to reduce the resources used by the
database server by quickly closing cursors. On SQL Server, try
FETCH_ALL_RESULTS if using SQL_DEF_RESULT_SETS did not improve
query performance.

23. If the table is registered, check with the owner of the registered table, or a Documentum superuser, about giving you access to the table.

You will need at least a BROWSE permit on the registered table object in order to access it. If the table has not yet been registered, check with the table’s owner about registering it. Note that you must have READ access to the dm_registered object for this table in order to access it in any way (SELECT, INSERT, UPDATE, DELETE).

Note that if you specified the special dm_dbo document base owner, the first parameter will hold the actual name of the document base owner.

24. DQL to list docbrokers

execute list_targets

25. DQL to list worrkflow information

select task_name, task_state, actual_start_date, dequeued_date from dmi_queue_item where router_id = ‘workflowId’

26. Query to find active workflows, supervisors of the workflows

select r_object_id, object_name, title, owner_name,r_object_type, r_creation_date, r_modify_date, a_content_type from dm_document where r_object_id in(select r_component_id from dmi_package where r_workflow_id in (select r_object_id from dm_workflow where r_runtime_state = 1))

27. Though this is not DQL, I thought of mentioning here as it most widely used DFC operation

sysObject.queue (”dm_autorender_win31?, _
“rendition”, _
0, _
False, _
dueDate, _
“rendition_req_ps_pdf”)

28. To find ACLs related to dm_sysobject:
select r_object_id as obj_id, object_name from

dm_sysobject (all)

where acl_name =” and

acl_domain = ”
To find ACLs as the default ACL of a user:
select user_name from dm_user where acl_name=”
To find ACLs associated with a type:
select r_object_id, r_type_name from dmi_type_info where acl_domain=” and acl_name=”
When these queries do not return any related objects and you still cannot delete the ACL, use tracing:
In the Message Tester or IAPI, execute the command: apply,c,NULL,SQL_TRACE,LEVEL,I,1
Then, try to delete the ACL that is causing problem.
Turn off tracing by executing:
apply,c,NULL,SQL_TRACE,LEVEL,I,0
Examine the session log for the trace output, located in $DOCUMENTUM/dba/log//
Excerpt of the session log:
[DM_ACL_E_DESTROY_IN_USE]error: “Failed to destroy the ACL ‘Documentum Users’ in domain ‘dbabep’ because it is in use.”

[DM_SESSION_I_SESSION_QUIT]info: “Session 01000dcb80010ccf quit.”
Run the following query from Oracle SQL:
select r_object_id from dm_sysobject_s where acl_domain =’dbabep’ and acl_name =’Documentum Users’ union select r_object_id from dm_user_s where acl_domain = ‘dbabep’ and acl_name =’Documentum Users’ union select r_object_id from dmi_type_info_s where acl_domain =’dbabep’ and acl_name =’Documentum Users’
It will return the r_object_id value = 09000dcb800362c4.
Run the following query from IDQL:
select object_name

from dm_sysobject

where r_object_id=’09000dcb800362c4′
If the above query returned nothing, then this object cannot be accessed by any Documentum WorkSpace method, only via SQL in the underlying Oracle database. The following entries must be deleted at the RDBMS level: dm_sysobject_s and dm_sysobject_r tables; there are no entries in the dmi_object table

29. List of object types and corresponding identifiers. Helpful when reading the code.

00 dmi_audittrail_attrs
03 dm_type
05 dmr_containment
06 dmr_content
08 dm_application
08 dm_job
08 dm_procedure
08 dm_query
08 dm_script
08 dm_smart_list
09 dm_document
0b dm_folder
0c dm_cabinet
0d dm_assembly
10 dm_method
11 dm_user
12 dm_group
19 dm_registered
1f dmi_index
26 dmi_registry
27 dm_format
28 dm_filestore
28 dm_store
2c dm_distributedstore
2e dmi_type_info
2f dm_dump_record
30 dmi_dump_object_record
31 dm_load_record
32 dmi_load_object_record
37 dm_relation
3a dm_location
3b dm_fulltext_index
3c dm_docbase_config
3d dm_server_config
40 dm_blobstore
41 dm_note
45 dm_acl
46 dm_policy
49 dmi_package
4a dmi_workitem
4c dm_activity
4d dm_workflow
53 dm_literal_expr
5e dm_federation
5f dm_audittrail_acl
5f dm_audittrail_group
5f dm_audittrail
66 dm_alias_set
6a dmi_dd_attr_info
0b dm_taxonomy
0b dm_xml_application
6b dm_display_config
20 dmi_sequence

30. Job scheduler Query

SELECT ALL r_object_id, a_next_invocation
FROM dm_job
WHERE (
(run_now = 1)
OR ( (is_inactive = 0)
AND ( ( a_next_invocation <= DATE(’now’)
AND a_next_invocation IS NOT NULLDATE )
OR ( a_next_continuation DATE(’now’))
OR (expiration_date IS NULLDATE))
AND ( (max_iterations = 0)
OR (a_iterations Template Properties
3) Under Template Audit Trail Setting, select option ‘Always On’ – Audit trail data for each instance will be available and saved at workflow completions.

31. In a workflow, a performer can enter comments while he/she is performing the task. And those comments are carried to the next performer in this workflow. When using WebPublisher workflow report to review the workflow instances, and in workflow history, you are only able to get the truncated comments back from WP’s interface. Especially for those already aborted workflow instances, there is no way that you can get the complete comments back from WP’s GUI. In some cases, those comments are very important to our customers and they need to find a way to get those comments back.

Here is the steps to get those comments back:

==

1) Identify the workflow from the dm_workflow table, get the r_object_id of the workflow:

select r_object_id, object_name from dm_workflow where object_name = ‘your work flow name’
2) Identify the notes that are carried by this workflow:

select r_note_id from dmi_package where r_workflow_id = ‘ the object id of the workflow’
3) Get the content id of each of those note ids returned:

select r_object_id from dmr_content where any parent_id = ‘the note id’
4) Go to DA, Administration->Job Management->Administration, use the “GET_PATH” method to find out the path of the files which stores the comments.

32. Query to get all documents expired in previous 1 month

SELECT s.r_object_id, s.object_name, DATETOSTRING(”r.a_expiration_date”,’mm/dd/yyyy’) as creation_date
FROM dm_sysobject_s s, dm_sysobject_r r
WHERE s.r_object_id = r.r_object_id
AND s.r_object_type = ‘dm_document’
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) >= 0
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) <= 1
AND r.r_version_label = ‘Expired’
ORDER BY 3

33. DQL to find all the folders in a Cabinet, where the folders are contentless
SELECT f1.object_name, f1.r_object_id, f1.r_folder_path
FROM dm_folder f1
WHERE FOLDER(’/Cabinetname’,descend)
AND NOT EXISTS (SELECT f2.object_name FROM dm_sysobject f2 WHERE ANY f2.i_folder_id = f1.r_object_id)
ORDER BY object_name
34. Find Super Groups and sub groups
select distinct r_object_id, group_name as super_groups
from dm_group_sp where group_name not in (select gs.group_name
from dm_group_r gr, dm_group_s gs
where gr.r_object_id = gs.r_object_id
group by gs.group_name
having count(gr.i_supergroups_names) > 1)
union
select distinct r_object_id, group_name as sub_groups
from dm_group_sp where group_name in (select gs.group_name
from dm_group_r gr, dm_group_s gs
where gr.r_object_id = gs.r_object_id
group by gs.group_name
having count(gr.i_supergroups_names) > 1) ;

35. DQL for finding all checked out documents in a docbase
select * from dm_document where (r_lock_owner is not nullstring or r_lock_owner ” or r_lock_owner ‘ ‘)

36.DQL to list the users who has access to particular folder path
SELECT i_all_users_names FROM dm_group
WHERE group_name IN (SELECT r_accessor_name FROM dm_acl
WHERE object_name IN (SELECT acl_name FROM dm_folder
WHERE ANY r_folder_path = ‘/folderpath’))
ORDER BY i_all_users_names

37. Query to find out what user signed off on what document

SELECT “audited_obj_id” FROM “dm_audittrail” WHERE
“event_name” = ‘dm_signoff’ AND
“user_name” = ‘tom’ AND
substr (”audited_obj_id”, 1, 2) = ‘09’AND
“time_stamp” >= DATE(’01/01/1998′, ‘dd/mm/yy’) AND
“time_stamp” SELECT object_name, r_version_label FROM dm_sysobject where any r_version_label in (’WIP’) and r_object_id not in (select r_object_id from dm_sysobject where any r_version_label in (’Staging’, ‘Approved’, ‘Expired’) )

39. Query to get all expired documents in previous month
SELECT s.r_object_id, s.object_name, DATETOSTRING(”r.a_expiration_date”,’mm/dd/yyyy’) as creation_date
FROM dm_sysobject_s s, dm_sysobject_r r
WHERE s.r_object_id = r.r_object_id
AND s.r_object_type = ‘dm_document’
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) >= 0
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) <= 1
AND r.r_version_label = ‘Expired’
ORDER BY 3

0. Query to find the file system path location of a document

select doc.r_object_id, doc.object_name, MFILE_URL(”,-1,”) as mypath,doc.i_folder_id from dm_document doc
where
——————————————————————

Thursday, March 22, 2007
DQL Tips
————————————————————————————-

*** get CURRENT TIME on server ***
select DATE(NOW) as systime from dm_server_config

————————————————————————————-

*** get the implicit version label ***
select s.r_object_id,s.object_name,r.r_version_label from dm_sysobject s, dm_sysobject_r r where r.r_object_id = s.r_object_id and

r.i_position = -1

————————————————————————————-

*** include r_object_id to remove blank rows

select object_name, r_object_id, a_expiration_date from dfas_common where folder(‘/Raj Srinivasan’) and any a_expiration_date is not nulldate

————————————————————————————-

*** select documents with pdf renditions (optimized for performance) ***
select * from dm_document where exists(select * from dmr_content where any parent_id=dm_document.r_object_id and full_format=’pdf’)

————————————————————————————-

*** select all documents that have nulldate in repeating attribute
select object_name from dfas_common where folder(‘/Raj Srinivasan) and r_object_id NOT IN (select r_object_id from dfas_common where folder(‘/Raj Srinivasan’) and any a_expiration_date is not nulldate)

————————————————————————————-

*** select all documents that have nulldate in repeating attribute or a_expiration_date has past
select count(*) from dfas_common where folder(‘/content/Corporate Resources/Human Resources’,descend) and (any a_expiration_date <

date(today) or (r_object_id NOT IN (select r_object_id from dfas_common where folder('/content/Corporate Resources/Human Resources',descend)

and any a_expiration_date is not nulldate)))

————————————————————————————-

*** select folderpath with filename
select distinct s.object_name, fr.r_folder_path from dm_sysobject (all)
s,dm_sysobject_r sr,dm_folder_r fr where sr.i_position = -1 and
sr.r_object_id = s.r_object_id and fr.r_object_id = sr.i_folder_id and
fr.i_position = -1 and fr.r_folder_path like '/ChemNet/%'
order by fr.r_folder_path,s.object_name

————————————————————————————-

*** empty folders ***
SELECT r_object_id,r_folder_path FROM dm_folder f WHERE r_object_id NOT IN
(SELECT distinct i_folder_id FROM dm_sysobject WHERE any i_folder_id = f.r_object_id and folder('/content',descend)) and folder('/content',descend)

————————————————————————————-

*** NULL a_effective_date ***
select object_name from dfas_common where folder('/images', descend) and r_object_id NOT IN (select r_object_id from dfas_common where folder('/images', descend) and any a_effective_date is not nulldate)

————————————————————————————-

*** select component from workitem ***
select
r_component_id
from
dmi_package p
where
exists (select r_object_id
from dmi_workitem w
where
w.r_object_id = and
w.r_workflow_id = p.r_workflow_id and
w.r_act_seq_no = p.r_act_seq_no)

————————————————————————————-

*** select renditions ***
SELECT s.object_name, f.dos_extension
FROM dm_dbo.dm_sysobject_s s, dm_dbo.dmr_content_r c, dm_dbo.dm_format_s f
WHERE (c.parent_id = s.r_object_id)
and (c.i_format = f.r_object_id)
AND c.page=0 AND f.dos_extension ‘xml’
AND folder(‘/whatever’)

————————————————————————————-

*** find workflow given document ***
select * from dm_workflow where r_object_id in (select r_workflow_id from dmi_package where any r_component_id in (select r_object_id from

dm_sysobject (all) where i_chronicle_id in (select i_chronicle_id from dm_sysobject where r_object_id=”))) and r_runtime_state=’1′

————————————————————————————-

*** return only inherited attributes ***
SELECT attr_name FROM dmi_dd_attr_info WHERE type_name = ‘my_custom_type’ AND attr_name NOT IN
(SELECT attr_name FROM dmi_dd_attr_info WHERE type_name = ‘dm_document’)

————————————————————————————-

Documents that are uploaded in to docbase b/w Aug 2004 and Oct 2004

select a.r_object_id,a.r_creation_date,a.r_modify_date,b.user_group_name
from dm_document a, dm_user b
where (a.r_creation_date >= Date(’08/01/2004′,’mm/dd/yyyy’) and a.r_creation_date 0

————————————————————————————-

Subject: Why do we create four views for each subtype?

Note: For example the type dm_document has four views:

dm_document_sp
dm_document_sv
dm_document_rp
dm_document_rv

The two _sp and _rp views are used by DQL and the two
_sv and _rv views are used by the Object Manager.
Also, the _sp and _sv views are for single (non-repeating) attributes, while the _rv and _rp views are for repeating attibutes.

————————————————————————————-

Label Text of the either Sytem Type or Custom Type

select label_text from dm_nls_dd_info where parent_id in
(select r_object_id from dm_aggr_domain where type_name = ‘field_type’)

Results:
Content Location
Keywords Category
Business Unit Owner

————————————————————————————-

DQL to list all documents attributes and their associated folder path

select s.object_name, fr.r_folder_path
from dm_document s, dm_sysobject_r sr,
dm_folder_r fr
where s.i_is_deleted = 0
and sr.i_position = -1
and sr.r_object_id = s.r_object_id
and fr.r_object_id = sr.i_folder_id
and FOLDER(‘/ChemNet’, descend)
and fr.r_folder_path like ‘/ChemNet/%’
order by fr.r_folder_path,s.object_name

————————————————————————————-

*** Web cabinet of a content ***

SELECT object_name FROM dm_cabinet
WHERE r_object_id IN (SELECT i_cabinet_id FROM dm_folder
WHERE r_object_id IN (SELECT i_folder_id FROM dm_document (ALL)
WHERE object_name like ‘test%’)) AND r_object_type=’wcm_channel’

OR

select r_object_id, object_name from wcm_channel where r_object_id in
(select i_ancestor_id from dm_folder where r_object_id in
(select i_folder_id from dm_sysobject where object_name = ‘test’))

————————————————————————————-

*** To get the first level folders from the cabinets ***

select object_name from dm_folder where any i_folder_id in (select r_object_id from dm_cabinet where object_name=’Cabinets’)

————————————————————————————-
*** To show the previous Active content ***

select r_object_id,i_chronicle_id,DATETOSTRING(DATE(TODAY),’ddmmyyyy’) as sysdate from dm_document (ALL) where object_name like ‘test%’ and

FOLDER(‘/ChemNet/ChemonicsProcess/Bidding’) and
any r_version_label = ‘Active’

————————————————————————————-
To find the folders for particular group for specified permission

select for write object_name from dm_folder where acl_name IN (select object_name from dm_acl where any r_accessor_name = ‘dm_world’) and folder(‘/ChemNet’,descend)

or

select object_name from dm_folder where acl_name IN (select object_name from dm_acl where any r_accessor_name = ‘dm_world’ and any r_accessor_permit = ‘7’) and folder(‘/ChemNet’,descend)

1 – NONE
2 – BROWSE
3 – READ
4 – RELATE
5 – VERSION
6 – WRITE
7 – DELTE

————————————————————————————-

DFC to insert rows into registered table

public static IDfCollection execQuery(String queryString, IDfSession session)
throws DfException{
IDfCollection col = null; //Collection for the result
IDfClientX clientx = new DfClientX();
IDfQuery q = clientx.getQuery(); //Create query object
q.setDQL(queryString); //Give it the query

// example queryString: “insert into dm_dbo.your_registered_table
(field1, [field]) values(,[
col = q.execute(session, IDfQuery.DF_EXEC_QUERY);
System.out.println(“Query executed.”);
return col;
}

————————————————————————————-

How to avoid redundancy for this simple query?

select distinct d.object_name,sys.authors from dm_document d, dm_sysobject_r sys
where folder (‘/xyz/xyz_first’) and
d.r_object_id = sys.r_object_id and
(sys.i_position=-1 or (sys.i_position<=-2 and sys.authors is not null))

Introduction to DQL –DQL is a super set of ANSI-standard SQL, which is used to create, manage and drop all documentum object types in Documentum.This is also used to register the RDBMS table in Documentum to manipulate all database functions by querying.

What is DQL?

DQL (Documentum Query Language) is a superset of SQL and which allows you to do very simple/complex queries in Documentum like

• Search objects using given properties
• Searches for Full text with the help of FT engine
• Queries the external database table by registering in to Documentum
• Does Complex queries like joins with Register table and Objects types

DQL supports most of the sql functions by its own syntax.DQL uses syntax that is a superset of ANSI-standard SQL (Structured Query Language). Infact, part of your DQL statements are translated automatically into SQL before being executed by the eContent Server

• DQL query is sent to the eContent Server using one of four API methods
readquery, execquery, query, or cachequery
• eContent Server generates executes this API methods which isactually calling the sql engine
– SQL queries for the RDBMS
– Verity queries for the full-text search engine

The results of the query are stored on the server in a non-persistent collection object. Typically, a Documentum client will automatically present the results of the query to the user in some useful way. Alternatively, a Developer may want to use the resulting collection object or
manipulate the results programmatically.

Select Statement

Select (list of properties to fetch)
From (list of object types to be search)

Using WHERE clause

Allows the search to be narrowed by imposing search conditions on your Query

select [all | distinct] value [as name] {,value [as name] } from source_list [(all)]

[where qualification ]

Eg 1:
SELECT object_name, title FROM dm_document WHERE FOLDER (ID(’folder id’)) AND title LIKE ’%sr%’

Searching for a document in given folder path or cabinets

The scope of the search can be specified as folder and cabinet in the where clause to provide a way to search the cabinet/folder hierarchy.
Eg 1:
SELECT object_name, title FROM dm_document WHERE FOLDER (‘/exact folder path’) AND title LIKE ’%SOP%’
Eg 2;
In case of not having folder id or exact folder path ,
SELECT object_name, title FROM dm_document WHERE FOLDER (‘/Cabinet name’,descend) AND title LIKE ’%SOP%’
Which searches the given documents with in the cabinet.

REGISTER Statement

• Registers an RDBMS table so that eContent Server can recognize the sql table
• Allows access to data in an existing RDBMS table that may be created to support additional application data part of another application owned by someone else
• Does not verify that the table or its columns exist
• All columns in a table need not be registered
• Creates a dm_registered object in the System cabinet which provides a description of the table and user access to it

REGISTER permissions
• Only the Docbase owner with a SUPERUSER privilege can register a table from
within Documentum.
• To register a table, you must have at least READ permission on the table (through the
RDBMS grant command).
• The eContent Server account (installation owner) needs the appropriate RDBMS
privileges on the table to perform different operations on rows in the table.

Steps to create Register Table

1.Register a RDBMS table by register keyword
REGISTER TABLE [owner_name.]table_name
(column_def {,column_def})
[[WITH] KEY (column_list)]
[SYNONYM [FOR] ‘table_identification’]

Eg: REGISTER TABLE johndoe.”remote1″ (“columnA” int)

Note: All columns in a table need not be registered.

2. Update appropriate permission to the users on the register table.

Eg:
Update dm_registered objects set owner_table_permit =15 set world_table_permit=15 set group_table_permit=15 where object_name=’remote1’

The above query will update maximum permission on the table.

SYNONYM
Use the SYNONYM clause to register RDBMS tables that have synonyms in the underlying tables.
SYNONYM FOR londonserver.londonremote.johndoe.myremotetable
After he registers the table, he issues the following SELECT statement:

SELECT * FROM johndoe.”remote1″

Content Server substitutes the actual table name for the synonym and the following
SQL is generated:
SELECT * FROM londonserver.londonremote.johndoe.myremotetable

Special note for Oracle platforms
If you create a database link between the database on which the Documentum repository
is installed and another database, and then the use SYNONYM feature to obtain
information from that second database, both databases must be in the same codepage.

Useful Articles for Developers
EMC Developers Network

To Learn and certify with EMC Documentum
Learn EMC Documentum

To know about Documentum Products and EMC Support Forums
EMC PowerLink

Useful Articles for Developers and Support Forum
BlueFish Group

Others
What is Documentum?
EMC Documentum Support Community
DocumentumCookBook
dm_cram
Documentum Books and Training
Documentum Books

ACLS

Access Control Lists (ACLs) are Documentum’s method of restricting access to important documents. ACLs control Documentum’s security layer, one of the most flexible and powerful security schemes around.

In Documentum, an ACL can be shared by many documents. Instead of changing the permissions on a file, you change the ACL; all of the files that are using that ACL will be instantly updated. This is a very flexible approach.

Regular ACL and Internal ACL
A Regular ACL is an ACL that was created by an administrator or a user in the docbase. The attribute owner_name of this ACL will show a user name. For example, owner_name: dctmadmin
Internal ACLs are automatically generated by the docbase, and they have a computer generated name, such as dm_. For example dm_4507a12180000197

How are Internal ACLs created?
Every dm_sysobject object in the docbase has an ACL assigned to it. Depending on the ACL inheritance of the serverconfig object, you can set how new objects get their ACL.

There are four different ways to set an ACL to a particular object:
1. user
If your serverconfig is set to use “user”, then every time the user creates a new object, this object will get the same ACL values as the user’s default ACL.

2. folder
In a “folder” mode, the object gets its ACL from the folder where it is created.

3. type
Using “type” mode, default ACL of the type is being used to set the values of the newly created object’s ACL.

4. permission set templates
You can use permission set template to set the ACL of an object. The requirement for permission set template is that the Server needs to be able to resolve any alias sets that might be related to the Permission Set Template.
See Documentum eContent Server Object Reference Manual (Alias Scope)

How do I find out the number of ACLs in my docbase?
1. Total ACLs:
DQL> select count(*) as ACLs_Count from dm_acl

2. For Named ACLs created by users or the system administrator, you can run:
DQL> select count(*) as Count_Named_ACLs from dm_acl where r_is_internal=0 and acl_class = 0

3. For Template ACLs, you can run:
DQL> select count(*) as Count_of_Template_ACLs from dm_acl where r_is_internal=0 and acl_class 0

4. For Internal ACLs, you can run:
DQL> select count(*) as Count_of_Internal_ACLs from dm_acl where r_is_internal=1 and acl_class = 0

5. For Internal ACLs created from Template ACLs, you can run:
DQL> select count(*) as Count_of_Internal_ACLs_From_Template from dm_acl where r_is_internal=1 and acl_class 0

You should have:
#1 = #2 + #3 + #4 + #5

Implication of Many ACLs in Docbase
There is a good chance that the number of Internal ACLs (query #4 above) is high and represents more than 95% of the total number of ACLs in the docbase (query #1). Those are the ACLs that we can get rid of. Also, once your docbase is properly set up, no new Internal ACLs should be created any more.

Find out which Default ACL Mode the Docbase is currently using, then identify the folders / type / users which are using an Internal ACl and change it to a Named ACL so that the docbase stops generating Internal ACLs.

Step A
A.1. First, run the following query to find out what Default ACL the docbase is using:
DQL> select default_acl as Default_ACL_Mode from dm_server_config where object_name=”

A.2. The result should be 1, 2 or 3 but regardless of the result, we suggest that you go through all the steps A.2.1, A.2.2 and A.2.3. The reason is that you want to remove all references to Internal ACls that folders or types or users may have.

A.2.1 If Default ACL mode is 1 (Folder):
Retrieve all the folder names which have an Internal ACL:
DQL> select r_object_id, acl_name, acl_domain, object_name from dm_folder where acl_name like ‘dm_45%’

Update the ACLs of all folders that have Internal ACLs to your Named ACL.
DQL> update dm_folder objects set acl_name = ”, set acl_domain = ” where acl_name like ‘dm_45%’

Note: ‘your docbase name’ is the name of the docbase and ‘your system ACL’ is the name of a system ACL that you want to use as the default ACL. A system ACL is a Named ACL owned by the system administrator which can be shared across users.

Note: You need to update the acl_domain also if you want to update the acl of an object.

Note: We strongly recommend that you use a Named ACL that is owned by System. The reason is because you want to easily share this Named ACL with other users.

A.2.2 If Default ACL mode is 2 (Type):
Retrieve the default ACL and the owner name of the ACL for object types if the types have an Internal ACL associated with them:
DQL> select r_type_name, acl_name, acl_domain from dmi_type_info where acl_name like ‘dm_45%’ or acl_name = ‘ ‘

Update the ACLs of all types that using an Internal ACL or are don’t have an ACL assigned and are subtypes of dm_sysobject by using Documentum Administrator interface. No DQL query is available for this task since dmi_type_info is an internal type.

A.2.3 – If Default ACL mode is 3 (User):
Retrieve all users (and groups) that are using an Internal ACL:
DQL> select r_object_id, user_name, acl_name from dm_user where acl_name like ‘dm_45%’

Assign a named ACL to those users (and groups):
DQL> update dm_user objects set acl_name = ”, set acl_domain = ” where acl_name like ‘dm_45%’

Note: ‘your docbase name’ is the name of the docbase and ‘your system ACL’ is the name of a system ACL that you want to use as the default ACL. A system ACL is a Named ACL owned by the system administrator which can be shared across users.

Note: Make sure you update the acl_domain together with the acl_name. If the acl that you are assigning is not part of the current acl_domain, the server will return an error.

Note: Use a Named ACL that is owned by System (acl_domain=your docbase name rather than acl_domain= user). The reason is because you want to easily share this Named ACL with other users and this is only possible if the ACL is owned by System.

Step B
At this point, you docbase should not generate new Internal ACLs. However, existing objects may be using an Internal ACL. This step helps you indentify those objects and change the Internal ACL to a Named ACL. This step is required before attempting to remove Internal ACLs.

B.1 – Retrieve all objects (content and folders) across the docbase that are using an Internal ACL:
DQL> select count(*) from dm_sysobject (all) where acl_name like ‘dm_45%’ and acl_name not like ‘dm_45%\_8%’ ESCAPE ‘\’

If you need to review those objects one by one:
DQL> select r_object_id, object_name, acl_name, acl_domain from dm_sysobject (all) where acl_name like ‘dm_45%’ and acl_name not like ‘dm_45%\_8%’ ESCAPE ‘\’

B.2 – Assign your Named ACL to all objects (content and folders) across the docbase that have Internal ACL:
DQL> update dm_sysobject (all) objects set acl_name=”, set acl_domain=” where acl_name like ‘dm_45%’ and acl_name not like ‘dm_45%\_8%’ ESCAPE ‘\’ and r_lock_owner is NULLSTRING

Note: ‘your docbase name’ is the name of the docbase and ‘your system ACL’ is the name of a system ACL that you want to use as the default ACL. A system ACL is a Named ACL owned by the system administrator which can be shared across users.

Note: Only the contents that are not checked out will be updated. You may want to run this query periodically until no contents get returned from the queries in B.1

Note: You can refine the query so that only a subset of those objects get a Named ACL – per folder or creation date for instance.

Note: Update the acl_domain together with the acl_name. If the acl that you are assigning is not part of the current acl_domain, the server will return an error.

Note: Use a Named ACL that is owned by System (acl_domain=your docbase name rather than acl_domain=user). The reason is because you want to easily share this Named ACL with other users and this is only possible if the ACL is owned by System.

Note: This query may take quite some time to run. In fact, the update statement may update so many objects at the same time that your database may run out of TEMP tablespace causing the query to fail. You may want to modify the query to modify a limited number of objects at the same time – by restricting per folder or creation date.

Note: You may not be able to update non-CURRENT objects if they are immutable. If this is your case, the query will return error DM_SYSOBJECT_E_CANT_SAVE_IMMUTABLE. In order to resolve this issue, you can take the ‘(all)’ keyword out of the update statement so that only CURRENT objects will be updated. This may leave quite a significant number of Internal ACLs left in the docbase that are used by non-CURRENT objects.

Step C
Now that no new Internal ACL is created and most of the objects in the docbase are assigned a Named ACL – the remaining Internal Acls are those created from Template ACLs. Your docbase is now hosting many orphan ACLs. It is time to clean them up!

Job dm_clean can delete orphan ACLs from the docbase. While running job dm_clean (from Documentum Administrator or you can schedule the job to run periodically), make sure that argument ‘-clean_acl’ is set to TRUE.

Before running the job, you can find out how many ACL the job will clean after going through step A and B:
DQL> select count(*) as Number_of_Internal_ACLs from dm_acl where r_is_internal=1 and acl_class = 0

To get more details about those ACLs:
DQL> select * from dm_acl where r_is_internal=1 and acl_class = 0

If you agree with the result, run dm_clean and go to Step D.

For more information, Refer to Documentum eContent Server Administrator’s Guide Chapter 10 “Removing Unreferenced Internal ACLs”.

Step D
Restart the docbase. Active sessions may still be running with no default ACLs and will keep generating internal ACLs.

After running dm_clean and restarting the docbase, you can verify if all Internal ACLs are gone by re-running the same queries as in Step C:
DQL> select count(*) as Number_of_Internal_ACLs from dm_acl where r_is_internal=1 and acl_class = 0

To get more details about those ACLs:
DQL> select * from dm_acl where r_is_internal=1 and acl_class = 0

You can identify the remaining documents that are still using a Internal ACL:
DQL> select r_object_id, object_name, title, acl_name, owner_name, r_version_label from dm_sysobject (all) where acl_name in (select object_name from dm_acl where object_name like ‘dm_45%’ and object_name not like ‘dm_45%\_8%’ ESCAPE ‘\’) order by 1

To know more about ACLS Click on below Link

  • EMC Powerlink Support Notes.
    What are Access Control Lists?