Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p><a href="https://stackoverflow.com/questions/393381/recommendations-on-using-sql-server-guid-from-ms-access#393447">Chris</a> is right when saying that (1) you do not need GUIDS for merge replication and (2) there is only one GUID type, but you have to know that:</p> <ol> <li>GUIDS can be generated following different rules. You can check this <a href="http://vadivel.blogspot.com/2007/09/newid-vs-newsequentialid.html" rel="nofollow noreferrer">here</a></li> <li>When setting a replication, SQL will systematically add a GUID (generated as a newsequentialid) to each table if it does not already exist, and will call it <code>rowguid</code>. Of course, if you already have such a GUID/newSequentialId in each table, SQL will make use of it. BUt I do not advise you to 'mix' replication GUIDs with PK GUIDs: you could declare all your primary keys of the GUID type as 'newSequentialIds', but (a) you would then loose the possibility to generate GUID values on the client's side - see infra - and (b) your PKs will then be 'predictable', and this idea makes me feel uncomfortable...</li> <li>keeping autoincrement integers and managing their range through replication means a lot of overhead (you have to allocate ranges for each table/each publication) and a potential source of conflicts when replicating from different sources.</li> <li>Moreover, some SQL bugs like <a href="http://support.microsoft.com/?scid=kb%3Ben-us%3B943281&amp;x=16&amp;y=11" rel="nofollow noreferrer">this one</a>, which is specific to range allocation, are still not properly solved: applying cumulative pack 5 did not solve our problem and we had to find another way to restart our replication processes.</li> <li>Anyway, I am deeply convinced that switching from integers to GUIDs as primary keys is mandatory. There are many reasons for that, and one of them is linked to these range management as a potential source for headacke and overnight troubleshouting sessions. </li> </ol> <p>Concerning the change from integers to GUIDS, I advise you to write a step-by-step module that will:</p> <ul> <li>Backup up all existing tables before modifying them</li> <li>Add a GUID field to each table</li> <li>Add corresponding FK fields where requested</li> <li>Update FK fields through views built with the existing relations (built on integer fields)</li> <li>Break relations</li> <li>Change PKs from integer fields to GUID fields</li> <li>Recreate relations</li> </ul> <p>Take your time to write this code. You will use it many times before having it properly working. You should make profit of the DAO object, tabledefs, indexes, and so on. Keep in mind that you <strong>must allways be able</strong> to go back to the starting point, so don't forget the initial backup process.</p> <p>What about manipulating GUIDs from VBA? There are a few things to know about that:</p> <ul> <li>GUIDs are of the Variant type</li> <li>It is possible and easy to generate your GUID as primary key on the client's side of the app, as I proposed it once <a href="https://stackoverflow.com/questions/345865/getting-primary-key-after-an-insert-in-aspnet-visual-basic#346420">here</a>. </li> <li>When you try to get a GUID value from a control in a form (usually as the linked field in a combobox), you'll get '?????'but no value. You have to refer to the field value in the recordset to get the correct data. You can open such a form in your app, go to the 'immediate' window, and try this:</li> </ul> <hr> <pre><code>? myForm.myControl ????? ? myForm.recordset.fields("myFieldName") {000581EB-9CBF-418C-A2D9-5A7141A686CC} </code></pre> <ul> <li>You might have to convert your guids to strings when navigating through recordsets with expressions such as recordset.findfirst:</li> </ul> <hr> <pre><code>myFirstRecordset.FindFirst "stringFromGUID(myGuidId) = " &amp; StringFromGUID(mySecondRecordset.Fields("myGuidId").Value) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload