views:

61

answers:

4

I'm considering undertaking a project to migrate a very large MS Access application to a new system based on SQL Server. The existing system is essentially an ERP application with a couple of dozen users, all sharing the Access database over the network. The database has around 300 tables and lots of messy VBA code. This system is beginning to break down (actually, it's amazing it has worked as long as it has).

Due to the size and complexity of the Access application, a 'big bang' approach is not really feasible. It seems sensible to rope off chunks of functionality and migrate them piecemeal to the new system. During the migration process, which I expect to take several months, there may be a need for both databases to be in operation and be able to query and modify data in both systems.

I have considered using something like the ADO.NET Entity Framework to implement a data abstraction layer to handle this, but as far as I can tell, the Entity Framework has no Access provider.

Does my approach seem reasonable? What other strategies have people used to accomplish similar goals?

A: 

...thinking out loud... I think this may work.

I appears that the complexity of the application resides in the various VBA modules rather than the database table/schema themselves. A possible migration path could therefore be to first migrate the data storage to SQL server, exactly as-is, as follow:

  • prevent any change to the data for a few hours
  • duplicate all tables to the SQL server; be sure to create the same indexes as well.
  • create linked tables to ODBC Source pointing to the newly created tables on SQL Server
    these tables should have the very same name as the original tables (which therefore may require being renamed, say with a leading underscore, for possible reference).
  • Now, the application can be restarted and should be using the SQL tables rather than the Access tables. All logic should work as previously (right...), possible slowness to be expected, depending on the distance between the two machines.

All the above could be tested in about a day's work or so; the most tedious being the creation of the tables on SQL server (much of that can be automated, I'm sure). The next most tedious task is to assert that the application effectively works as previously, but with its storage on SQL.
EDIT: As suggested by a comment, I should stress that there is a [fair ?] possibility that the application would not readily work so smoothly under SQL server back-end, and could require weeks of hard work in testing and fixing. However, and unless some of these difficulties can be anticipated because of insight into the application not expressed in the question, I propose that attempting the "As-is" migration to SQL Server should be considered; after all, it may just work with minimal effort, and if it doesn't, we'd know this very quickly. This is therefore a hi-return, low risk proposal...

The main advantage sought with this approach is that there will be a single storage during the [as the OP expects] longer period during which the old Access application will co-exist with the new application.

The drawback of this approach, is that, at least at first, the schema of original database is reproduced verbatim, i.e. including some of its known quirks and legacy-herited idiosyncrasies. These schema issues (and the underlying application logic) can be in time corrected, but this is of course less easy than if the new application starts ab initio, with its own, separate, storage, and distinct schema.

After the storage is moved to SQL server, the most used and/or the most independent modules of the Access application can be re-written in the new application, and as significant portions of the original application is ported, effective usage, by select beta testers or by actual users can start to be switched to the new application.

Possibly, some kind of screen-scraping based logic or some other system could be used to produce an hybrid application which would provide the end users with a comprehensive application, which sometimes work from new logic, and sometimes from the original MS-Access program.

mjv
Upsizing to SQL Server is not as simple as you portray it. There can up to five or six weeks of developer time in ensuring the app works with SQL Server before going live.
Tony Toews
@Tony Toews: True, depending on the specifics of the application there could be a be a nightmarish test-and-fix period following the move to SQLServer, and I should stress this in my answer. YET... it is also quite plausible that minimal testing/fixing be required and the MSSQL version be quickly qualified for production. Also, one would know, VERY QUICKLY, which of these possibilities applies. For this reason I persist in my suggestion that, in the context expressed in the question (one where a "big bang" approach is excluded), _attempting_ a move to SQL Server should be considered.
mjv
I have no problem whatsoever in advocating the first step being an upsizing to SQL Server. I'm just stating that the upsizing won't be very easy. It could be easy if the code and such as built with SQL Server in mind. Chances of that are small in this situation. Also there will be a fair amount of tweaking and optimizing for weeks after words. One comment by a user at a client after one particular optimization involving a 900K transaction file. "Wow, it's scary fast now."
Tony Toews
+3  A: 

You may find that the main problem is using the MS Access JET engine as the backend. I'm assuming that you do have an Access FE (frontend) with all objects except tables, and a BE (backend - tables only).

You may find that migrating the data to SQL Server, and linking the Access FE to that, would help alleviate problems immediately.

Then, if you don't want to continue to use MS Access as the FE, you could consider breaking it up into 'modules', and redesign modules one by one using a separate development platform.

maxhugen
+2  A: 

We faced a similar situation a few years ago, but we knew from the beginning that we'll have to swich one day to SQL SERVER, so the whole code was written to work from an Access client to both Access AND SQL server databases.

The idea of having a 'one-step' migration to SQL server is certainly the easier way to manage this on the database side, and there are many tools for that. But, depending on the way your client app talks to the database, your code might then not work properly. If, for example, your code includes a lot of SQL instructions (or generates them on the fly by, for example, adding filters to SELECT instructions), your syntax might not be 'SQL server' compatible: access wildcards, dates, functions, will not work on SQL server.

In addition to this, and as said by @mjv, the other drawback of a one time switch to MS SQL is that you will inheritate many of the problems from the original database: wrong or inapropriate field names, inapropriate primary/foreign key policies, hidden one-to-many relations that you'd like to implement in the new database model, etc.

I'll propose here some principles and rules to implement a 'soft transition' solution, which clearly best fits you. Just to say that it's not going to be easy, but it's definitely very interesting, paticularly when dealing with 300 tables! Lucky you!

I assume here that yo have the ability to update the client code, and you'd prefer to keep at all times the same client interface. It is of course possible to have at transition time two different interfaces, one for each database, but this will be very confusing for the users, and a permanent source of frustration for them.

According to me, the best solution strongly depend on:

  1. The original connection technology, and the way data is managed in your client's code: Access linked tables, ODBC, ADODB, recordset, local tables, forms recordsources, batch updating, etc.
  2. The possibilities to split your tables and your app in 'mostly independant' modules.

And you will not spare the following mandatory activities:

  1. setup up of a transfer procedure from Access database to SQL server. You can use already existing tools (The access upsizing wizard is very poor, so do not hesitate to buy a real one, like SSW or EMS SQL Manager, very powerfull) or build your own one with Visual Basic. If your plan is to make some changes in Data Definition, you'll definitely have to write some code. Keep in mind that you will run this code maaaaaany times, so make sure that it includes all time-saving instructions that will allow you to restart the process from the start as many times as you want. You will have to choose between 2 basic data import strategies when importing data:

     a - DELETE existing record, then INSERT imported record
     b - UPDATE existing record from imported record
    

    If you plan to switch to new Primary\foreign key types, you'll have to keep track of old identifiers in your new database model during the transition period. Do not hesitate to switch to GUID Primary Keys at this stage, especially if the plan is to replicate data on multiple sites one of these days.

    This transfer procedure will be divided in modules corresponding to the 'logical' modules defined previously, and you should be able to run any of these modules independantly (keeping of course in mind that they'll probably have to be implemented in a specific order, where the 'customers' module has to run before the 'invoicing' module).

  2. implement in your client's code the possibility to connect to both original ms-access database and new MS SQL server. Ideally, you should be able to manage from within your code both connections for displaying and validating data.

    This possibility will be implemented by modules, where you will have, for each of them, a 'trial period', ie the possibility to choose at testing time between access connection and sql connection when using the module. Once testing is done and complete, the module can then be run in exclusive SQL server mode.

During the transfer period, that can last a few months, you will have to manage programatically the database constraints that exist between 'SQL server' modules and 'Access' modules. Going back to our customers/invoicing example, the customers module will be first switched to MS SQL. Before the Invoicing module can be switched, you'll have to implement programmatically the one to many relations between Customers and Invoices, where each of the tables will be in a different database. Such a constraint can be implemented on the Invoice form by populating the Customers combobox with the Customers recordset from the SQL server.

My proposal is to build your modules following your database model, allways beginning with the 'one' tables or your 'one-to-many' relations: basic lists like 'Units', 'Currencies', 'Countries', shall be switched first. You'll have a first 'hands on' experience in writting data transfer code, and managing a second connection in your client interface. You'll be then able to 'go up' in your database model, switching the 'products' and 'customers' tables (where units, countries and currencies are foreign keys) to the new server.

Good luck!

Philippe Grondier
Thanks, that's very helpful.
Tim Long
+1  A: 

I would second the suggestion to upsize the back end to SQL Server as step 1.

I would never go to the suggested Step 2, though (i.e., replacing the Access front end with something else). I would instead suggest investing the effort in fixing the flaws of the schema, and adjusting the Access app to work with the new schema.

Obviously, it is never the case that everything just works hunky dory when you upsize -- some things that were previously quite fast will be dogs, and some things that were previously quite slow will be fast. And I've found that it is often the case that the problems are very often not where you anticipate that they will be. You can only figure out what needs to be fixed by testing.

Basically, anything that works poorly gets re-architected, or moved entirely server-side.

Leverage the investment in the existing Access app rather than tossing all that out and starting from scratch. Access is a fine front end for a SQL Server back end as long as you don't assume it's going to work just the same way as it would with a Jet/ACE back end.

David-W-Fenton
No, this access database has got far too big and ugly and it has become a big business risk. There are over 300 tables and 25 different front end applications. The complexities of managing that across different users requires almost full time attention from the DBA. They've pushed access past its elastic limit!
Tim Long