software development, devops, and other drivel
Tree lined path

PeopleTools Security Tables

Page Nav

Security is a very important part of any PeopleSoft application. It determines what pages users can see all the way down to which rows. It may seem overwhelming at first but don’t worry; it’s pretty straightforward once you learn all the pieces and how they’re connected.

Below you will find a list of the Main PeopleTools Security Records along with a brief summary of their purpose. Knowing these tables can prove useful to quickly troubleshoot, determine which users have what security or even to audit user security regularly.

At the bottom of the page, you will find some example SQLs which are related to PeopleSoft security.

User Tables

PSOPRDEFNStores all operators (users) in the PeopleSoft system. Also stores their employee ID (EMPLID), encrypted password, primary permission list, default navigator home page, process profile permission list and row security permission list.
PSROLEUSERThe highest level of security access is defined by roles (think of them as groups). This table stores the roles the user belongs to.
PSOPRCLSRoles link together permission lists which are the security objects that define access to components, pages, and other areas of the system. This view returns the permission lists that a user has access to via their roles. Note that prior to PeopleTools 8, permission lists were synonymous with classes and most of the security tables still use this convention.
PSOPRALIASAliases can be mapped to a particular operator ID (user). The obvious alias is employee ID (EMPLID) but others include external organisation ID (EXT_ORG_ID) and customer ID (CUST_ID). All ways of referring to the same entity.
PSOPRALIASTYPEThis is the setup table for operator aliases
PSOPRALIASFIELDThis is the setup table that maps operator aliases to records & fields
PSUSERATTRUser attributes store the a hint password question & response for a user (if this is enabled)
PSUSEREMAILEmail addresses for users.


PSROLEDEFNStores roles and their properties. Roles can be assigned dynamically through Query, PeopleCode or LDAP. Roles are also used in conjunction with Workflow and routing.
PSROLECLASSRoles are made of up of one or permission lists, and this table links the two together. Very handy.

Permission Lists

PSCLASSDEFNPermission lists are where the security really happens. They provide access to menus, components and pages and a host of other security including PeopleTools, Process security, Component Interfaces, Web Libraries, Web Services, Personalisations, Query and Mass Change.
PSAUTHITEMThe link between permission lists and menus
PSAUTHBUSCOMPThe link between permission lists and component interfaces and their methods
PSAUTHOPTNThe link between permission lists and personalisations
PSAUTHPRCSThe link between permission lists and process groups
PSAUTHSIGNONThe link between permission lists and signon times
PSAUTHWEBLIBVWA view linking permission lists and access to web libraries (really just Menus in PSAUTHITEM that begin with WEBLIB_).
PSAUTHWSThe link between permission lists and web services (service operations)
PS_SCRTY_ACC_GRPThe link between permission lists, trees and query access groups
PS_MC_OPR_SECURITYThe link between permission lists and mass change templates. This is an odd table, it uses the field OPRID but really it links permission lists

PeopleSoft Login Details and Authorization

PSACCESSLOGLogin and logout information of the users
PSACCESSPRFLContains the symbolic id,accessid/password details.
PSCLOCKLogin fails if the table is empty

Query Security Tree

PSTREENODEHolds the query security tree records, which tree and tree node they belong to.

Example SQL Queries

Get a list of users who logged in on a particular day

SELECT  distinct a.oprid,
        b.oprdefndesc AS "EMPLOYEE NAME",
        to_char(a.logindttm, 'Month DD, YYYY') AS "LOGIN DATE"
FROM psaccesslog a
INNER JOIN psoprdefn b
ON (a.oprid not in ('PS', 'PSEM', 'PTWEBSERVER') and a.oprid = b.oprid)
WHERE trunc(a.logindttm) = '28-JUN-17';

Get a list of a users roles and associated permission lists

FROM psoprdefn a
INNER JOIN psroleuser b
ON (a.OPRID = 'PS508' and a.OPRID = b.roleuser)
INNER JOIN psroleclass c
ON b.rolename = c.rolename
INNER JOIN psclassdefn d
ON c.classid = d.classid;

Get a list of user roles, permissions and page access with menu path

SELECT DISTINCT d.roleuser, 
                b.classid                  AS PERMISSION_LIST, 
                b.baritemname              AS "COMPONENT NAME", 
                c.descr                    AS "PAGE DESCRIPTION", 
                Decode(b.displayonly, 1, 'Y', 'N') AS "DISPLAY ONLY?", 
FROM   sysadm.psroleclass a, 
       sysadm.psauthitem b, 
       sysadm.pspnldefn c, 
       sysadm.psroleuser d, 
       (SELECT LEVEL0.portal_label 
               || ' > ' 
               || LEVEL1.portal_label 
               || ' > ' 
               || LEVEL2.portal_label 
               || ' > ' 
               || level3.portal_label AS navigation, 
               level3.portal_uri_seg2 AS component 
        FROM   psprsmdefn level3, 
               psprsmdefn level2, 
               psprsmdefn level1, 
               psprsmdefn LEVEL0 
        WHERE  level3.portal_prntobjname = level2.portal_objname 
               AND level2.portal_prntobjname = level1.portal_objname 
               AND level1.portal_prntobjname = LEVEL0.portal_objname 
               AND level3.portal_name = level2.portal_name 
               AND level2.portal_name = level1.portal_name 
               AND level1.portal_name = LEVEL0.portal_name) e 
WHERE  a.classid = b.classid 
       AND b.pnlitemname = c.pnlname 
       AND a.rolename = d.rolename 
       --AND d.roleuser = 'USER' 
       --AND b.baritemname = 'COMPONENT NAME' 
       --AND d.rolename = 'ROLENAME' 
       --AND b.classid = 'MENU NAME' 
       AND e.component = b.baritemname 
ORDER  BY 1, 2, 3, 4, 5, 6; 

Get Permission list sign on times in a human readable format:

        0, 'SUNDAY',
        1, 'MONDAY',
        2, 'TUESDAY',
        3, 'WEDNESDAY',
        4, 'THURSDAY',
        5, 'FRIDAY',
        6, 'SATURDAY'
    ) as "DAY",
    to_char(to_date(STARTTIME*60, 'SSSSS'), 'HH12:mi AM') as "START TIME",
    to_char(to_date(ENDTIME*60, 'SSSSS'), 'HH12:mi AM') as "END TIME"