Gestione di un database Microsoft SQL Server
In questo articolo vediamo come si fa il backup ed il restore di un database Microsoft SQL Server.
Nel dettaglio io ho fatto le prove con un database Microsoft SQL Server 2008 (chiamato anche ms sql server 2008). L'articolo si concentra sul ripristino del database.
Il backup avrà step molto simili ma più semplici.
Vedremo anche come eseguire script particolarmente pesanti.
Risponderemo anche alla domanda: coma si fa a contare quante tabella ci sono in un db?
Script per la creazione di un DB
Vediamo uno script per poter creare un DB su SQL SERVER (testato sulla versione 2012):
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 18/12/2017 11:45:57 ******/
CREATE DATABASE [MyDB] ON PRIMARY
( NAME = N'MyDB_DATA', FILENAME = N'C:\MyDB\MyDB_Data.mdf' , SIZE = 2510784KB , MAXSIZE = UNLIMITED, FILEGROWTH = 51200KB ),
FILEGROUP [MyDB_IDX]
( NAME = N'MyDB_IDX', FILENAME = N'C:\MyDB\MyDB_Idx.mdf' , SIZE = 51200KB , MAXSIZE = UNLIMITED, FILEGROWTH = 51200KB ),
FILEGROUP [MyDB_NTXT]
( NAME = N'MyDB_NTXT', FILENAME = N'C:\MyDB\MyDB_Ntxt.mdf' , SIZE = 208896KB , MAXSIZE = UNLIMITED, FILEGROWTH = 51200KB )
LOG ON
( NAME = N'MyDB_LOG', FILENAME = N'C:\MyDB\MyDB_Log.ldf' , SIZE = 1741824KB , MAXSIZE = UNLIMITED, FILEGROWTH = 51200KB )
GO
ALTER DATABASE [MyDB] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'disable'
end
GO
ALTER DATABASE [MyDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [MyDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [MyDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [MyDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [MyDB] SET ARITHABORT OFF
GO
ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [MyDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [MyDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [MyDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [MyDB] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [MyDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [MyDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [MyDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [MyDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [MyDB] SET DISABLE_BROKER
GO
ALTER DATABASE [MyDB] SET AUTO_UPDATE_STATISTICS_ASYNC ON
GO
ALTER DATABASE [MyDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [MyDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [MyDB] SET ALLOW_SNAPSHOT_ISOLATION ON
GO
ALTER DATABASE [MyDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [MyDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [MyDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [MyDB] SET RECOVERY SIMPLE
GO
ALTER DATABASE [MyDB] SET MULTI_USER
GO
ALTER DATABASE [MyDB] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [MyDB] SET DB_CHAINING OFF
GO
ALTER DATABASE [MyDB] SET READ_WRITE
GO
Una volta creato il DB si può anche procedere alsuo restore.
Restore a DB
Il restore di un database è una procedura molto utile sia per rispristinare un database, ad esempio corrotto, ma anche per importare su un altra macchina una copia di un database.
Questo articolo si concentra su quest'ultima procedura.
Per prima cosa occorre avere il database sul server. Anche se vuoto e senza tabella.
Ovviamente, occorre avere il backup del database principale.
A questo punto si deve fare click destro sul nome del database e scegliere la voce Tasks e poi la voce Restore ed infine la voce database.
Si apre a questo punto una finestra. Sulla destra scegliete la voce General e poi sulla sinistra la voce From Device.
Noi vogliamo fare la import del database utilizzando un file presente su file system.
Scegliendo la voce From Device si aprirà una finestra di dialogo che vi permetterà di aggiungere un nuovo file.
Voi dovete aggiungere il file contenente la copia di backup dell'altro database.
Fatto questo cliccate su OK.
Vi comparrirà una lista con l'elenco dei database che è possibile ripristinare in base al file indicato.
Cliccate quindi sul checkbox restore del database che vi interessa.
Sulla sinistra ora scegliete il tab options.
Sulla sinistra selezionate l'opzione Overwrite the existing database.
Sotto troverete una griglia con indicato il file del database che state importando e sovrascrivendo ed il suo file di log. Questi due nomi e questi due path vengono letti dal file che avete indicato. Dovete quindi controllare il match con i vostri da sovrascrivere.
Fatto questo non vi rimane che selezionare OK ed il gioco è fatto.
Le prove da me fatte sono state condotte su database Microsoft SQL Server 2008, ma sul database SQL Server 2005 funzionano lo stesso. Sulle precedenti versioni il meccanismo dovrebbe essere molto simile.
Eseguire script pesanti
Qui il termine pesante sta ad indicare il peso in MB (MegaBytes) dello script. A volte, per effettuare un restore di un database, o per importare su un secondo database l'export di un database fatto altrove, è necessario eseguire script pesanti. L'unico modo per eseguirli è a riga di comando nel seguente modo:
sqlcmd -S <host> -U <user name> -P <password> -i <path to file>\mySqlScript.sql
Modalità Restricted User
Quando si eseguono determinate attività, come quella di restore, è molto conveniente mettere il DB in madalità "Singolo Utente".
In questa maniera siamo sicuri che non ci siano "troppi" utenti collegati che possano creare problemi nella fase di ripristino.
Si può quindi impostare il database così:
ALTER DATABASE database-name SET RESTRICTED_USER;
E alla fine ripristinare il tutto con
ALTER DATABASE database-name SET MULTI_USER;
Una guida più dettagliata la trovate qui.
Assign a login to a user created without login
Gli utenti di un database possono o no avere la possibilità di loggarsi direttamente al loro database.
Ma come si fa a cambiare tale caratterestica? Ovvero, se noi abbiamo un utente "sql user without login" ma vogliamo dargli la possibilità di loggarsi che query dobbiamo usare?
use [MyDB];
alter user myUser with login = myUser;
Queste sono le istruzioni da eseguire!
Contare le tabelle presenti nel DataBase
A volte è un numero che ci può servire e se non vogliamo andare a contare manualmente le tabelle ecco la query che fa al caso nostro:
USE <MyDatabase>
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'