SQL - SQL SERVER Databases and Database Files


-- You can do this by using Object Explorer in Management Studio or by using the 
-- CREATE DATABASE FOR ATTACH syntax to create a clone database, as shown here:



CREATE DATABASE resource_COPY  ON (NAME = data, FILENAME =     
    'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\binn\mssqlsystemresource_COPY.mdf'), 
   (NAME = log, FILENAME = 
    'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\binn\mssqlsystemresource_COPY.ldf') 
    FOR ATTACH;




-- A CREATE DATABASE Example


CREATE DATABASE Archive 
ON 
PRIMARY  
( NAME = Arch1, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\archdat1.mdf', 
SIZE = 100MB, 
MAXSIZE = 200MB, 
FILEGROWTH = 20MB), 
( NAME = Arch2, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\archdat2.ndf', 
SIZE = 10GB, 
MAXSIZE = 50GB, 
FILEGROWTH = 250MB) 
LOG ON  
( NAME = Archlog1, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\archlog1.ldf', 
SIZE = 2GB, 
MAXSIZE = 10GB, 
FILEGROWTH = 100MB);




-- A FILEGROUP CREATION Example


CREATE DATABASE Sales 
ON PRIMARY 
( NAME = salesPrimary1, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\salesPrimary1.mdf', 
SIZE = 100, 
MAXSIZE = 500, 
FILEGROWTH = 100 ), 
( NAME = salesPrimary2, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\salesPrimary2.ndf', 
SIZE = 100, 
MAXSIZE = 500, 
FILEGROWTH = 100 ), 
FILEGROUP SalesGroup1 
( NAME = salesGrp1Fi1e1, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp1Fi1e1.ndf', 
SIZE = 500, 
MAXSIZE = 3000, 
FILEGROWTH = 500 ), 
( NAME = salesGrp1Fi1e2, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp1Fi1e2.ndf', 
SIZE = 500, 
MAXSIZE = 3000, 
FILEGROWTH = 500 ), 
FILEGROUP SalesGroup2 
( NAME = salesGrp2Fi1e1, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp2Fi1e1.ndf', 
SIZE = 100, 
MAXSIZE = 5000, 
FILEGROWTH = 500 ), 
( NAME = salesGrp2Fi1e2, 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp2Fi1e2.ndf', 
SIZE = 100, 
MAXSIZE = 5000, 
FILEGROWTH = 500 ) 
LOG ON 
( NAME = 'Sales_log', 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\saleslog.ldf', 
SIZE = 5MB, 
MAXSIZE = 25MB, 
FILEGROWTH = 5MB );




-- The file and filegroup will grow as data is added to tables that have been created with 
-- filestream columns:


CREATE DATABASE MyMovieReviews 
ON
PRIMARY 
  ( NAME = Reviews_data,
    FILENAME = 'c:\data\Reviews_data.mdf'),
FILEGROUP MovieReviewsFSGroup1 CONTAINS FILESTREAM
  ( NAME = Reviews_FS,
    FILENAME = 'c:\data\Reviews_FS')
LOG ON  ( NAME = Reviews_log,
    FILENAME = 'c:\data\Reviews_log.ldf');
GO




-- ALTER DATABASE Examples
-- This example increases the size of a database file:


USE master 
GO 
ALTER DATABASE Test1  
MODIFY FILE 
( NAME = 'test1dat3', 
SIZE = 2000MB);


-- You need three ALTER DATABASE statements:


ALTER DATABASE Test1  
ADD FILEGROUP Test1FG1; 
GO 
ALTER DATABASE Test1  
ADD FILE  
( NAME = 'test1dat4', 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\t1dat4.ndf', 
SIZE = 500MB, 
MAXSIZE = 1000MB, 
FILEGROWTH = 50MB), 
( NAME = 'test1dat5', 
FILENAME =  
    'c:\program files\microsoft sql server\mssql.1\mssql\data\t1dat5.ndf', 
SIZE = 500MB, 
MAXSIZE = 1000MB, 
FILEGROWTH = 50MB) 
TO FILEGROUP Test1FG1; 
GO 
ALTER DATABASE Test1 
MODIFY FILEGROUP Test1FG1 DEFAULT; 
GO




-- The following query retrieves some of the most important columns from sys.databases for 
-- the four databases that exist on a new default installation of SQL Server:


SELECT name, database_id, suser_sname(owner_sid) as owner,
     create_date, user_access_desc, state_desc
FROM sys.databases
WHERE database_id <= 4;




-- For example, to set the AdventureWorks database to single-user mode, use the following code:


ALTER DATABASE AdventureWorks SET SINGLE_USER;




-- To determine which user access value is set for a database, you can examine the 
-- sys.databases catalog view, as shown here:


SELECT USER_ACCESS_DESC FROM sys.databases
WHERE name = '<name of database>';




-- The following code examples show how to set a database’s status value to OFFLINE and 
-- how to determine the status of a database:


ALTER DATABASE AdventureWorks SET OFFLINE;
SELECT state_desc from sys.databases 
WHERE name = 'AdventureWorks';




-- The following code shows how to set a database’s updatability value to READ_ONLY and 
-- how to determine the updatability of a database:


ALTER DATABASE AdventureWorks SET READ_ONLY; 
SELECT name, is_read_only FROM sys.databases
WHERE name = 'AdventureWorks';




-- The following command changes the user access option of the AdventureWorks database to SINGLE_USER 
-- and generates an error if any other connections to the AdventureWorks database exist:


ALTER DATABASE AdventureWorks SET SINGLE_USER WITH NO_WAIT; 




-- Here is the syntax to create a snapshot of the AdventureWorks database, putting the snapshot files 
-- in the SQL Server 2008 default data directory:


CREATE DATABASE AdventureWorks_snapshot ON  
( NAME = N'AdventureWorks_Data',  
  FILENAME =  
 N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AW_data_snapshot.mdf')  
AS SNAPSHOT OF AdventureWorks;




-- You do this by using the RESTORE command:


RESTORE DATABASE AdventureWorks   
FROM DATABASE_SNAPSHOT = 'AdventureWorks_snapshot';




-- The following query shows the mapping of users in the AdventureWorks database to login names, 
-- and it also shows the default schema (which I will discuss shortly) for each database user:


SELECT s.name as [Login Name], d.name as [User Name],  
     default_schema_name as [Default Schema] 
   FROM sys.server_principals s  
      JOIN sys.database_principals d 
   ON d.sid = s.sid;




-- The statement GRANT CREATE TABLE TO sue refers to the user sue. Let’s say sue then creates a table, 
-- as follows:


CREATE TABLE mytable (col1 varchar(20));




-- If another user wants to retrieve data from this table, he can issue this statement:


SELECT col1 FROM sue.mytable;




-- Here is the command to detach a database:


EXEC sp_detach_db <name of database>;




-- Verify the change by running the following query:


SELECT name, physical_name AS CurrentLocation, state_desc 
FROM sys.master_files 
WHERE database_id = DB_ID(N'<database_name>');




-- Start the instance of SQL Server in master-only recovery mode (by specifying traceflag 3608) 
-- by entering one of the following commands at the command prompt.


-- If the instance is the default instance: 
NET START MSSQLSERVER /f /T3608 
  
-- For a named instance: 
NET START MSSQL$instancename /f /T3608




-- Verify the change by running the following query:


SELECT name, physical_name AS CurrentLocation, state_desc 
FROM sys.master_files 
WHERE database_id = DB_ID(N'<database_name>');




-- Verify the file change for the master database by running the following query. 


SELECT name, physical_name AS CurrentLocation, state_desc 
FROM sys.master_files 
WHERE database_id = DB_ID('master');




--you should first verify that your database is in 100 compatibility mode by executing this command:


SELECT compatibility_level FROM sys.databases
WHERE name =  '<database name>';




-- To change to a different compatibility level, use the ALTER DATABASE command:


ALTER DATABASE <database name>
SET COMPATIBILITY_LEVEL =  <compatibility-level>;