File Group
File Group
File Group
En SQL Server hay que distinguir entre Logins y Users. Los Logins se crean a
nivel de servidor de base de datos. Pueden crearse como Logins de SQL Server,
o pueden crearse a partir de una cuenta Windows, lo que en general es ms seguro
por utilizarse la autenticacin integrada. En mi caso era precisamente eso lo que
pretenda hacer, crearlos a partir de una determinada cuenta Windows. Esto es
muy sencillo de hacer, basta un comando como el que se puede ver a continuacin:
Bien, con esto ya tendramos nuestro usuario concreto de la base de datos creado,
asociado a un Login a nivel del servidor.
Roles y permisos
El siguiente paso es crear el rol al que vamos a asociar el usuario que recin hemos creado.
Este rol va a pertenecerle a dbo. No podemos darle sus permisos directamente en el script
que se crea en la carpeta Database Roles de Security, esa parte tendremos que aadirla en
un script de Post-deployment. As que en el script de creacin del rol simplemente
tendramos la siguiente sentencia TSQL:
CREATE ROLE [YourNewRole] AUTHORIZATION [dbo]
GO
Quedaran dos pasos por ejecutar: darle los permisos al rol que necesite y asociarle el
usuario que creamos al principio.
La primera parte se completa con una sentencia parecida a sta. Sera necesario indicar
qu esquema de los existentes en la base de datos, va a poder el rol ejecutar sus SPs.
GRANT EXECUTE ON SCHEMA ::[YourSchema] TO [YourNewRole]
GO
En cuanto a la segunda, bastara algo como lo que sigue, apoyndonos en uno de los
procedimientos almacenados del sistema:
EXEC sp_addrolemember N'YourNewRole', N'YourDomainYourUser'
GO
Archivos y Configuraciones
Data Files: datos de la base de datos, est constituido por:
Secundary (.ndf)
Filegroups
Los filegroups (o grupos de archivos) son tiles para distribuir tablas con
alto volumen de informacin en diferentes discos para separar los ndices de los datos.
Definen
conjuntos
de
archivos
para
obtener
paralelismo
en
distintas
FileGroup es un concepto muy importante sobre todo cuando vamos a crear una base de
datos ya que nos va ayudar mejorar el rendimiento de las consultas y la administracion de
la data en una BD.
Como concepto FileGroup es una unidad logica que almacena archivos fisicos que pueden
estar en distintas unidades de disco o en distintos discos fisicos, la idea del Filegroup es
la de aprovechar el procesamiento paralelo cuando el motor de BD requiere realizar
operaciones de I/O al disco duro.
Tener en cuenta que cuando creamos una BD el SQL crea un FileGroup por defecto ON
PRIMARY, en este FileGroup se almacenan todas las tablas del sistema(si es que no
sabias te lo cuento, cada vez que creamos una nueva Base de datos se hace ua copia de
todas las tablas de la BD Model) y todos los objetos que vayamos creando
La recomendacin general es dejar a las tablas del sistema en el FileGroup por Defecto
(el que crea SQL) y crear un Filegroup para los objetos de usuario (las tablas, SP,
Trigger,etc creado por nosotros), adicionalmente tambin podras crear un Filegroup para
almacenar data histrica que sabemos que no cambia en el tiempo.
Por ultimo tener el cuenta que el archivo de transacciones no se asocia a ningn FileGroup
(Toda BD consta de un archivo mdf, opcionalmente archivos ndf y uno o mas archivos
ldf).
Este query asume que UD esta familiarizado con los conceptos de archivos mdf,ndf y ldf.
La idea es crear una BD LLamada Asistencia2 (preste atencion a los FileGroup creados
y las unidades de disco donde se guardan)
Despus de esta brevsima introduccin, donde est la diferencia entre un ndice clustered
y uno non-clustered? En la leaf level (la ultima pagina) del ndice. En un ndice nonclustered, la clave por la que buscamos tiene un puntero a la pgina de datos donde se
encuentra el registro. Mientras que en ndice clustered, la leaf level es la pagina de datos!.
Con lo cual, el SQL Server, se ahorra hacer un salto para leer los datos del registro
(Bookmark lookup). La diferencia es importante, ya que el uso de este tipo de ndices al
evitar tener que hacer lecturas adicionales para traer el registro, son ms performantes.
Bsqueda por clustered index:
Pues solo puede haber 1 solo ndice clustered por tabla. La razn es muy sencilla y lgica:
Los registros de la tabla fsicamente son las paginas leaf-level del ndice clustered. Los
datos de la tabla esta ordenados segn el ndice. Y obviamente una tabla no puede
simultneamente estar fsicamente ordenada de 2 maneras diferentes.
Por lo tanto, en tablas grandes y muy consultadas, tenemos que ser cuidadosos y analizar
a que campos vamos a seleccionar para ser llaves del ndice clustered. Tenemos 1 solo
ndice de este tipo por tabla, no hay que desperdiciarlo!
Este ltimo punto es importante para saber en qu situaciones y para que campos se debe
utilizar un clustered index o un non-clustered.
Campos
autoincrementales
(Identitys,
newsequentialid,
etc),
deben
convenientemente ser del tipo clustered index. La razn es reducir el page split
(fragmentacin) de la tabla.
4.
Usar Transact-SQL
Para crear un ndice clster
1. En el Explorador de objetos, conctese a una instancia del Motor de base de
datos.
2. En la barra Estndar, haga clic en Nueva consulta.
3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic
en Ejecutar.
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Table_1
(
id_profesor numeric(18, 0) NOT NULL,
nombre_profesor nchar(10) NOT NULL,
materia_profesor nchar(10) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT
PK_Table_1 PRIMARY KEY NONCLUSTERED
(
id_profesor
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX IX_Table_1 ON dbo.Table_1
(
id_profesor
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON Secundary
GO
ALTER TABLE dbo.Table_1 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Mecanismos de Migracin
BACKUP Y RESTORE
BACKUP DATABASE [master] TO DISK = N'C:\Program Files\Microsoft SQL
Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\master.bak' WITH NOFORMAT, NOINIT, NAME =
N'master-Completa Base de datos Copia de seguridad', SKIP, NOREWIND, NOUNLOAD,
STATS = 10
GO
USE [master]
RESTORE DATABASE [master] FROM DISK = N'C:\Program Files\Microsoft SQL
Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\master.bak'
WITH FILE = 2, NOUNLOAD, STATS = 5
GO
10
11
12
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
ALTER DATABASE
GO
USE [NOTAS]
GO
GLOBAL
DISABLE_BROKER
MULTI_USER
AGREGANDO USUARIO
/****** Object: User [jenni]
Script Date: 30/10/2014 11:25:09 ******/
CREATE USER [jenni] FOR LOGIN [jenni] WITH DEFAULT_SCHEMA=[dbo]
GO
ALTER ROLE [db_accessadmin] ADD MEMBER [jenni]
GO
ALTER ROLE [db_securityadmin] ADD MEMBER [jenni]
13
GO
/****** Object: Table [dbo].[anual]
Script Date: 30/10/2014 11:25:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[anual](
[id_notas] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[id_estudiante] [nchar](11) NOT NULL,
[materia] [nvarchar](50) NOT NULL,
[ao] [nvarchar](50) NOT NULL,
[condicion] [nvarchar](50) NULL,
[1 parcial] [numeric](18, 0) NOT NULL,
[2 parcial] [numeric](18, 0) NOT NULL,
[3 parcial] [numeric](18, 0) NOT NULL,
[total] [numeric](18, 0) NOT NULL,
[recuperacion] [nchar](10) NULL,
[promedio] [numeric](18, 0) NOT NULL,
CONSTRAINT [PK_anual] PRIMARY KEY CLUSTERED
(
[id_notas] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[semestre]
Script Date: 30/10/2014 11:25:09
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[semestre](
[id_notas] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[id_estudiante] [nchar](11) NOT NULL,
[materia] [nchar](10) NOT NULL,
[nivel] [nchar](10) NOT NULL,
[1 parcial] [numeric](18, 0) NOT NULL,
[2 parcial] [numeric](18, 0) NOT NULL,
[recuperacion] [numeric](18, 0) NULL,
[total] [numeric](18, 0) NOT NULL,
[promedio] [numeric](18, 0) NOT NULL,
CONSTRAINT [PK_semestre] PRIMARY KEY CLUSTERED
(
[id_notas] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object: Index [NonClusteredIndex-20141030-105300]
Script Date:
30/10/2014 11:25:09 ******/
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20141030-105300] ON [dbo].[anual]
(
[materia] ASC,
[ao] ASC,
[condicion] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
14
GO
SET ANSI_PADDING ON
GO
/****** Object: Index [NonClusteredIndex-20141030-104505]
Script Date:
30/10/2014 11:25:09 ******/
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20141030-104505] ON [dbo].[semestre]
(
[materia] ASC,
[nivel] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
USE [master]
GO
ALTER DATABASE [NOTAS] SET READ_WRITE
GO
15
GO
Procedimientos almacenados
Un procedimiento almacenado (stored procedure en ingls) es un programa (o
procedimiento) almacenado fsicamente en una base de datos. Su implementacin vara
de un gestor de bases de datos a otro. La ventaja de un procedimiento almacenado es que
al ser ejecutado, en respuesta a una peticin de usuario, es ejecutado directamente en el
motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal,
posee acceso directo a los datos que necesita manipular y slo necesita enviar sus
resultados de regreso al usuario, deshacindose de la sobrecarga resultante de comunicar
grandes cantidades de datos salientes y entrantes.
Usos tpicos para procedimientos almacenados incluyen la validacin de datos siendo
integrados a la estructura de base de datos (los procedimientos almacenados utilizados
para este propsito a menudo son llamados disparadores; triggers en ingls), o encapsular
un proceso grande y complejo. El ltimo ejemplo generalmente ejecutar ms rpido
como un procedimiento almacenado que de haber sido implementado como, por ejemplo,
un programa corriendo en el sistema cliente y comunicndose con la base de datos
mediante el envo de consultas SQL y recibiendo sus resultados.
Los procedimientos pueden ser ventajosos: Cuando una base de datos es manipulada
desde muchos programas externos. Al incluir la lgica de la aplicacin en la base de datos
utilizando procedimientos almacenados, la necesidad de embeber la misma lgica en
todos los programas que acceden a los datos es reducida. Esto puede simplificar la
creacin y, particularmente, el mantenimiento de los programas involucrados.
Para crear un procedimiento en el Explorador de objetos
1. En el Explorador de objetos, conctese a una instancia de Motor de base de datos
y expndala.
2. Expanda Bases de datos, la base de datos AdventureWorks2012 y, por
ltimo, Programacin.
3. Haga clic con el botn secundario en Procedimientos almacenados y, a
continuacin, haga clic en Nuevo procedimiento almacenado.
16
17
Para ejecutar el procedimiento, copie y pegue el ejemplo siguiente en una nueva ventana
de consulta y haga clic en Ejecutar. Observe que se muestran diferentes mtodos para
especificar los valores de parmetro.
18
19
Calcular Total Egresos (Ventas) Periodo comprendido desde Diciembre 2013 a Abril
2014
20
21
22
23
Calcular Total Egresos (Ventas) Periodo comprendido desde Diciembre 2013 a Abril
2014
24
25
26
Tablas temporales
En el mundo de las bases de datos es muy comn la utilizacin de tablas temporales. A
pesar de que todo el mundo sabe que este tipo de estructuras ralentizan el funcionamiento
de nuestras consultas, los programadores no pueden evitar recurrir a ellas porque muchas
veces facilitan la resolucin de problemas. Almacenar datos para usarlos posteriormente,
guardar resultados parciales, analizar grandes cantidades de filas. Hay muchos casos en
los que podemos necesitar estas tablas temporales, Pero hay que utilizarlas
correctamente.
Estas tablas son creadas en la base de datos tempdb, en la carpeta llamada Temporary Tables:
27
Cabe aclarar que si cerramos la conexin actual, esta tabla se eliminar. Por ello, este tipo
de tablas temporales es conocida como Tablas Temporales Locales.
CREATE TABLE ##nombreTabla
?
Al igual que las Tablas Temporales Locales, las Tablas Temporales Globales son creadas en la base de
datos tempdb, en la carpeta Temporary Tables.
Este tipo de tablas temporales se eliminan cuando todas las conexiones ligadas a ella se desconectan.
CTE ( Common Table Expressions )
A diferencia de las anteriores, este tipo de tabla temporal solo puede ser utilizado durante la ejecucin del
bloque de cdigo y solo en una ocasin despus de haber declarado el CTE.
?
USE AdventureWorks2012
3
4
AS
(
SELECT ProductDescriptionID, Description FROM Production.ProductDescription
5
6
7
)
SELECT * FROM nombreCTE;
28
O tambin de la siguiente forma, solo que as nos tendremos que adaptar a los nombres de columna que
nuestro query arroje:
?
USE AdventureWorks2012
;WITH nombreCTE
3
4
AS
(
SELECT ProductDescriptionID, Description FROM Production.ProductDescription
5
6
7
)
SELECT * FROM nombreCTE;
29
USE AdventureWorks2012
;WITH nombreCTE
3
4
AS
(
SELECT ProductDescriptionID, Description FROM Production.ProductDescription
5
6
)
, nombreCTE2
AS
(
select * from HumanResources.Department
9
10
11
30
12
VARIABLES TIPO TABLA
Desde hace algunas versiones de SQL SERVER, se agreg la variable tipo TABLA, al
igual que los CTE, solo estn vigente durante la ejecucin del bloque de cdigo.
?
2
3
4
5
6
En resumen, existen tablas temporales locales y globales que pueden ser creadas a partir
de CREATE TABLE #nombreTabla y CREATE TABLE ##nombreTabla y pueden ser
eliminadas con DROP TABLE y solo estn vigentes durante la conexin o conexiones
que fueron abiertas.
31
Cursores
Los cursores son una herramienta de SQL que nos permite recorrer el resultado de una
consulta SQL y realizar operaciones en cada paso de sta. Es as como nos ayuda a realizar
operaciones que de otro modo seran ms complejas o irrealizables. A continuacin
coloco el cdigo de un cursor muy simple para el Analizador de Consultas de SQl Server.
Rollback
En tecnologas de base de datos, un rollback es una operacin que devuelve a la base de
datos a algn estado previo. Los Rollbacks son importantes para la integridad de la base
de datos, a causa de que significan que la base de datos puede ser restaurada a una copia
limpia incluso despus de que se han realizado operaciones errneas. Son cruciales para
la recuperacin de crashes de un servidor de base de datos; realizando rollback(devuelto)
cualquier transaccin que estuviera activa en el tiempo del crash, la base de datos es
restaurada a un estado consistente.
32
En SQL, ROLLBACK es un comando que causa que todos los cambios de datos desde la
ltima sentencia BEGIN WORK, o START TRANSACTION sean descartados por el
sistema de gestin de base de datos relacional (RDBMS), para que el estado de los datos
sea "rolled back"(devuelto) a la forma en que estaba antes de que aquellos cambios
tuvieran lugar.
Una sentencia ROLLBACK tambin publicar cualquier savepoint existente que pudiera
estar en uso.
En muchos dialectos de SQL, ROLLBACKs son especficos de la conexin. Esto
significa que si se hicieron dos conexiones a la misma base de datos, un ROLLBACK
hecho sobre una conexin no afectar a cualesquiera otras conexiones. Esto es vital para
el buen funcionamiento de la Concurrencia.
La funcionalidad de rollback est normalmente implementada con un Log de
transacciones, pero puede tambin estar implementada mediante control de concurrencia
multiversin.
Cuando se ejecuta un ROLLBACK de la unidad de trabajo se liberan todos los bloqueos
mantenidos. Se cierran todos los cursores abiertos. Se liberan todos los localizadores de
LOB.
La ejecucin de la sentencia ROLLBACK no afecta a las sentencias SET que cambian
los valores del registro especial ni a la sentencia RELEASE.
Si el programa finaliza de forma anmala, la unidad de trabajo se retrotrae implcitamente.
El almacenamiento en antememoria de sentencias se ve afectado por la operacin de
retrotraccin.
El efecto que una sentencia ROLLBACK TO SAVEPOINT tiene sobre los cursores
depende de las sentencias contenidas en el punto de salvaguarda.
Si el punto de salvaguarda contiene un DDL del cual depende un cursor, el cursor se
marca como no vlido. Los intentos para utilizar ese cursor dan lugar a un error
(SQLSTATE 57007).
En otro caso:
33
34
35