[working/Evergreen.git] / 1.6 / admin / migratingdata.xml
1 <?xml version='1.0' encoding='UTF-8'?>\r
2 <chapter xmlns="" xmlns:xi=""\r
3             xmlns:xl="" version="5.0" xml:id="migratingdata" >\r
4         <info>          \r
5         <title>Migrating Data</title>\r
6                 <abstract>\r
7                         <para>Migrating data into Evergreen can be one of the most daunting tasks for an administrator. This chapter will explain some procedures to help to migrate \r
8                         bibliographic records, copies and patrons into the Evergreen system. This chapter requires advanced ILS Administration experience, knowledge of Evergreen data structures, \r
9                         as well as knowledge of how to export data from your current system or access to data export files from your current system.</para>\r
10                 </abstract>\r
11         </info>    \r
12         <section xml:id="migratingpatrons">\r
13                 <title>Migrating Patron Data</title>\r
14                 <para>\r
15                 This section will explain the task of migrating your patron data from comma delimited files<indexterm><primary>comma delimited files</primary></indexterm> into Evergreen. \r
16                 It does not deal with the process of exporting from the non-Evergreen \r
17                 system since this process may vary depending on where you are extracting your patron records. Patron could come from an ILS or it could come from a student database in the case of \r
18                 academic records.               \r
19                 </para>\r
20                 <para>When importing records into Evergreen you will need to populate 3 tables in your Evergreen database:</para>\r
21                 <itemizedlist>\r
22                         <listitem><link linkend="actor.table.usr">actor.usr</link> - The main table for user data</listitem>\r
23                         <listitem><link linkend="actor.table.card">actor.card</link> - Stores the barcode for users; Users can have more than 1 card but only 1 can be active at a given time;</listitem>\r
24                         <listitem><link linkend="actor.table.usr-address">actor.usr_address</link> - Used for storing address information; A user can have more than one address.</listitem>\r
25                 </itemizedlist>\r
26                 <para>Before following the procedures below to import patron data into Evergreen, it is a good idea to examine the fields in these tables in order to decide on a strategy \r
27                 for data to include \r
28                 in your import. It is important to understand the data types and constraints on each field.</para>\r
29                 <procedure>\r
30                         <step>\r
31                                 <para>Export the patron data from your existing ILS or from another source into a comma delimited file. The comma delimited file used for importing\r
32                                  the records should use Unicode (UTF8) <indexterm><primary>Unicode</primary></indexterm> character encoding.</para>\r
33                         </step>\r
34                         <step>\r
35                                 <para>Create a staging table.<indexterm><primary>staging table</primary></indexterm>  A staging table will allow you to tweak the data before importing. \r
36                                 Here is an example sql statement:</para>\r
37                                 <indexterm><primary>sql</primary></indexterm> \r
38 <programlisting language="sql">\r
39 CREATE TABLE students (\r
40         student_id int, barcode text, last_name text, first_name text, program_number text, program_name text, email text, address_type text, street1 text, street2 text, city text, province text, \r
41         country text, postal_code text, phone text, profile int, ident_type int, home_ou int, claims_returned_count int DEFAULT 0, usrname text, net_access_level int DEFAULT 2, password text\r
42 ); \r
43 </programlisting>\r
44                                 <para>Note the <varname>DEFAULT</varname> variables. These allow you to set default for your library or to populate required fields if you data allows \r
45                                 <systemitem>NULL</systemitem> values where fields are required in Evergreen.</para>\r
46                         </step>\r
47                         <step>\r
48                                 <para>Formatting of some fields to fit Evergreen filed formatting may be required. Here is an example of sql to adjust phone numbers in the staging \r
49                                 table to fit the evergreen field:</para>\r
50 <programlisting language="sql">\r
51 UPDATE students phone = replace(replace(replace(rpad(substring(phone from 1 for 9), 10, '-') || substring(phone from 10), '(', ''), ')', ''), ' ', '-');\r
52 </programlisting>\r
53                                 <para>Data <quote>massaging</quote> may be required to fit formats used in Evergreen.</para>\r
54                         </step>\r
55                         <step>\r
56                                 <para>Insert records from the staging table into the <link linkend="actor.table.usr">actor.usr</link> Evergreen table:</para>\r
57 <programlisting language="sql">\r
58  INSERT INTO actor.usr (\r
59         profile, usrname, email, passwd, ident_type, ident_value, first_given_name, family_name, day_phone, home_ou, claims_returned_count, net_access_level) SELECT profile, students.usrname, \r
60         email, student_id, ident_type, student_id, first_name, last_name, phone, home_ou, claims_returned_count, net_access_level FROM students;\r
61 </programlisting>                       \r
62                         </step>\r
63                         <step>\r
64                                 <para>insert records into <link linkend="actor.table.card">actor.card</link> from <link linkend="actor.table.usr">actor.usr</link>.</para>\r
65 <programlisting language="sql">\r
66 INSERT INTO actor.card (usr, barcode) \r
67         SELECT, students.barcode \r
68         FROM students \r
69                 INNER JOIN actor.usr \r
70                         ON students.usrname = actor.usr.usrname;\r
71 </programlisting>               \r
72                                 <para>This assumes a one to one card patron relationship. If your patron data import has multiple cards assigned to one patron more complex import scripts may be required                                      which look for inactive or active flags.</para> \r
73                         </step>\r
74                         <step>\r
75                                 <para>Update actor.usr.card field with to associate active card with the user:</para>\r
76 <programlisting language="sql">\r
77 UPDATE actor.usr \r
78         SET card = \r
79         FROM actor.card \r
80         WHERE actor.card.usr =;\r
81 </programlisting>                       \r
82                         </step>\r
83                         <step>\r
84                                 <para>Insert records into <link linkend="actor.table.usr-address">actor.usr_address</link> to add address information for users:</para>\r
85 <programlisting language="sql">\r
86 INSERT INTO actor.usr_address (usr, street1, street2, city, state, country, post_code) \r
87         SELECT, students.street1, students.street2,, students.province,, students.postal_code \r
88         FROM students \r
89         INNER JOIN actor.usr ON students.usrname = actor.usr.usrname;\r
90 </programlisting>                       \r
91                         </step>\r
92                         <step>\r
93                                 <para>update <link linkend="actor.table.usr-address">actor.usr.address</link> with address id from address table.</para>\r
94 <programlisting language="sql">\r
95 UPDATE actor.usr \r
96         SET mailing_address =, billing_address = \r
97         FROM actor.usr_address \r
98         WHERE = actor.usr_address.usr;\r
99 </programlisting>       \r
100                         <para>This assumes 1 address per patron. More complex scenarios may require more sophisticated SQL.</para>              \r
101                         </step>\r
102                 </procedure>\r
103                 <simplesect>\r
104                         <title>Creating an sql Script for Importing Patrons</title>\r
105                         <para>The procedure for importing patron can be automated with the help of an sql script. Follow these steps to create an import script:</para>\r
106                 \r
107                         <procedure>\r
108                                 <step>\r
109                                         <para>Create an new file and name it <filename>import.sql</filename></para>\r
110 \r
111                                 </step>\r
112 \r
113                                 <step>\r
114                                         <para>Edit the file to look similar to this:</para>\r
115 <programlisting>\r
116 BEGIN;\r
117 \r
118 -- Create staging table.\r
119 CREATE TABLE students (\r
120         student_id int, barcode text, last_name text, first_name text, program_number text, program_name text, email text, address_type text, street1 text, street2 text, city text, province text, \r
121         country text, postal_code text, phone text, profile int, ident_type int, home_ou int, claims_returned_count int DEFAULT 0, usrname text, net_access_level int DEFAULT 2, password text\r
122 ); \r
123 \r
124 \r
125 --Insert records from the staging table into the actor.usr table.\r
126 INSERT INTO actor.usr (\r
127         profile, usrname, email, passwd, ident_type, ident_value, first_given_name, family_name, day_phone, home_ou, claims_returned_count, net_access_level) SELECT profile, students.usrname, \r
128         email, student_id, ident_type, student_id, first_name, last_name, phone, home_ou, claims_returned_count, net_access_level FROM students;\r
129 \r
130 --Insert records from the staging table into the actor.usr table.\r
131 INSERT INTO actor.card (usr, barcode) \r
132         SELECT, students.barcode \r
133         FROM students \r
134                 INNER JOIN actor.usr \r
135                         ON students.usrname = actor.usr.usrname;\r
136 \r
137 --Update actor.usr.card field with to associate active card with the user:\r
138 UPDATE actor.usr \r
139         SET card = \r
140         FROM actor.card \r
141         WHERE actor.card.usr =;\r
142 \r
143 --INSERT records INTO actor.usr_address from staging table.\r
144 INSERT INTO actor.usr_address (usr, street1, street2, city, state, country, post_code) \r
145         SELECT, students.street1, students.street2,, students.province,, students.postal_code \r
146         FROM students \r
147         INNER JOIN actor.usr ON students.usrname = actor.usr.usrname;\r
148 \r
149 \r
150 --Update actor.usr mailing address with id from actor.usr_address table.:\r
151 UPDATE actor.usr \r
152         SET mailing_address =, billing_address = \r
153         FROM actor.usr_address \r
154         WHERE = actor.usr_address.usr;\r
155 \r
156 COMMIT;\r
157 </programlisting>\r
158                                         <para>Placing the sql statements between <code>BEGIN;</code> and <code>COMMIT;</code> creates a transaction block so that if any sql statements fail, the \r
159                                         entire process is canceled and the database is rolled back to its original state. Lines beginning with <code>--</code> are comments to let you you what \r
160                                         each sql statement is doing and are not processed.</para> \r
161                                 </step>\r
162                         </procedure>\r
163                 </simplesect>\r
164                 <simplesect>\r
165                         <title>Batch Updating Patron Data</title>\r
166                         <para>For academic libraries, doing batch updates to add new patrons to the Evergreen database is a critical task. The above procedures and \r
167                         import script can be easily adapted to create an update script for importing new patrons from external databases. If the data import file contains only new patrons, then, \r
168                         the above procedures will work well to insert those patrons. However, if the data load contains all patrons, a second staging table and a procedure to remove existing                          patrons from that second staging table may be required before importing the new patrons. Moreover, additional steps to update address information and perhaps delete \r
169                         inactive patrons may also be desired depending on the requirements of the institution.</para>\r
170                         <para>After developing the scripts to import and update patrons have been created, another important task for library staff is to develop an import strategy and schedule \r
171                         which suits the needs of the library. This could be determined by registration dates of your institution in the case of academic libraries. It is important to balance \r
172                         the convenience of patron loads and the cost of processing these loads vs staff adding patrons manually.</para>   \r
173                </simplesect> \r
174         </section>\r
175 </chapter>\r