I walked into the office this morning and got asked a strange question: “Does a database you detach and re-attach have the same database id before and after the detach?”. While it may appear that it does in a simple test, it actually doesn’t – it just takes the next available id. If you detach database id 5 and then re-attach it, it will retake id 5, and this will mostly work – unless other databases have been removed from the server at some point in the past and there are ‘holes’ in the list of available id’s. So…”How do you force a database to have a specific database id?”
First of all, you can get the current database_ID of all your databases by running:
select name, database_id from sys.databases
What you will likely notice is that the numbers go from 1(master) to roughly the number of databases on your instance. SQL Server assigns the next available database id. What that means is that if you have a clean install database id’s 1-4 will be taken by the system databases and the first database id you create will be 5 and the second 6 and so on. The exception is when you delete\detach a database – this creates a hole which is the next assigned number. So if you have created databases with ID’s 5-10 and detach the database with id 7, the next database you attach or create will take database_id 7.
The upshot of all this is that if you ever want to assign a specific database id to a new database you need to do the following:
- If all your database id’s are sequential and the next available number is the id you want – just create the database.
- If all your database_id’s are sequential and the database_id is already assigned, detach the database that is currently using it, create the database you want to take that ID and then re-attach the database you dropped.
- If you want to assign a number that is greater than the currently available database_ids, simply create databases until the next available id is the number you are after, then create the database you want to take that id, then remove all the filler databases you created to get there.
I’m still unsure what the usecase for this is – but now you know how to do it.