department -- Contains one row per dept. or node dept_id number(8) not null d_code varchar2(15) not null short_name varchar2(25) not null long_name varchar2(70) not null dept_type_id number(4) not null create_date date created_by varchar2(8) modified_date date modified_by varchar2(8) Indexes: Unique index on dept_id Unique index on short_code Constraints: deptnode_type_id must match a dept_node_type.dept_type_id more_dept_info -- Additional info for each dept. (expand in future) dept_id number(8) not null ao_mit_id varchar2(9) dept_head_mit_id varchar2(9) Indexes: Unique index on dept_id Constraints: dept_id must match a department.dept_id dept_node_type -- Types (each dept has a type) dept_type_id number(5) not null dept_type_desc varchar2(50) check_object_link varchar2(1) CHECK(check_object_link IN ('Y', 'N')) department_child -- Defines department parent/child links parent_id number(12) not null view_subtype_id number(5) not null child_id number(12) not null created_by varchar2(8) start_date date end_date date Indexes: Unique index on parent_id, view_subtype_id, and child_id Non-unique index on parent_id Constraints: parent_id must match a department.dept_id child_id must match a department.dept_id view_subtype_id must match a view_subtype.view_subtype_id Additional constraints to be enforced by stored procedures: - A parent_child link must not create a circular loop (i.e., a department cannot be its own parent, grand-parent, great-grand-parent, etc.) - Every department except the root must have at least one link to a parent view_type -- There may be more than one tree "view" view_type_code varchar2(8) not null view_type_desc varchar2(50) root_dept_id number(8) Indexes: unique index on view_type_code Constraints: root_dept_id must match a department.dept_id view_subtype -- A view_type can have 1 or many subtypes view_subtype_id number(5) not null view_subtype_desc varchar2(50) Indexes: unique index on view_subtype_id view_type_to_subtype -- Maps a view_type to list of parent/child subtypes view_type_code varchar2(8) not null view_subtype_id number(5) not null Index: unique index on view_type_code and view_subtype_id Constraints: view_type_code must match a view_type.view_type_code view_subtype_id must match a view_subtype.view_subtype_id object_type -- External object types, e.g., Prof Ctrs, Funds Ctrs, etc. object_type_code varchar2(8) not null obj_type_desc varchar2(50) obj_type_html_name varchar2(50) -- Name for table columns min_link_count number(6) -- minimum links to this obj type per dept -- min_link_count: Applies when check_object_link = 'Y' for dept_type_id max_link_count number(6) -- maximum links to this obj type per dept -- max_link_count: Applies when check_object_link = 'Y' for dept_type_id import_conversion varchar2(1000) -- import_conversion -- SQL code fragment for converting object code -- from external table to internal object code fmt export_conversion varchar2(1000) -- export_conversion -- SQL code fragment for converting internal -- object code to format in external table validation_table varchar2(60) -- validation_table -- Table or view in which to find object code validation_field varchar2(50) -- validation_field -- Field within validation_table to find obj code validation_mask1 varchar2(50) validation_mask2 varchar2(50) validation_mask3 varchar2(50) validation_mask4 varchar2(50) -- validation_mask1 -- If validation_mask* is not null, internal ... -- validation_mask2 -- ... object_code must match one of the ... -- validation_mask3 -- ... validation masks which are strings ... -- validation_mask4 -- ... to be used in a SQL "LIKE" clause. Index: unique index on object_type_code object_link -- Link between a dept and an external object dept_id number(8) not null object_type_code varchar2(8) not null object_code varchar2(20) not null Indexes: Non-unique index on dept_id Non-unique index on object_code Constraints: dept_id must match a department.dept_id object_type_code must match an object_type.object_type_code -- Additional tables for later development -- * In the future, we should design tables to record an audit trail for changes made to the hierarchy of departments and links to other objects
-- First set (high priority) -- FUNCTION can_maintain_dept (ai_for_user, ai_dept_id) /* Determine whether a user is authorized to maintain department info */ /* More notes: For first pass, always return 'Y'. Later, we'll interface with the Roles Database */ FUNCTION can_maintain_links (ai_for_user, ai_dept_id) /* Determine whether a user is authorized to maintain department links to other objects */ /* More notes: For first pass, always return 'Y'. Later, we'll interface with the Roles Database */ add_dept (ai_for_user, ai_d_code, ai_short_name, ai_long_name, ai_dept_type_id, ai_view_subtype_id, ai_parent_id, ao_dept_id, ao_message); /* Add a new department or node in the department hierarchy */ /* More notes: If ai_for_user is null, use user instead. Check can_maintain_dept Make sure d_code starts with D_ and is <= field length Make sure short_name is not null and <= field length Make sure long_name is not null and <= field length Make sure dept_type_id is found in dept_node_type table Make sure view_subtype_id is found in view_subtype table Make sure parent_id is not null and matches an existing dept For ai_dept_type_id, ai_view_subtype_id, and ai_parent_id, start with character strings and convert to numbers If everything was OK, then insert into department table and into department_child table Return the new dept_id and a message "Dept nnnnnn successfully added" */ delete_dept (ai_for_user, ai_dept_id, ao_message); /* Delete a department or node in the department hierarchy */ /* More notes: If ai_for_user is null, use user instead. Check can_maintain_dept Make sure this department does not have any child departments If everything checks out OK, delete from department table and delete from department_child table where child_id = ai_dept_id */ /* For next 5 stored procedures, if ai_for_user is null, use user instead Check can_maintain_dept for ai_for_user Check for not-null, and length of input paramenters Accept numeric parameters as character strings and convert to numbers */ update_dept_code (ai_for_user, ai_dept_id, ai_short_code, ao_message); /* Change the d_code of a department or node */ update_dept_name (ai_for_user, ai_dept_id, ai_short_name, ai_long_name, ao_message); /* Change the short_name and/or long_name of a department or node */ update_dept_parent (ai_for_user, ai_dept_id, ai_view_subtype_id, ai_old_parent_id, ai_new_parent_id, ao_message); /* Move a department or node, i.e., change its parent link. If this causes the dept_id to have more than one parent in the table department_child, then each parent/child record must have a different view_subtype_id. */ add_dept_parent (ai_for_user, ai_dept_id, ai_view_subtype_id, ai_parent_id, ao_message); /* Add another parent link for a department or node. If this causes the dept_id to have more than one parent in the table department_child, then each parent/child record must have a different view_subtype_id. */ delete_dept_parent (ai_for_user, ai_dept_id, ai_view_subtype_id, ai_parent_id, ao_message); /* Delete one of the parent links for a department or node. (You cannot delete the link if there is only one link.) */ /* For next 2 stored procedures, if ai_for_user is null, use user instead Check can_maintain_links for ai_for_user Check for not-null, and length of input paramenters Accept numeric parameters as character strings and convert to numbers */ add_link_to_object (ai_for_user, ai_dept_id, ai_object_type, ai_object_code, ao_message); /* Add a link between a department and another object type */ delete_link_to_object (ai_for_user, ai_dept_id, ai_object_type, ai_object_code, ao_message); /* Delete a link between a department and another object */ -- 2nd set (lower priority) -- Write stored procedures for * Adding or deleting a view_subtype * Changing the description for a view_subtype * Adding or deleting a dept_node_type * Changing the description for a dept_node_type * Adding a view_type (with desc, optional root_dept_id, and list of view_subtype_id's from view_type_to_subtype table) * Deleting a view_type * Updating a view_type, e.g., changing description, root_dept_id, or the list of view_subtype_id's from view_type_to_subtype table * Adding an object type (with all of its fields) * Deleting an object type -- 3rd set (also lower priority) -- * Write triggers for maintaining an audit trail for changes to department hierarchy and links to other objects
Build a web-based interface to do the following: -- Phase 1 (high priority) -- * Allow authorized user to Add, delete, change name, or move a department. For first phase, presume that there is only one view_type_code and view_subtype_code, which is set by default for each parent-child relationship. * Allow authorized user to Add or delete links between a department and other objects * Generate exception reports. If it is time-consuming and resource-intensive to do exception report on all departments, allow an option for running it on only one department. Flag the appropriate department or object link where any of the following rules are broken: + After applying export conversion rules to the object_code, make sure it is found in the target table + If there are one or more non-null validation_masks for the given object_type_code, make sure the object_code matches at least one of them + For each department and object_type, make sure the number of links of a given object_type_code is between min_link_count and max_link_count (This only applies to departments that have no department children) -- Phase 2 (medium priority) -- * Extend add/delete/move department interface to support multiple view types and subtypes. We can take a simple approach and demand that the user making changes can handle the subtleties of this, or we can try to build a more sophisticated interface that helps the user through these subtleties. -- Phase 3 (lower priority) -- * Add an interface for maintaining view_types, view_subtypes, and and object_types.
-- What, if any, are the rules for links to objects from a node in the department hierarchy? -- What additional rules, if any, do we need to apply to make sure that we do not have multiple department connections to the same object? Should we have another report that checks for this?
-- (Done) Set up an Oracle username (MDEPT$OWNER) to own the tables and stored procedures -- (Done) Set up a different Oracle username to do SELECT statements and run the stored procedures (MDEPT$USER) -- (Done) Set up a Unix username and directories to store .SQL scripts for defining tables and stored procedures -- (Done 12/18) Create scripts for tables, along with indexes. Grant SELECT privileges to MDEPT$USER. -- (Done 12/18) Insert a few test rows into tables, to be used for testing stored procedures -- (Done) Write more detailed description of 1st set of stored procedures (exactly what will you check, what will you insert, delete, or update). -- Write specification determining who is authorized to do what, along with a stored function to check it. -- Write and test first set of stored procedures. -- Do initial load of departments, department hierarchy, and links from other objects. (Must decide on initial department number, and use a sequence for subsequent numbers.) -- Mock up a static html document for a user interface for (1) Adding/deleting/moving departments in the hierarchy (2) Adding/deleting links between a department and other objects -- Rewrite stored functions can_maintain_dept and can_maintain_links to use the Roles Database -- Decide on environment for developing web interface (Perl CGI scripts, Java Servlets, or PHP). If necessary, set up the development environment on a test machine. -- Build web tools for phase 1 of user interface -- Work with Warehouse team to develop a feed of Department data and links to the Warehouse. -- Build web tools for phase 2 of user interface -- Write specifications, write, and test 2nd set of stored procedures -- Build web tools for phase 3 of user interface -- More future work: Design and implement tables for audit trail, triggers to populate these tables whenever changes are made, and a user interface tool to look at the audit trail information