Last week, I re-learnt something which, according to me, is a little counter-intuitive. I was studying read-only databases out of academic interest and noticed something interesting:
When a database is marked as Read-only, the underlying file/file-groups are not marked Read-only.
Here’s a simple test wherein we:
- Create a test database with multiple file-groups (the test works equally well with a single file-group)
- Set the database to READ_ONLY
- Check the file-group properties
USE master;
GO
--Create the test database
CREATE DATABASE ReadOnlyDB
ON
PRIMARY (Name=ReadOnlyDB_Primary,
FileName='C:DatabasesSQL2012ReadOnlyDB_Primary.mdf'
),
FILEGROUP SecondaryFG
(Name=ReadOnlyDB_Secondary,
FileName='C:DatabasesSQL2012ReadOnlyDB_Secondary.ndf'
)
LOG ON (Name=ReadOnlyDB_Log,
FileName='C:DatabasesSQL2012ReadOnlyDB_Log.ldf'
);
GO
USE master;
GO
--Set the database to READ_ONLY
ALTER DATABASE ReadOnlyDB SET READ_ONLY;
GO
USE ReadOnlyDB;
GO
--Check the File & File-group properties
SELECT sfg.is_read_only,sfg.*
FROM sys.filegroups AS sfg;
GO
SELECT sdf.is_read_only,sdf.*
FROM sys.database_files AS sdf;
GO
As can be seen from the output, none of the file-groups were marked as read-only even though the database is read-only. To confirm that the database is indeed read-only, let us attempt to create a table on the database.
USE ReadOnlyDB;
GO
CREATE TABLE TestTbl (Id INT IDENTITY(1,1),
Name VARCHAR(50)
)
ON SecondaryFG;
GO
Msg 3906, Level 16, State 1, Line 1
Failed to update database “ReadOnlyDB” because the database is read-only.
A possible explanation
The fact that the file-groups are not marked read-only even though the database is read-only is counter-intuitive.
The only possible explanation that I have is that primary file-groups cannot be marked read-only which is why SQL Server does not automatically attempt to mark the file-groups and log files as read-only.
Further Reading
- SQL Server Myth: Log files are removed when a database is made READ_ONLY [Link]
Until we meet next time,


Pingback: #0370 – SQL Server – Myths – CREATE DATABASE FOR ATTACH_REBUILD_LOG will not work for read-only databases | SQLTwins by Nakul Vachhrajani