Sunteți pe pagina 1din 116

Lenguaje SQL SQL Server 2005

Marta E. Zorrilla
Dpto. de Matemticas, Estadstica y Computacin

Universidad de Cantabria

Marta Zorrilla

2009-2010

Introduccin Introduccin

SQL (Structured Query Language). SQL (Structured Query Language).


Lenguaje declarativo de acceso a los datos. Estndar para las bases de datos relacionales. Incluye la capacidad de manipular tanto la estructura de la base de datos como sus datos. Aspectos de seguridad. Desarrollado en el Laboratorio de investigacin de San Jos de IBM. Fue utilizado por primera vez en 1970. En 1986: ANSI (American National Standards Institute) e ISO (International Standards Organization) publicaron una norma, denominada SQL-86. sta ha tenido dos actualizaciones: SQL-89 y SQL-92. En la actualidad, se trabaja con el SQL:1999 y SQL:2003

Marta Zorrilla

2009-2010

Lenguaje de definicin de Lenguaje de definicin de datos datos SQL Server 2005 SQL Server 2005 (Parte 1) (Parte 1)

Instrucciones de Definicin de Datos (IDD) Instrucciones de Definicin de Datos (IDD) Las IDD comprenden todas las operaciones necesarias para implantar y mantener un esquema relacional. Con ellas, se describen los datos y su agrupamiento formando tablas, as como las restricciones que deben cumplir. Las IDD permiten crear, modificar y eliminar tablas, as como todos los componentes que las definen: campos, ndices, claves, etc. y las restricciones que sean precisas. Principales instrucciones:
CREATE DATABASE CREATE TABLE ALTER TABLE CREATE INDEX CREATE VIEW CREATE TRIGGER CREATE PROCEDURE / FUNCTION CREATE RULE DROP objeto
Marta Zorrilla 2009-2010 7

Clusula CONSTRAINT

IDD: CREATE DATABASE IDD: CREATE DATABASE Para crear una base de datos. Su sintaxis es: CREATE DATABASE nombreBD CREATE DATABASE nombreBD [ [ON ON [ [< fichero > [ [,...n ] ]] ] < fichero > ,...n [ [, ,< grupo_fichero > [ [,...n ] ]] ] < grupo_fichero > ,...n ]] [ [LOG ON {{< fichero > [ [,...n ] ]}}] ] LOG ON < fichero > ,...n [ [COLLATE collation_name ] ] COLLATE collation_name [ [FOR LOAD | |FOR ATTACH ] ] FOR LOAD FOR ATTACH

nombreBD: es el nombre de la BD que se va aacrear. nombreBD: es el nombre de la BD que se va crear. collation_name: mapa de caracteres collation_name: mapa de caracteres logical_file_name : :nombre lgico del fichero. logical_file_name nombre lgico del fichero. os_file_name : :nombre fsico del fichero. os_file_name nombre fsico del fichero. size: es el tamao del fichero. size: es el tamao del fichero. max_size: es el tamao mximo del fichero. max_size: es el tamao mximo del fichero.

< fichero > ::= < fichero > ::= [ [PRIMARY ] ] PRIMARY growth_increment : :incremento del fichero. (([ [NAME = logical_file_name , ,] ] growth_increment incremento del fichero. NAME = logical_file_name FILENAME = 'os_file_name' filegroup_name: nombre grupo de archivos FILENAME = 'os_file_name' filegroup_name: nombre grupo de archivos [ [, ,SIZE = size ] ] SIZE = size [ [, ,MAXSIZE = {{max_size | |UNLIMITED }}] ] MAXSIZE = max_size UNLIMITED [ [, ,FILEGROWTH = growth_increment ] ]))[ [,...n ] ] FILEGROWTH = growth_increment ,...n < grupo_fichero > ::= < grupo_fichero > ::= FILEGROUP filegroup_name < fichero > [ [,...n ] ] FILEGROUP filegroup_name < fichero > ,...n
Marta Zorrilla 2009-2010 8

IDD :: CREATE DATABASE. Ejemplo IDD CREATE DATABASE. Ejemplo

CREATE DATABASE [compras] CREATE DATABASE [compras] ON (NAME = N'compras', ON (NAME = N'compras', FILENAME = N'C:\data\compras.mdf' , , FILENAME = N'C:\data\compras.mdf' SIZE = 2, MAXSIZE = 3000,FILEGROWTH = 10%) SIZE = 2, MAXSIZE = 3000,FILEGROWTH = 10%) LOG ON (NAME = N'compras_log', LOG ON (NAME = N'compras_log', FILENAME = N'C:\data\compras_log.LDF' , , FILENAME = N'C:\data\compras_log.LDF' SIZE = 1, FILEGROWTH = 10%) SIZE = 1, FILEGROWTH = 10%) COLLATE Modern_Spanish_CI_AS COLLATE Modern_Spanish_CI_AS

Marta Zorrilla

2009-2010

IDD: CREATE TABLE IDD: CREATE TABLE Para incorporar una tabla nueva a la base de datos. Su sintaxis es: CREATE TABLE [ [nombreDB.[ esquema ] ]. .| |esquema. ] ]tabla CREATE TABLE nombreDB.[ esquema esquema. tabla (campo1 tipo [(tamao)] [NOT NULL] [restriccin_un_campo1 [ [... ] ]] ] (campo1 tipo [(tamao)] [NOT NULL] [restriccin_un_campo1 ... [, campo2 tipo [(tamao)] [NOT NULL] [restriccin_un_campo2 [ [... ] ]] ] [, campo2 tipo [(tamao)] [NOT NULL] [restriccin_un_campo2 ... [, ...]] [, ...]] [, restriccin_varios_campos [, ...] ]])) [, restriccin_varios_campos [, ...] [[ON {{grupo_fichero | |DEFAULT }}]] ON grupo_fichero DEFAULT [[TEXTIMAGE_ON {{grupo_fichero | |DEFAULT }}]] TEXTIMAGE_ON grupo_fichero DEFAULT
tabla: es el nombre de la tabla que se va aacrear. tabla: es el nombre de la tabla que se va crear. campo1, campo2: son nombres de campos. Debe crearse al menos un campo. campo1, campo2: son nombres de campos. Debe crearse al menos un campo. tipo: es el tipo de dato asociado al campo. tipo: es el tipo de dato asociado al campo. tamao: es el tamao del campo en caracteres (solamente para campos de tipo Texto). tamao: es el tamao del campo en caracteres (solamente para campos de tipo Texto). restriccin_un_campo1, restriccin_un_campo2: son clusulas CONSTRAINT que afectan aaun nico restriccin_un_campo1, restriccin_un_campo2: son clusulas CONSTRAINT que afectan un nico campo. campo. restriccin_varios_campos: es una clusula CONSTRAINT que define un ndice de mltiples campos. restriccin_varios_campos: es una clusula CONSTRAINT que define un ndice de mltiples campos. ON: Especifica el grupo de archivos en el que se almacena la tabla. ON: Especifica el grupo de archivos en el que se almacena la tabla. TEXTIMAGE_ON: indica en qu grupo de archivos se almacenan las columnas text, ntext eeimage. Marta Zorrilla 2009-2010 TEXTIMAGE_ON: indica en qu grupo de archivos se almacenan las columnas text, ntext image.
16

IDD: ALTER TABLE IDD: ALTER TABLE Para modificar el diseo de una tabla que ya existe en la base de datos. Su sintaxis es: ALTER TABLE tabla ALTER TABLE tabla {{ADD campo tipo [(tamao)] [NOT NULL] [restriccin_un_campo] | | ADD campo tipo [(tamao)] [NOT NULL] [restriccin_un_campo] [ [WITH CHECK | |WITH NOCHECK ] ]ADD {{restriccin_tabla }}[ [,...n ] ] | | WITH CHECK WITH NOCHECK ADD restriccin_tabla ,...n ALTER COLUMN {{campo tipo [(tamao)] }} | | ALTER COLUMN campo tipo [(tamao)] DROP {COLUMN campo | | CONSTRAINT nombre_restriccin} | | DROP {COLUMN campo CONSTRAINT nombre_restriccin} {{ENABLE | |DISABLE }}TRIGGER {{ALL | |nombre_trigger [ [,...n ] ]}} | | ENABLE DISABLE TRIGGER ALL nombre_trigger ,...n {{CHECK | |NOCHECK }}CONSTRAINT {{ALL | |nombre_restriccin[ ,...n ] ]}} CHECK NOCHECK CONSTRAINT ALL nombre_restriccin[ ,...n }}
tabla: es el nombre de la tabla que se va aamodificar. tabla: es el nombre de la tabla que se va modificar. campo: es el nombre del campo que se va aaaadir oomodificar en la tabla . . campo: es el nombre del campo que se va aadir modificar en la tabla tipo: es el tipo de dato que se asigna aacampo. tipo: es el tipo de dato que se asigna campo. tamao: es el tamao del campo en caracteres (solamente para campos de tipo Texto). tamao: es el tamao del campo en caracteres (solamente para campos de tipo Texto). restriccin_un_campo: es una clusula CONSTRAINT que afectan aaun nico campo. restriccin_un_campo: es una clusula CONSTRAINT que afectan un nico campo. restriccin_tabla: es una clusula CONSTRAINT que afecta aavarios campos. restriccin_tabla: es una clusula CONSTRAINT que afecta varios campos. nombre_restriccin: es el nombre de la restriccin que se va aaeliminar oohabilitar/deshabilitar. nombre_restriccin: es el nombre de la restriccin que se va eliminar habilitar/deshabilitar. nombre_trigger: es el nombre del desencadenador que se va aaeliminar oohabilitar/deshabilitar. nombre_trigger: es el nombre del desencadenador que se va eliminar habilitar/deshabilitar.
Marta Zorrilla 2009-2010 17

IDD :: CLUSULA CONSTRAINT SOBRE UN SOLO CAMPO IDD CLUSULA CONSTRAINT SOBRE UN SOLO CAMPO
Se utiliza en instrucciones CREATE TABLE y ALTER TABLE para crear o eliminar restricciones. Esta clusula puede referirse a un campo de la tabla. La restriccin Primary Key y Unique generan ndice, Foreign key no.
CONSTRAINT nombre CONSTRAINT nombre { {[ [NULL | |NOT NULL ] ]| | NULL NOT NULL [ [{ {PRIMARY KEY | |UNIQUE } } PRIMARY KEY UNIQUE [ [CLUSTERED | |NONCLUSTERED ] ] CLUSTERED NONCLUSTERED [ [WITH FILLFACTOR ==factor_relleno ] ] WITH FILLFACTOR factor_relleno [ [ON {grupo_ficheros | |DEFAULT} ] ]] ] ON {grupo_ficheros DEFAULT} ] ]| | [ [[ [FOREIGN KEY ] ] FOREIGN KEY REFERENCES otra_tabla[ (campo_externo1) ] ] REFERENCES otra_tabla[ (campo_externo1) [ [ON DELETE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ] ON DELETE {NO ACTION CASCADE SET NULL SET DEFAULT [ [ON UPDATE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ] ON UPDATE {NO ACTION CASCADE SET NULL SET DEFAULT [ [NOT FOR REPLICATION ] ] NOT FOR REPLICATION ] ]| | CHECK [ [NOT FOR REPLICATION ] ] ( (expresin_lgica ) ) CHECK NOT FOR REPLICATION expresin_lgica }}

Marta Zorrilla

nombre: es el nombre de la restriccin que se va aacrear. nombre: es el nombre de la restriccin que se va crear. otra_tabla: es el nombre de la tabla aala que se hace referencia. otra_tabla: es el nombre de la tabla la que se hace referencia. campo_externo1: son los nombres de los campos de la otra_tabla aalos que se hace referencia. campo_externo1: son los nombres de los campos de la otra_tabla los que se hace referencia. factor_relleno: especifica cunto se debe llenar cada pgina de ndice utilizada para almacenar los factor_relleno: especifica cunto se debe llenar cada pgina de ndice utilizada para almacenar los datos de ndice.Entre 00yy100. Por defecto 0. datos de ndice.Entre 100. Por defecto 0. grupo_ficheros: indica dnde se almacena la tabla grupo_ficheros: indica dnde se almacena la tabla expresin_lgica: Expresin que devuelve true oofalse expresin_lgica: Expresin que devuelve true false
2009-2010

18

IDD :: CLUSULA CONSTRAINT SOBRE TABLA IDD CLUSULA CONSTRAINT SOBRE TABLA
CONSTRAINT nombre CONSTRAINT nombre {{ [ [{ {PRIMARY KEY | |UNIQUE } } PRIMARY KEY UNIQUE [ [CLUSTERED | |NONCLUSTERED ] ] CLUSTERED NONCLUSTERED { {(principal1 [ [ASC | |DESC ] ][ [, ,principal2 [,[,...] ] ]) )} } (principal1 ASC DESC principal2 ...] [ [WITH FILLFACTOR = factor_relleno] WITH FILLFACTOR = factor_relleno] [ [ON { {grupo_ficheros | |DEFAULT } }] ] ON grupo_ficheros DEFAULT ]] || FOREIGN KEY FOREIGN KEY [ [(referencia1 [,[,referencia2 [,[,...] ] ]) )] ] (referencia1 referencia2 ...] REFERENCES otra_tabla [ [(campo_externo1 [ [,... campo_externo2 ] ]) )] ] REFERENCES otra_tabla (campo_externo1 ,... campo_externo2 [ [ON DELETE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ] ON DELETE {NO ACTION CASCADE SET NULL SET DEFAULT [ [ON UPDATE {NO ACTION | |CASCADE | |SET NULL | |SET DEFAULT } }] ] ON UPDATE {NO ACTION CASCADE SET NULL SET DEFAULT [ [NOT FOR REPLICATION ] ] | | NOT FOR REPLICATION CHECK [ [NOT FOR REPLICATION ] ] (expresin_lgica ) ) CHECK NOT FOR REPLICATION (expresin_lgica }} nombre: es el nombre de la restriccin que se va aacrear. nombre: es el nombre de la restriccin que se va crear. principal1, principal2: son los nombres de los campos que compondrn la clave principal. principal1, principal2: son los nombres de los campos que compondrn la clave principal. referencia1, referencia2: son los nombres de los campos que hacen referencia aaotros de otra tabla. referencia1, referencia2: son los nombres de los campos que hacen referencia otros de otra tabla. otra_tabla: es el nombre de la tabla aala que se hace referencia. otra_tabla: es el nombre de la tabla la que se hace referencia. campo_externo1, campo_externo2: son los nombres de los campos de la otra_tabla aalos que se campo_externo1, campo_externo2: son los nombres de los campos de la otra_tabla los que se hace referencia. hace referencia. expresin_lgica: criterio que se ha de cumplir. Devuelve true oofalse expresin_lgica: criterio que se ha de cumplir. Devuelve true false
Marta Zorrilla 2009-2010 19

Ejemplo Ejemplo
La base de datos trata de informatizar el proceso de compras de una empresa. Esto La base de datos trata de informatizar el proceso de compras de una empresa. Esto es, recoger los pedidos de los artculos, contemplados en su catlogo, que compran aa es, recoger los pedidos de los artculos, contemplados en su catlogo, que compran proveedores ya conocidos. proveedores ya conocidos. Reglas: Reglas: - -No puede seleccionar un artculo descatalogado. No puede seleccionar un artculo descatalogado. - -Si el stock alcanza el mnimo establecido, se ha de notificar como un evento. Si el stock alcanza el mnimo establecido, se ha de notificar como un evento.

Marta Zorrilla

2009-2010

20

IDD: CREATE TABLE IDD: CREATE TABLE Ejemplos Ejemplos

Escribir las instrucciones SQL necesarias para construir la base de datos cuyo esquema de relaciones es:

CREATE TABLE Lineas ( ( CREATE TABLE Lineas CREATE TABLE Proveedores ( ( NOT NULL, numped INTEGER NOT NULL, CREATE TABLE Proveedores numped INTEGER codigpro CHAR(4) NOT NULL NOT NULL, numlin codigpro CHAR(4) SMALLINT NOT NULL, numlin NOT NULL CONSTRAINT id_pro PRIMARY KEY, SMALLINT CONSTRAINT id_pro PRIMARY KEY, CREATE TABLE Articulos ( CREATE TABLE Articulos cifpro CHAR(12) (CHAR(6) codigart ( CREATE TABLEcodigart NOT( NULLNOTNULL, cifpro CHAR(12) NOT NULL CONSTRAINT u_cif UNIQUE, CONSTRAINT u_cif UNIQUE, CREATE TABLEPedidos CHAR(6) NOT NULL, Pedidos codigart CHAR(6) NOT NULL CONSTRAINT id_art PRIMARY KEY, nombrpro codigartINTEGER NULL, NULL NULL CONSTRAINT id_ped PRIMARY KEY, unilin CHAR(6) NOT NULL, CONSTRAINT id_art PRIMARY KEY, numped INTEGER NULL, NOT NULL CONSTRAINT id_ped PRIMARY KEY, nombrpro CHAR(30) FLOAT NOT NOT CHAR(30) NOT NOT unilin FLOAT NOT NULL, numped descrart CHAR(40) NOT NULL, descrart direcpro CHAR(30)CHAR(40) NOT NULL,NULL DEFAULT getdate(), preunlin MONEY fechaped DATETIME direcpro CHAR(30) NOT NULL,NOTNULL, preunlin NOT NULL, NOT MONEY NULL, fechaped DATETIME NOT NOTNULL DEFAULT getdate(), preunart MONEY NOT NULL, preunart NOT NULL, cpostpro CHAR(5) MONEYNULLCHECK NULL, desculin NOT codigpro CHAR(4) NOT (cpostpro (desculin>=0 and desculin<=100), cpostpro CHAR(5) NOT NULLNOT NOT(cpostpro like '[0-9][0-9][0-9][0-9][0-9]'), CHECK NULL, desculin FLOAT FLOAT NOTNULL CHECK like '[0-9][0-9][0-9][0-9][0-9]'), NULL CHECK (desculin>=0 and desculin<=100), codigpro CHAR(4) stockart INTEGER NOT NULL CHECK (stockart >0), CHECK (stockart / 100)), localpro stockartFLOAT ([preunlin]NULLNULL(1[desculin] >0), and ivaped<100), totallin ivaped totallinINTEGER NOT NOT NULLCHECK (ivaped>0 localpro CHAR(20) NOT ([preunlin]**[unilin] **(1 CHECK(ivaped>0 and ivaped<100), CHAR(20) AS NULL, NOT [unilin] [desculin] / 100)), ivaped FLOATAS NULL, NOT stockmin INTEGER NOT NULL CHECK (stockmin>0), stockmin INTEGER NOT CHECK telefprofentrped DATETIMENULL, NULLNULL, (stockmin>0), CHAR(17) NOT fentrped DATETIME PRIMARY KEY (numped, numlin), telefpro CONSTRAINTNOT NULL, NOT KEY(numped, numlin), CHAR(17) CONSTRAINTid_lin PRIMARY NULL, id_lin NOT fecbaja DATETIME) fecbaja DATETIME) faxpro CONSTRAINT f_ped FOREIGN(codigpro) REFERENCES Proveedores (codigpro), CHAR(17), CONSTRAINT f_pro FOREIGN KEY KEY (numped) REFERENCES Pedidos (codigpro), faxpro CONSTRAINT f_ped FOREIGN(codigpro) REFERENCES Proveedores (numped), CHAR(17), CONSTRAINT f_pro FOREIGN KEY KEY (numped) REFERENCES Pedidos (numped), emailpro CONSTRAINT f_art FOREIGN KEY (codigart) REFERENCES Articulos (codigart)) CHAR(25), CONSTRAINT c_fecha CHECK (fechaped<=fentrped)) emailpro CONSTRAINT f_art FOREIGN KEY (codigart) REFERENCES Articulos (codigart)) CHAR(25), CONSTRAINT c_fecha CHECK (fechaped<=fentrped)) procepro CHAR(10) NOT NULL CHECK (procepro in ('UE', 'No UE'))) procepro CHAR(10) NOT NULL CHECK (procepro in ('UE', 'No UE')))
Marta Zorrilla 2009-2010 21

IDD :: ALTER TABLE. Ejemplos IDD ALTER TABLE. Ejemplos ALTER TABLE [dbo].[Proveedores] ALTER TABLE [dbo].[Proveedores] ADD CONSTRAINT [id_pro] PRIMARY KEY CLUSTERED (([codigpro] )) ADD CONSTRAINT [id_pro] PRIMARY KEY CLUSTERED [codigpro] ON [PRIMARY] ON [PRIMARY] GO GO ALTER TABLE [dbo].[Pedidos] WITH NOCHECK ADD ALTER TABLE [dbo].[Pedidos] WITH NOCHECK ADD CONSTRAINT [DF_Pedidos_fechaped] DEFAULT (getdate()) FOR [fechaped], CONSTRAINT [DF_Pedidos_fechaped] DEFAULT (getdate()) FOR [fechaped], CONSTRAINT [c_fecha] CHECK ([fechaped] <= [fentrped]), CONSTRAINT [c_fecha] CHECK ([fechaped] <= [fentrped]), CHECK ([ivaped] > 0 and [ivaped] < 100) CHECK ([ivaped] > 0 and [ivaped] < 100) GO GO ALTER TABLE [dbo].[Proveedores] ADD ALTER TABLE [dbo].[Proveedores] ADD CONSTRAINT [u_cif] UNIQUE NONCLUSTERED (([cifpro] )) ON [PRIMARY] , , CONSTRAINT [u_cif] UNIQUE NONCLUSTERED [cifpro] ON [PRIMARY] CHECK ([cpostpro] like '[0-9][0-9][0-9][0-9][0-9]'), CHECK ([cpostpro] like '[0-9][0-9][0-9][0-9][0-9]'), CHECK ([procepro] = 'No UE' or [procepro] = 'UE') CHECK ([procepro] = 'No UE' or [procepro] = 'UE') GO GO

Marta Zorrilla

2009-2010

22

IDD :: CREATE INDEX IDD CREATE INDEX Para crear un ndice nuevo en una tabla que ya existe en la base de datos. Su sintaxis es: CREATE [ [UNIQUE ] ][ [CLUSTERED | |NONCLUSTERED ] ]INDEX ndice CREATE UNIQUE CLUSTERED NONCLUSTERED INDEX ndice ON {tabla | |vista }}(campo1 [ [{ASC | |DESC }] [, campo2 [{ASC|DESC}], ...]) ON {tabla vista (campo1 {ASC DESC }] [, campo2 [{ASC|DESC}], ...]) [ [WITH < opcin_ndice > [ [,...n] ] ] WITH < opcin_ndice > ,...n] [ [ON grupo_ficheros ] ] ON grupo_ficheros < opcin_ndice > :: = < opcin_ndice > :: = {{PAD_INDEX | |FILLFACTOR = factor_relleno | |IGNORE_DUP_KEY | | PAD_INDEX FILLFACTOR = factor_relleno IGNORE_DUP_KEY DROP_EXISTING | |STATISTICS_NORECOMPUTE | | SORT_IN_TEMPDB }} DROP_EXISTING STATISTICS_NORECOMPUTE SORT_IN_TEMPDB
UNIQUE: seala que el ndice es de unicidad, en caso contrario permitir repeticin de valores. UNIQUE: seala que el ndice es de unicidad, en caso contrario permitir repeticin de valores. ndice: es el nombre del ndice que se va aacrear. ndice: es el nombre del ndice que se va crear. tabla/vista: es el nombre de una tabla/vista existente aala que estar asociado el ndice. tabla/vista: es el nombre de una tabla/vista existente la que estar asociado el ndice. campo1, campo2: son los nombres de los campos que van aaformar el ndice. Puede ser un solo campo1, campo2: son los nombres de los campos que van formar el ndice. Puede ser un solo campo. Para forzar una ordenacin descendente de un campo, hay que utilizar la palabra reservada campo. Para forzar una ordenacin descendente de un campo, hay que utilizar la palabra reservada DESC; sino se especifica oose escribe ASC, se entiende que la ordenacin es ascendente. DESC; sino se especifica se escribe ASC, se entiende que la ordenacin es ascendente.

CREATE INDEX FK_Lineas ON Lineas (codigart) CREATE INDEX FK_Lineas ON Lineas (codigart)
Marta Zorrilla 2009-2010 23

Tipos de datos Tipos de datos

Consideraciones previas: Consideraciones previas:


Qu tipo de informacin se va a almacenar. Por ejemplo, no se Qu tipo de informacin se va a almacenar. Por ejemplo, no se pueden guardar caracteres en un campo cuyo tipo de datos sea pueden guardar caracteres en un campo cuyo tipo de datos sea numrico. numrico. El espacio de almacenamiento necesario (dimensionar el campo). El espacio de almacenamiento necesario (dimensionar el campo). Qu tipo de operaciones se van a realizar con los valores del campo. Qu tipo de operaciones se van a realizar con los valores del campo. Pues, por ejemplo, no se puede calcular la suma de dos cadenas de Pues, por ejemplo, no se puede calcular la suma de dos cadenas de texto. texto. Si se desea ordenar o indexar por ese campo. Los criterios de Si se desea ordenar o indexar por ese campo. Los criterios de ordenacin difieren en funcin del tipo de dato, as, los nmeros ordenacin difieren en funcin del tipo de dato, as, los nmeros almacenados en un campo texto se ordenan segn el valor de su almacenados en un campo texto se ordenan segn el valor de su cdigo ASCII (1,10,11,2,20,...) que no coincide con la ordenacin cdigo ASCII (1,10,11,2,20,...) que no coincide con la ordenacin numrica. numrica.
Marta Zorrilla 2009-2010 24

Tipos de datos en SQL Server 2005 I Tipos de datos en SQL Server 2005 I NUMRICOS
Datos enteros (nmeros enteros) comprendidos entre -2^63 (-9223372036854775808) y 2^63 -1 (9223372036854775807). Datos enteros (nmeros enteros) comprendidos entre -2^31 (-2.147.483.648) y 2^31 - 1 int (2.147.483.647). Datos enteros comprendidos entre 2^15 (-32.768) y 2^15 - 1 (32.767). smallint Datos enteros comprendidos 0 y 255. tinyint Datos enteros con valor 1 0. bit Datos de precisin y escala numrica fijas comprendidos entre -10^38 +1 y 10^38 1. decimal Funcionalmente equivalente a decimal. numeric Valores de moneda comprendidos entre -2^63 (-922.337.203.685.477,5808) y 2^63 - 1 money (+922.337.203.685.477,5807), con una precisin de una diezmilsima de la unidad monetaria. smallmoney Valores de moneda comprendidos entre -214.748,3648 y +214.748,3647, con una precisin de una diezmilsima de la unidad monetaria. Nmeros con precisin de coma flotante comprendidos entre -1,79E + 308 y 1,79E + 308. float Nmeros con precisin de coma flotante comprendidos entre -3,40E + 38 y 3,40E + 38. real bigint

Marta Zorrilla

2009-2010

25

Tipos de datos en SQL Server 2005 II Tipos de datos en SQL Server 2005 II FECHAS
datetime Datos de fecha y hora comprendidos entre el 1 de enero de 1753 y el 31 de diciembre de 9999, con una precisin de 3,33 milisegundos. (timestamp en el standard sql:2003) smalldatetime Datos de fecha y hora comprendidos entre el 1 de enero de 1900 y el 6 de junio de 2079, con una precisin de un minuto.

CADENAS DE CARACTERES
char varchar text nchar nvarchar ntext Datos de caracteres no Unicode de longitud fija con una longitud mxima de 8.000 caracteres. Datos no Unicode de longitud variable con un mximo de 8.000 caracteres. Datos no Unicode de longitud variable con una longitud mxima de 2^31 - 1 (2.147.483.647) caracteres. Datos Unicode de longitud variable con una longitud mxima de 4.000 caracteres. Datos Unicode de longitud variable con una longitud mxima de 4.000 caracteres. Datos Unicode de longitud variable con una longitud mxima de 2^30 - 1 (1.073.741.823) caracteres.

Marta Zorrilla

2009-2010

26

Tipos de datos en SQL Server 2005 III Tipos de datos en SQL Server 2005 III BINARIOS
binary varbinary image Datos binarios de longitud fija con una longitud mxima de 8.000 bytes. Datos binarios de longitud variable con una longitud mxima de 8.000 bytes. Datos binarios de longitud variable con una longitud mxima de 2^31 - 1 (2.147.483.647) bytes.

OTROS TIPOS DE DATOS


Una referencia a un cursor. cursor sql_variant Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server, excepto text, ntext, timestamp y sql_variant. Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para un table proceso posterior. timestamp Un nmero nico para toda la base de datos que se actualiza cada vez que se actualiza una fila. (utilizar rowversion para versiones futuras) uniqueiden Un identificador exclusivo global (GUID), necesario para replicacin tifier Almacena una instancia de XML xml

Marta Zorrilla

2009-2010

27

Tipo de dato Autonumrico: IDENTITY Tipo de dato Autonumrico: IDENTITY

IDENTITY [ [(semilla , ,incremento) ] ] IDENTITY (semilla incremento)


semilla: valor de inicio. semilla: valor de inicio. incremento: incremento que se aplica incremento: incremento que se aplica

CREATE TABLE dbo.herramientas( CREATE TABLE dbo.herramientas( ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Nombre VARCHAR(40) NOT NULL Nombre VARCHAR(40) NOT NULL )) -- insertamos valores -- insertamos valores INSERT INTO dbo.herramientas (Nombre ))VALUES (Martillo') INSERT INTO dbo.herramientas (Nombre VALUES (Martillo') INSERT INTO dbo.herramientas (Nombre ))VALUES (Taladro') INSERT INTO dbo.herramientas (Nombre VALUES (Taladro') -- si borramos, Martillo, se pierde el ID 1. Para reutilizarlo -- si borramos, Martillo, se pierde el ID 1. Para reutilizarlo SET IDENTITY_INSERT dbo.Tool ON SET IDENTITY_INSERT dbo.Tool ON INSERT INTO dbo.herramientas (ID, Nombre) VALUES (1, Serrucho') INSERT INTO dbo.herramientas (ID, Nombre) VALUES (1, Serrucho')
Marta Zorrilla 2009-2010 28

Manipulacin de datos Manipulacin de datos SQL Server 2005 SQL Server 2005

Instrucciones de Manipulacin de Datos (IMD) I Instrucciones de Manipulacin de Datos (IMD) I

Las IMD permiten actuar sobre los propios datos. Las IMD permiten actuar sobre los propios datos. Las operaciones bsicas de manipulacin de datos son: insertar, Las operaciones bsicas de manipulacin de datos son: insertar, modificar, borrar y consultar. modificar, borrar y consultar. Las tres primeras permiten alterar el contenido de la base de datos. Las tres primeras permiten alterar el contenido de la base de datos. La ltima consiste en localizar datos para su observacin. La ltima consiste en localizar datos para su observacin. Principales instrucciones: Principales instrucciones: INSERT INSERT UPDATE UPDATE DELETE DELETE SELECT SELECT

Marta Zorrilla

2009-2010

34

IMD II :: INSERT IMD II INSERT Permite aadir una o ms filas en una tabla. La sintaxis para insertar una sola fila es: INSERT INTO destino [(campo1[, campo2[, ...]])] INSERT INTO destino [(campo1[, campo2[, ...]])] VALUES (valor1[, valor2[, ...]]) VALUES (valor1[, valor2[, ...]]) La sintaxis para insertar varias filas es: INSERT INTO destino [(campo1[, campo2[, ...]])] INSERT INTO destino [(campo1[, campo2[, ...]])] Instruccin_SELECT Instruccin_SELECT
destino: es el nombre de la tabla o vista donde se van a aadir filas. campo1, campo2: son los nombres de los campos donde se van a aadir los datos. valor1, valor2: son los valores que tomarn los campos en la nueva fila que se van a insertar. Cada valor se asigna al campo que corresponde a la posicin del valor en la lista, as, valor1 se asigna al campo1, valor2 al campo2, y as sucesivamente. Por su frecuencia, cabe mencionar que los valores que se asignen a campos de texto deben escribirse entre comillas simples ('texto'). Instruccin_SELECT: es la instruccin SELECT cuya ejecucin proporcionar las filas a insertar.

Marta Zorrilla

2009-2010

35

IMD III :: UPDATE IMD III UPDATE Permite modificar informacin existente en una o varias filas de una tabla. Su sintaxis es: UPDATE destino SET campo1=nuevovalor1 [, campo2=nuevovalor2 [, ...]] UPDATE destino SET campo1=nuevovalor1 [, campo2=nuevovalor2 [, ...]] [WHERE condicin] [WHERE condicin]
destino: es el nombre de la tabla o vista en la que se desea modificar datos.

campo1, campo2: son los nombres de los campos que van a modificar su valor. nuevovalor1, nuevovalor2: son expresiones que determinan los valores que van a tomar los campos de las filas que se van a actualizar. condicin: es una expresin lgica que determina qu filas se actualizarn. Slo se actualizarn las filas que satisfagan la expresin. Si no se incluye clusula WHERE (no hay condicin) se modificarn todas las filas de la tabla.

Marta Zorrilla

2009-2010

36

IMD IV :: DELETE IMD IV DELETE Permite eliminar una o varias filas de una tabla. Su sintaxis es:

DELETE FROM destino [WHERE condicin] DELETE FROM destino [WHERE condicin]

destino: es el nombre de la tabla o vista cuyas filas se van a

eliminar. condicin: es una expresin lgica que determina qu filas se borrarn. Slo se borrarn las filas que satisfagan la expresin. Si no se incluye clusula WHERE (no hay condicin) se borrarn todas las filas de la tabla.

Marta Zorrilla

2009-2010

37

IMD V :: INSERT, UPDATE, DELETE IMD V INSERT, UPDATE, DELETE Ejemplos Ejemplos

Insertar una nueva fila en la tabla Proveedores.


INSERT INTO Proveedores (codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro, INSERT INTO Proveedores (codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro, procepro) procepro) VALUES ('P005', 'A39144325', 'Angulo Lastra, Antonio', 'Hernn Corts,18', '39002', 'Santander', '(34) VALUES ('P005', 'A39144325', 'Angulo Lastra, Antonio', 'Hernn Corts,18', '39002', 'Santander', '(34) 942 202 022', '(34) 942 202 022', 'UE') 942 202 022', '(34) 942 202 022', 'UE')

Incorporar el e-mail del proveedor Luis Gil Laso, con valor mailto:gil@unican.es.
UPDATE Proveedores SET emailpro='mailto:gil@unican.es' UPDATE Proveedores SET emailpro='mailto:gil@unican.es' WHERE codigpro='P004' WHERE codigpro='P004'

Borrar todos los proveedores de Santander.


DELETE FROM Proveedores DELETE FROM Proveedores WHERE localpro='Santander' WHERE localpro='Santander'

Marta Zorrilla

2009-2010

38

Datos Datos

Marta Zorrilla

2009-2010

39

IMD VI :: SELECT IMD VI SELECT Est dedicada a obtener informacin de la base de datos. El resultado de su ejecucin, si existe, siempre tiene estructura de una tabla y los campos de sus filas responden a la lista de seleccin. Tiene enormes posibilidades, lo que hace que su sintaxis presente muchas variantes.
SELECT [ [predicado ] ] Lista_de_seleccin SELECT predicado Lista_de_seleccin [INTO tabla_temporal] [INTO tabla_temporal] FROM lista_de_tablas FROM lista_de_tablas [WHERE condicin ] ] [WHERE condicin [GROUP BY lista_campos_group_by] [GROUP BY lista_campos_group_by] [HAVING condicin_group_by] [HAVING condicin_group_by] [ORDER BY colum1 { {[ASC] | |DESC } }[,[,colum2 { {[ASC] | |DESC }, .... ] ]] ] [ORDER BY colum1 [ASC] DESC colum2 [ASC] DESC }, ....

Marta Zorrilla

2009-2010

41

IMD VII :: SELECT IMD VII SELECT


predicado: puede tomar uno de los siguientes valores: ALL, DISTINCT o TOP nmero_de_filas (devuelve el nmero de registros especificado segn una clusula ORDER BY). Puede utilizar el predicado para limitar el nmero de registros devueltos. Si no especifica ninguno, el valor predeterminado es ALL. Lista_de_seleccin: es el conjunto de los elementos que sern aportados como respuesta. stos, pueden ser expresiones y funciones separados por comas, aunque generalmente responden a una de las siguientes alternativas: { * | tabla.* | [tabla.]campo1 [AS alias1] [, [tabla.]campo2 [AS alias2] , ...] | funciones} o * especifica que se seleccionan todos los campos de la tabla o tablas a las que se accede. o tabla: es el nombre de la tabla que contiene los campos de la que se van a seleccionar los registros. o campo1, campo2: son los nombres de los campos que contienen los datos que desea recuperar. o alias1, alias2: Los nombres que se van a utilizar como encabezados de columnas en vez de los nombres de columnas originales en tabla. o funciones: funciones definidas por el usuario, anteponer el propietario. tabla_temporal: es el nombre de la tabla que se crear para almacenar los registros obtenidos. lista_de_tablas: representa el nombre de la tabla o las tablas que contienen los datos a los que se desea acceder. condicin: es una expresin lgica con los criterios de seleccin de registros. lista_campos_group_by: son los nombres de los campos que se van a utilizar para agrupar los registros. condicin_group_by: son las condiciones que se imponen sobre el criterio de agrupamiento. colum1, colum2: son nombres de elementos de la lista de seleccin o la posicin que ocupan en ella. ASC quiere decir ordenacin ascendente (es la opcin por defecto) y DESC significa ordenacin descendente.

Marta Zorrilla

2009-2010

42

IMD VIII :: SELECT IMD VIII SELECT

Con Operadores Con Pred. BETWEEN... AND...

Bsquedas Bsquedas Sencillas Sencillas Condiciones de Condiciones de Comparacin Comparacin Bsquedas Bsquedas Cualificadas Cualificadas Condiciones de Condiciones de Combinacin Combinacin Condiciones de Condiciones de Subsentencia Subsentencia

Con Pred. IN (lista_de_valores) Con Pred. LIKE cadena_caracteres Con Pred. NULL

Simple Mltiple Autocombinacin Combinacin Externa De Comparacin Con Predicado IN Con Predicado EXISTS

Marta Zorrilla

2009-2010

43

IMD IX :: SELECT IMD IX SELECT

Funciones de Grupo Funciones de Grupo Funciones de Fecha Funciones de Fecha Agrupamiento de Datos Agrupamiento de Datos Ordenacin del Resultado Ordenacin del Resultado Guardar Resultado Guardar Resultado en una Tabla en una Tabla Unin, Interseccin y Excepcin de Sentencias Unin, Interseccin y Excepcin de Sentencias Uso de funciones almacenadas Uso de funciones almacenadas
Marta Zorrilla 2009-2010 44

Condicin de Agrupamiento Condicin de Agrupamiento

IMD X :: SELECT IMD X SELECT Bsquedas Sencillas (Ejemplos) Bsquedas Sencillas (Ejemplos)

Obtener el contenido de la tabla Articulos. SELECT ** FROM Articulos SELECT FROM Articulos

Listar el nombre y el telfono de todos los Proveedores. SELECT nombrpro as Nombre, telefpro as Telf SELECT nombrpro as Nombre, telefpro as Telf FROM Proveedores FROM Proveedores

Marta Zorrilla

2009-2010

45

IMD XI :: SELECT IMD XI SELECT


Bsquedas Cualificadas. Cond. de Comparacin 1 Bsquedas Cualificadas. Cond. de Comparacin 1 (Ejemplos) (Ejemplos)

Las condiciones de comparacin son expresiones lgicas que permiten comparar una columna o expresin con otra columna, expresin o lista de columnas. Pueden adoptar una de las formas siguientes: exp operador_de_comparacin exp exp operador_de_comparacin exp exp [NOT] BETWEEN exp AND exp exp [NOT] BETWEEN exp AND exp exp [NOT] IN (lista de valores) exp [NOT] IN (lista de valores) campo [NOT] LIKE 'cadena_de_caracteres' campo [NOT] LIKE 'cadena_de_caracteres' campo IS [NOT] NULL campo IS [NOT] NULL Encontrar los artculos cuyo precio unitario sea superior a 180 y su stock sea inferior o igual a 100. SELECT ** FROM Articulos SELECT FROM Articulos WHERE preunart > 180 AND stockart <= 100 WHERE preunart > 180 AND stockart <= 100

Marta Zorrilla

2009-2010

46

IMD XII :: SELECT IMD XII SELECT


Bsquedas Cualificadas. Cond. de Comparacin 2 Bsquedas Cualificadas. Cond. de Comparacin 2 (Ejemplos) (Ejemplos)

Listar los artculos cuyo precio unitario est comprendido entre 180 y 300 . SELECT ** FROM Articulos SELECT FROM Articulos WHERE preunart BETWEEN 180 AND 300 WHERE preunart BETWEEN 180 AND 300

Hallar todos los proveedores de las ciudades de Santander, Madrid y Barcelona. SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores WHERE localpro IN ('Santander', 'Madrid', 'Barcelona') WHERE localpro IN ('Santander', 'Madrid', 'Barcelona')

Marta Zorrilla

2009-2010

47

IMD XIII :: SELECT IMD XIII SELECT


Bsquedas Cualificadas. Cond. de Comparacin 3 Bsquedas Cualificadas. Cond. de Comparacin 3 (Ejemplos) (Ejemplos)

Encontrar todos los proveedores cuyo primer apellido comience por una letra comprendida entre la A y la J. SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores WHERE nombrpro LIKE '[A-J]%' WHERE nombrpro LIKE '[A-J]%'

Hallar todos los proveedores de los que no se tenga informacin sobre su correo electrnico. SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro FROM Proveedores FROM Proveedores WHERE emailpro IS NULL WHERE emailpro IS NULL

Marta Zorrilla

2009-2010

48

IMD XIV :: SELECT IMD XIV SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Combinacin Simple (Ejemplo) Combinacin Simple (Ejemplo)

Las bsquedas cualificadas son las que afectan a datos de ms de una tabla. Una Combinacin Simple es aquella en la que la condicin de la clusula Una Combinacin Simple es aquella en la que la condicin de la clusula FROM (o WHERE) contiene una comparacin de igualdad entre campos FROM (o WHERE) contiene una comparacin de igualdad entre campos pertenecientes a dos tablas distintas. pertenecientes a dos tablas distintas.

Listar todos los proveedores a los que se ha efectuado algn pedido entre el 20/1/2006 y el 15/9/2006. SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro FROM Proveedores INNER JOIN Pedidos FROM Proveedores INNER JOIN Pedidos ON Proveedores.codigpro = Pedidos.codigpro ON Proveedores.codigpro = Pedidos.codigpro WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15' WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'

Marta Zorrilla

2009-2010

49

IMD XIV :: SELECT IMD XIV SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Combinacin Simple (Ejemplo. Continuacin) Combinacin Simple (Ejemplo. Continuacin)

SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro FROM Proveedores INNER JOIN Pedidos FROM Proveedores INNER JOIN Pedidos ON Proveedores.codigpro = Pedidos.codigpro ON Proveedores.codigpro = Pedidos.codigpro WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15' WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15' Informacin de proceso

Marta Zorrilla

2009-2010

50

IMD XV :: SELECT IMD XV SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Combinacin Mltiple (Ejemplo) Combinacin Mltiple (Ejemplo)

Una Combinacin Mltiple es aquella Una Combinacin Mltiple es aquella combinacin que relaciona varios combinacin que relaciona varios campos de ms de dos tablas. campos de ms de dos tablas.

Encontrar todos los artculos que han sido pedidos entre el 15/5/2006 y el 30/5/2006. SELECT DISTINCT Articulos.codigart, descrart SELECT DISTINCT Articulos.codigart, descrart FROM Pedidos INNER JOIN FROM Pedidos INNER JOIN (Lineas INNER JOIN Articulos ON Lineas.codigart = Articulos.codigart) (Lineas INNER JOIN Articulos ON Lineas.codigart = Articulos.codigart) ON Pedidos.numped = Lineas.numped ON Pedidos.numped = Lineas.numped WHERE fechaped BETWEEN '2006/05/15' AND '2006/05/30' WHERE fechaped BETWEEN '2006/05/15' AND '2006/05/30'

Marta Zorrilla

2009-2010

51

IMD XVI :: SELECT IMD XVI SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Autocombinacin (Ejemplo) Autocombinacin (Ejemplo)

Una Autocombinacin es una combinacin de una tabla con ella misma. Una Autocombinacin es una combinacin de una tabla con ella misma.

Localizar todos los pedidos que tienen varias lneas del mismo artculo. SELECT x.numped, x.numlin, x.codigart SELECT x.numped, x.numlin, x.codigart FROM Lineas x, Lineas yy FROM Lineas x, Lineas WHERE x.numped = y.numped AND x.numlin <> y.numlin WHERE x.numped = y.numped AND x.numlin <> y.numlin AND x.codigart = y.codigart AND x.codigart = y.codigart

Marta Zorrilla

2009-2010

52

IMD XVI :: SELECT IMD XVI SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Autocombinacin (Ejemplo) Autocombinacin (Ejemplo)

Localizar todos los pedidos que tienen varias lneas del mismo artculo. SELECT x.numped, x.numlin, x.codigart SELECT x.numped, x.numlin, x.codigart FROM Lineas x, Lineas yy FROM Lineas x, Lineas WHERE x.numped = y.numped AND x.numlin <> y.numlin WHERE x.numped = y.numped AND x.numlin <> y.numlin AND x.codigart = y.codigart AND x.codigart = y.codigart Informacin de proceso
Acceso X
Acceso X Acceso X

Acceso Y
Acceso Y Acceso Y

Marta Zorrilla

2009-2010

53

IMD XVII :: SELECT IMD XVII SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Combinacin Externa (Ejemplo) Combinacin Externa (Ejemplo)

Una Combinacin Externa es aquella que da preferencia a una tabla Una Combinacin Externa es aquella que da preferencia a una tabla con respecto a otra. As, las filas de la tabla dominante sern con respecto a otra. As, las filas de la tabla dominante sern seleccionadas aunque la condicin de enlace no se haya verificado. seleccionadas aunque la condicin de enlace no se haya verificado. Listar todos los proveedores indicando, en su caso, los que han recibido algn pedido. SELECT Proveedores.codigpro, nombrpro, Pedidos.numped SELECT Proveedores.codigpro, nombrpro, Pedidos.numped FROM Proveedores LEFT JOIN Pedidos FROM Proveedores LEFT JOIN Pedidos ON Proveedores.codigpro = Pedidos.codigpro ON Proveedores.codigpro = Pedidos.codigpro Preferencia a la tabla de la izquierda

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped SELECT Proveedores.codigpro, nombrpro, Pedidos.numped FROM Pedidos RIGHT JOIN Proveedores FROM Pedidos RIGHT JOIN Proveedores ON Proveedores.codigpro = Pedidos.codigpro ON Proveedores.codigpro = Pedidos.codigpro

Preferencia a la tabla de la derecha

Marta Zorrilla

2009-2010

54

IMD XVII :: SELECT IMD XVII SELECT


Bsquedas Cualificadas. Cond. de Combinacin Bsquedas Cualificadas. Cond. de Combinacin Combinacin Externa (Ejemplo 2) Combinacin Externa (Ejemplo 2)

En el FROM de una Consulta pueden establecerse predicados. Estos se aplican En el FROM de una Consulta pueden establecerse predicados. Estos se aplican antes de ejecutar el join, mientras que cuando se establecen en el WHERE se antes de ejecutar el join, mientras que cuando se establecen en el WHERE se ejecutan al resultado del join. ejecutan al resultado del join. El resultado puede ser distinto si la condicin de join es LEFT o RIGHT. El resultado puede ser distinto si la condicin de join es LEFT o RIGHT. Listar todos los proveedores de Santander indicando, en su caso, los que han recibido algn pedido.
SELECT Proveedores.codigpro, nombrpro, Pedidos.numped SELECT Proveedores.codigpro, nombrpro, Pedidos.numped FROM Pedidos LEFT JOIN Proveedores FROM Pedidos LEFT JOIN Proveedores ON Proveedores.codigpro = Pedidos.codigpro ON Proveedores.codigpro = Pedidos.codigpro AND Localpro='SANTANDER' AND Localpro='SANTANDER' SELECT Proveedores.codigpro, nombrpro, Pedidos.numped SELECT Proveedores.codigpro, nombrpro, Pedidos.numped FROM Pedidos LEFT JOIN Proveedores FROM Pedidos LEFT JOIN Proveedores ON Proveedores.codigpro = Pedidos.codigpro ON Proveedores.codigpro = Pedidos.codigpro WHERE Localpro=SANTANDER WHERE Localpro=SANTANDER
Marta Zorrilla 2009-2010 55

IMD XVIII :: SELECT IMD XVIII SELECT


Bsquedas Cualificadas. Cond. de Subsentencias Bsquedas Cualificadas. Cond. de Subsentencias (Ejemplo de comparacin) (Ejemplo de comparacin) La instruccin SELECT permite contrastar una expresin ooun campo con el resultado La instruccin SELECT permite contrastar una expresin un campo con el resultado de otra instruccin (subsentencia) SELECT. A este contraste se le llama condicin de de otra instruccin (subsentencia) SELECT. A este contraste se le llama condicin de subsentencia yylas dos instrucciones se llaman instrucciones imbricadas. A su vez, la subsentencia las dos instrucciones se llaman instrucciones imbricadas. A su vez, la subsentencia puede incluir en su condicin aaotra subsentencia yyas sucesivamente. subsentencia puede incluir en su condicin otra subsentencia as sucesivamente. Las condiciones de subsentencia pueden adoptar una de las formas siguientes: Las condiciones de subsentencia pueden adoptar una de las formas siguientes:

exp operador_de_comparacin {ALL | |[ANY | |SOME] }} (instruccin SELECT) exp operador_de_comparacin {ALL [ANY SOME] (instruccin SELECT) exp [NOT] IN (instruccin SELECT) exp [NOT] IN (instruccin SELECT) [NOT] EXISTS (instruccin SELECT) [NOT] EXISTS (instruccin SELECT) Encontrar los artculos cuyo stock es mayor que toda cantidad pedida del mismo artculo. SELECT articulos.codigart, descrart, stockart FROM Articulos SELECT articulos.codigart, descrart, stockart FROM Articulos WHERE stockart > ALL (SELECT unilin FROM Lineas WHERE stockart > ALL (SELECT unilin FROM Lineas WHERE Articulos.codigart = Lineas.codigart) WHERE Articulos.codigart = Lineas.codigart)

Marta Zorrilla

2009-2010

56

IMD XIX :: SELECT IMD XIX SELECT


Bsquedas Cualificadas. Cond. de Subsentencias. Bsquedas Cualificadas. Cond. de Subsentencias. (Ejemplos con predicados IN y EXIST) (Ejemplos con predicados IN y EXIST)

Listar los artculos que no han sido pedidos entre el 24 de Septiembre y el 21 de Noviembre de 2006.

SELECT DISTINCT Articulos.codigart, descrart FROM Articulos SELECT DISTINCT Articulos.codigart, descrart FROM Articulos WHERE Articulos.codigart NOT IN (SELECT Lineas.codigart FROM Lineas, Pedidos WHERE Articulos.codigart NOT IN (SELECT Lineas.codigart FROM Lineas, Pedidos WHERE Pedidos.numped = Lineas.numped WHERE Pedidos.numped = Lineas.numped AND Pedidos.fechaped AND Pedidos.fechaped BETWEEN '2006/09/24' AND '2006/11/21') BETWEEN '2006/09/24' AND '2006/11/21') Encontrar los proveedores de Madrid a los que se les ha realizado algn pedido entre el 24/09/2006 y el 21/11/2006 . SELECT DISTINCT Proveedores.codigpro, nombrpro FROM Proveedores SELECT DISTINCT Proveedores.codigpro, nombrpro FROM Proveedores WHERE EXISTS ((SELECT ** FROM Pedidos WHERE EXISTS SELECT FROM Pedidos WHERE Proveedores.codigpro = Pedidos.codigpro WHERE Proveedores.codigpro = Pedidos.codigpro AND fechaped BETWEEN '2006/09/24' AND '2006/11/21') AND fechaped BETWEEN '2006/09/24' AND '2006/11/21') AND localpro = 'Madrid AND localpro = 'Madrid
Marta Zorrilla 2009-2010 57

IMD XX :: SELECT IMD XX SELECT


Funciones de grupo (Ejemplo) Funciones de grupo (Ejemplo)

COUNT(*) COUNT(*) COUNT(campo) COUNT(campo)

N de filas que componen N de filas que componen el grupo. el grupo. N de filas con valor N de filas con valor asignado al campo (nulos asignado al campo (nulos no cuentan). no cuentan). Suma de valores obtenidos Suma de valores obtenidos con la expresin en cada con la expresin en cada fila. fila. Media. Media. Mximo. Mximo. Mnimo. Mnimo. Desviacin tpica. Desviacin tpica. Varianza. Varianza.

Con las filas de la informacin de Con las filas de la informacin de proceso correspondiente a una proceso correspondiente a una instruccin SELECT se pueden instruccin SELECT se pueden establecer grupos. establecer grupos. En cada uno de estos grupos, En cada uno de estos grupos, mediante las funciones de grupo, se mediante las funciones de grupo, se pueden efectuar ciertos clculos. pueden efectuar ciertos clculos. Encontrar cuntos artculos hay registrados, el mximo y el mnimo precio unitario, el precio unitario medio y la valoracin del almacn.

SUM(exp) SUM(exp)

AVG(exp) AVG(exp) MAX(exp) MAX(exp) MIN(exp) MIN(exp) STDEV(exp) STDEV(exp) VAR(exp) VAR(exp)

SELECT COUNT(codigart) AS Cantidad, MAX(preunart) AS Max, SELECT COUNT(codigart) AS Cantidad, MAX(preunart) AS Max, MIN(preunart) AS Min, AVG(preunart) AS Precio_medio, MIN(preunart) AS Min, AVG(preunart) AS Precio_medio, SUM(preunart*stockart) AS Valoracin SUM(preunart*stockart) AS Valoracin FROM Articulos FROM Articulos

Marta Zorrilla

2009-2010

58

IMD XXI :: SELECT IMD XXI SELECT


Funciones de fecha (Ejemplo) Funciones de fecha (Ejemplo)

DAY(fecha) DAY(fecha) MONTH (fecha) MONTH (fecha) YEAR (fecha) YEAR (fecha)

Devuelve el da de mes de Devuelve el da de mes de fecha. fecha. Devuelve el mes de fecha. Devuelve el mes de fecha. Devuelve el ao de fecha. Devuelve el ao de fecha.

Los datos de tipo fecha son Los datos de tipo fecha son almacenados como una unidad de almacenados como una unidad de informacin. Cuando se necesita informacin. Cuando se necesita trabajar con componentes de una trabajar con componentes de una fecha, es preciso utilizar funciones fecha, es preciso utilizar funciones de fecha. de fecha.

DATEPART(dw,fecha) Devuelve el da de la DATEPART(dw,fecha) Devuelve el da de la semana semana correspondiente correspondiente aa fecha (el 11 domingo, fecha (el domingo, el 22 lunes, ...). el lunes, ...).

Listar da, mes y ao de cada pedido, as como el da de la semana al que corresponden sus fechas. SELECT numped, fechaped, SELECT numped, fechaped, DAY(fechaped) as dia_mes, MONTH(fechaped) as mes, DAY(fechaped) as dia_mes, MONTH(fechaped) as mes, YEAR(fechaped) as ao, DATEPART(dw,fechaped) as dia_sem YEAR(fechaped) as ao, DATEPART(dw,fechaped) as dia_sem FROM Pedidos FROM Pedidos

Marta Zorrilla

2009-2010

59

IMD XXII :: SELECT IMD XXII SELECT


Agrupamiento de datos (Ejemplo) Agrupamiento de datos (Ejemplo)

La clusula GROUP permite formar grupos con las filas de datos que La clusula GROUP permite formar grupos con las filas de datos que tengan valores iguales para determinados campos. tengan valores iguales para determinados campos. La respuesta tiene tantas filas como grupos haya establecido la La respuesta tiene tantas filas como grupos haya establecido la instruccin. instruccin.

Obtener el importe de cada pedido sin aplicar el IVA. SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe FROM Lineas FROM Lineas GROUP BY numped GROUP BY numped

Marta Zorrilla

2009-2010

60

IMD XXIII :: SELECT IMD XXIII SELECT


Agrupamiento de Datos. Cond. de agrupamiento Agrupamiento de Datos. Cond. de agrupamiento (Ejemplo) (Ejemplo)

Listar el importe, sin aplicar el IVA, de los pedidos que tienen ms de una lnea.

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe FROM Lineas FROM Lineas GROUP BY numped GROUP BY numped HAVING COUNT(*))> 1 HAVING COUNT(* > 1

Marta Zorrilla

2009-2010

61

IMD XXV :: SELECT IMD XXV SELECT


Ordenacin del Resultado (Ejemplo) Ordenacin del Resultado (Ejemplo)

[ORDER BY colum1 {{[ASC] | |DESC }}[, colum2 {{[ASC] | |DESC }, .... ] ]] ] [ORDER BY colum1 [ASC] DESC [, colum2 [ASC] DESC }, .... colum1, colum2, ...: son nombres de elementos (campos, expresiones colum1, colum2, ...: son nombres de elementos (campos, expresiones o funciones) de la lista de seleccin o la posicin que ocupan en ella. o funciones) de la lista de seleccin o la posicin que ocupan en ella. ASC: quiere decir ordenacin ascendente (opcin por defecto) yyDESC ASC: quiere decir ordenacin ascendente (opcin por defecto) DESC descendente. descendente. Listar los valores de los campos que componen el ndice de unicidad de la tabla Lineas (numped, numlin), por orden decreciente de n de pedido y de n de lnea. SELECT numped, numlin SELECT numped, numlin FROM Lineas FROM Lineas ORDER BY 1 DESC, 2 DESC ORDER BY 1 DESC, 2 DESC

Marta Zorrilla

2009-2010

65

IMD XXVI :: SELECT IMD XXVI SELECT


Guardar Resultado en una Tabla (Ejemplo) Guardar Resultado en una Tabla (Ejemplo)

INTO tabla_adicional INTO tabla_adicional tabla_adicional: es el nombre de la tabla a generar, que ha de ser tabla_adicional: es el nombre de la tabla a generar, que ha de ser nico. Esta tabla hereda el esquema de la lista de seleccin (nombres nico. Esta tabla hereda el esquema de la lista de seleccin (nombres campos, tipos de datos, ...). campos, tipos de datos, ...).

Crear una tabla temporal, llamada t1, para guardar el importe, sin aplicar el IVA, de los pedidos que tienen ms de una lnea. SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe INTO #t1 INTO #t1 FROM Lineas FROM Lineas GROUP BY numped GROUP BY numped HAVING COUNT(*) > 1 HAVING COUNT(*) > 1

Marta Zorrilla

2009-2010

66

IMD XXVII :: SELECT IMD XXVII SELECT


Unin de Sentencias (Ejemplo) Unin de Sentencias (Ejemplo)

Permite combinar los resultados de dos o ms consultas. Para ello se Permite combinar los resultados de dos o ms consultas. Para ello se requiere el operador UNION [ALL]. requiere el operador UNION [ALL].

Listar todos los proveedores de las tablas Proveedores y Proveedores_Anulados ordenados por su cdigo. SELECT codigpro, nombrpro, localpro SELECT codigpro, nombrpro, localpro FROM Proveedores FROM Proveedores UNION UNION SELECT codigp, nombrp, localp SELECT codigp, nombrp, localp FROM Proveedores_Anulados FROM Proveedores_Anulados ORDER BY 1 ORDER BY 1

Marta Zorrilla

2009-2010

67

IMD XXVIII: SELECT IMD XXVIII: SELECT


EXCEPT e INTERSECT de Sentencias (Ejemplo) EXCEPT e INTERSECT de Sentencias (Ejemplo)

EXCEPT Devuelve los valores distintos de la primera consulta que no EXCEPT Devuelve los valores distintos de la primera consulta que no son devueltos por la segunda consulta. son devueltos por la segunda consulta. INTERSECT Devuelve los distintos valores que son devueltos por INTERSECT Devuelve los distintos valores que son devueltos por ambas consultas. ambas consultas. Listar los clientes exceptuando aquellos que son tambin Proveedores. SELECT codigcli, nombrcli, localcli SELECT codigcli, nombrcli, localcli FROM clientes FROM clientes EXCEPT EXCEPT SELECT codigpro, nombrpro, localpro SELECT codigpro, nombrpro, localpro FROM Proveedores FROM Proveedores

Marta Zorrilla

2009-2010

68

IMD XXIX :: SELECT IMD XXIX SELECT


Uso de funciones (Ejemplo) Uso de funciones (Ejemplo)

Obtener el precio y la descripcin de los artculos haciendo uso de la funcin dame_precio_articulos(@codigo_art). SELECT codigart as Codigo, descrart as Descripcion, SELECT codigart as Codigo, descrart as Descripcion, dbo.dame_precio_articulo(codigart) as Precio dbo.dame_precio_articulo(codigart) as Precio FROM ARTICULOS FROM ARTICULOS

Obtener los artculos haciendo uso de la funcin dame_precio_articulos cuyo precio sea superior a 190 SELECT codigart as Codigo, descrart as Descripcion, preunart as Precio SELECT codigart as Codigo, descrart as Descripcion, preunart as Precio FROM ARTICULOS FROM ARTICULOS WHERE dbo.dame_precio_articulo(codigart) > 190 WHERE dbo.dame_precio_articulo(codigart) > 190

Marta Zorrilla

2009-2010

69

IMD XXX: INSERT con SELECT IMD XXX: INSERT con SELECT Incorporar a la tabla proveedores, los procedentes de la tabla temporal prov_tmp. Se considera que esta tabla tiene la misma estructura que la tabla proveedores. INSERT INTO proveedores INSERT INTO proveedores SELECT codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, SELECT codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro, procepro telefpro, faxpro, procepro FROM prov_tmp FROM prov_tmp

Marta Zorrilla

2009-2010

70

IMD XXXI: UPDATE, DELETE con SELECT IMD XXXI: UPDATE, DELETE con SELECT Actualizar los precios en un 2% de los artculos del grupo Bebidas. UPDATE articulo UPDATE articulo SET preunart = preunart **1.02 SET preunart = preunart 1.02 WHERE tipo_id IN WHERE tipo_id IN (SELECT tipo_id (SELECT tipo_id FROM TipoArticulo FROM TipoArticulo WHERE tipo_nombre = 'Bebidas') WHERE tipo_nombre = 'Bebidas') Borrar los pedidos de los proveedores no comunitarios DELETE FROM pedidos DELETE FROM pedidos FROM pedidos INNER JOIN FROM pedidos INNER JOIN proveedores ON proveedores.codigpro = pedidos.codigpro proveedores ON proveedores.codigpro = pedidos.codigpro WHERE procepro = 'No UE' WHERE procepro = 'No UE'
Marta Zorrilla 2009-2010 71

IMD XXXII: SELECT, UPDATE con CASE IMD XXXII: SELECT, UPDATE con CASE Listar los artculos mostrando su precio categorizado por alto, bajo y no establecido. SELECT precio' = SELECT precio' = CASE CASE WHEN preunart IS NULL THEN No establecido' WHEN preunart IS NULL THEN No establecido' WHEN preunart < 200 THEN Bajo WHEN preunart < 200 THEN Bajo ELSE Alto' ELSE Alto' END, END, descrart descrart FROM articulos FROM articulos Actualizar los artculos con precio < 10 con 5% y los > =10 con un 7% UPDATE articulos SET preunart= UPDATE articulos SET preunart= CASE CASE WHEN preunart <10 THEN preunart*1.05 WHEN preunart <10 THEN preunart*1.05 ELSE preunart*1.07 ELSE preunart*1.07 END END
Marta Zorrilla 2009-2010 72

Lenguaje de definicin de Lenguaje de definicin de datos datos SQL Server 2005 SQL Server 2005 (Parte 2) (Parte 2)

CREATE VIEW CREATE VIEW Para crear una vista en la base de datos. Su sintaxis es: CREATE VIEW [ [< nombreBD > . .] ][ [< propietario > . .] ]nombre [ [((campo [ [,...n ] ]))] ] CREATE VIEW < nombreBD > < propietario > nombre campo ,...n [ [WITH <view_attribute> [ [,...n ] ]] ] WITH <view_attribute> ,...n AS AS Instruccin_Select Instruccin_Select [ [WITH CHECK OPTION ] ] WITH CHECK OPTION
nombreBD: es el nombre de la base de datos en la que se crea. nombreBD: es el nombre de la base de datos en la que se crea. propietario: cuenta de usuario que crea la vista propietario: cuenta de usuario que crea la vista nombre: es el nombre de la vista que se va aacrear. nombre: es el nombre de la vista que se va crear. campo: es el nombre que se va aautilizar para una columna en una vista. campo: es el nombre que se va utilizar para una columna en una vista. instruccin_Select: consulta aatravs de la cul se define la vista instruccin_Select: consulta travs de la cul se define la vista view_attribute: toma uno de los siguientes valores view_attribute: toma uno de los siguientes valores
[ [ENCRYPTION ]:]:evita que la vista se publique como parte de la rplica de SQL Server ENCRYPTION evita que la vista se publique como parte de la rplica de SQL Server [ [SCHEMABINDING ]:]:enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica, las tablas base SCHEMABINDING enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica, las tablas base no se pueden modificar de una forma que afecte aala definicin de la vista. no se pueden modificar de una forma que afecte la definicin de la vista. [ [VIEW_METADATA ]:]:Especifica que la instancia de SQL Server devolver aalas API de DB-Library, ODBC yy VIEW_METADATA Especifica que la instancia de SQL Server devolver las API de DB-Library, ODBC OLE DB la informacin de metadatos sobre la vista en vez de las tablas base. OLE DB la informacin de metadatos sobre la vista en vez de las tablas base. [ [WITH CHECK OPTION ] ]: :Exige que todas las instrucciones de modificacin de datos ejecutadas contra la WITH CHECK OPTION Exige que todas las instrucciones de modificacin de datos ejecutadas contra la vista se adhieran aalos criterios establecidos en la instruccin Select. vista se adhieran los criterios establecidos en la instruccin Select. Marta Zorrilla 2009-2010 77

CREATE VIEW .. Ejemplo CREATE VIEW Ejemplo

CREATE VIEW dbo.EncabezadoPedido CREATE VIEW dbo.EncabezadoPedido AS AS SELECT dbo.Pedidos.numped, dbo.Pedidos.fechaped, dbo.Pedidos.codigpro, SELECT dbo.Pedidos.numped, dbo.Pedidos.fechaped, dbo.Pedidos.codigpro, dbo.Pedidos.ivaped, dbo.Pedidos.fentrped, dbo.Proveedores.nombrpro, dbo.Pedidos.ivaped, dbo.Pedidos.fentrped, dbo.Proveedores.nombrpro, dbo.Proveedores.direcpro, dbo.Proveedores.cpostpro, dbo.Proveedores.localpro, dbo.Proveedores.direcpro, dbo.Proveedores.cpostpro, dbo.Proveedores.localpro, dbo.Proveedores.telefpro, dbo.Proveedores.faxpro, dbo.Proveedores.telefpro, dbo.Proveedores.faxpro, dbo.Proveedores.procepro, dbo.Proveedores.emailpro, dbo.Proveedores.cifpro dbo.Proveedores.procepro, dbo.Proveedores.emailpro, dbo.Proveedores.cifpro FROM dbo.Proveedores INNER JOIN FROM dbo.Proveedores INNER JOIN dbo.Pedidos ON dbo.Proveedores.codigpro = dbo.Pedidos.codigpro dbo.Pedidos ON dbo.Proveedores.codigpro = dbo.Pedidos.codigpro

Marta Zorrilla

2009-2010

78

Vistas actualizables, vistas materializadas Vistas actualizables, vistas materializadas Vista actualizable si: Vista actualizable si: El SELECT no tiene ninguna expresin de valor agregado ni especificacin de El SELECT no tiene ninguna expresin de valor agregado ni especificacin de DISTINCT DISTINCT Cualquier atributo que no aparezca en la clusula SELECT puede definirse Cualquier atributo que no aparezca en la clusula SELECT puede definirse como nulo como nulo La consulta no tiene clusulas GROUP BY ni HAVING La consulta no tiene clusulas GROUP BY ni HAVING Cualquier modificacin, UPDATE, INSERT yyDELETE, debe hacer referencia Cualquier modificacin, UPDATE, INSERT DELETE, debe hacer referencia a las columnas de una nica tabla base a las columnas de una nica tabla base Las columnas que se van a modificar no se ven afectadas por las clusulas Las columnas que se van a modificar no se ven afectadas por las clusulas GROUP BY, HAVING o DISTINCT. GROUP BY, HAVING o DISTINCT. Vista materializada (Indexed views SCHEMABINDING )) Vista materializada (Indexed views SCHEMABINDING La vista es computada yyalmacenada. La vista es computada almacenada. Se crea al definir un ndice cluster sobre ella. Se crea al definir un ndice cluster sobre ella. Son adecuadas para consultas frecuentes sobre datos agregados sobre Son adecuadas para consultas frecuentes sobre datos agregados sobre muchas filas. muchas filas. No se aconsejan para datos que cambien frecuentemente. No se aconsejan para datos que cambien frecuentemente.
Marta Zorrilla 2009-2010 79

Vista materializable (ejemplo) Vista materializable (ejemplo)

CREATE VIEW UdsPedidas WITH SCHEMABINDING as CREATE VIEW UdsPedidas WITH SCHEMABINDING as SELECT A.descrart, sum(unilin) as unidadesPedidas, count_big(*) as nro_orden SELECT A.descrart, sum(unilin) as unidadesPedidas, count_big(*) as nro_orden FROM dbo.articulos as A inner join dbo.lineas as L on A.codigart=L.codigart FROM dbo.articulos as A inner join dbo.lineas as L on A.codigart=L.codigart GROUP BY A.descrart; GROUP BY A.descrart; CREATE UNIQUE CLUSTERED INDEX cix_MiVistaMaterializada CREATE UNIQUE CLUSTERED INDEX cix_MiVistaMaterializada ON dbo.UdsPedidas(descrart); ON dbo.UdsPedidas(descrart);

Marta Zorrilla

2009-2010

80

CREATE PROCEDURE CREATE PROCEDURE Para crear un procedimiento en la base de datos. Su sintaxis es: CREATE PROC [ [EDURE ] ]nombre CREATE PROC EDURE nombre [ [{{@parametros tipo_dato }} @parametros tipo_dato [ [= valor_por_defecto ] ][ [OUTPUT ] ] = valor_por_defecto OUTPUT ] ][ [,...n ] ] ,...n [ [WITH WITH {{RECOMPILE | |ENCRYPTION | |RECOMPILE , ,ENCRYPTION }}] ] RECOMPILE ENCRYPTION RECOMPILE ENCRYPTION [ [FOR REPLICATION ] ] FOR REPLICATION AS instrucciones_sql [ [...n ] ] AS instrucciones_sql ...n
nombre: es el nombre del procedimiento que se va aacrear. nombre: es el nombre del procedimiento que se va crear. parmetros: parmetros de entrada yysalida del procedimiento parmetros: parmetros de entrada salida del procedimiento tipo_dato: tipo de dato asociado al parmetro. tipo_dato: tipo de dato asociado al parmetro. valor_por_defecto: valor asignado por defecto al parmetro valor_por_defecto: valor asignado por defecto al parmetro instrucciones_sql: instrucciones SQL instrucciones_sql: instrucciones SQL

Marta Zorrilla

2009-2010

81

CREATE PROC. Ejemplo procedimiento sin parmetros CREATE PROC. Ejemplo procedimiento sin parmetros

CREATE PROCEDURE dameProveedores AS CREATE PROCEDURE dameProveedores AS SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro FROM Proveedores; FROM Proveedores; Go Go exec dameProveedores; exec dameProveedores;

Marta Zorrilla

2009-2010

82

CREATE PROC. Ejemplo 2. procedimiento con parmetros CREATE PROC. Ejemplo 2. procedimiento con parmetros
CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS BEGIN TRANSACTION BEGIN TRANSACTION update articulos set preunart = preunart + (preunart*@ipc/100) update articulos set preunart = preunart + (preunart*@ipc/100) where preunart is not null where preunart is not null if @@ERROR <> 00 if @@ERROR <> begin begin ROLLBACK TRANSACTION ROLLBACK TRANSACTION RAISERROR ( ('No se han modificado los precios,16,1) RAISERROR 'No se han modificado los precios,16,1) RETURN RETURN end end COMMIT TRANSACTION COMMIT TRANSACTION Go Go exec upd_precio_articulo 3.2 exec upd_precio_articulo 3.2

Marta Zorrilla

2009-2010

83

CREATE PROC. Ejemplo 2. procedimiento con parmetros. CONTROL DE ERRORES CREATE PROC. Ejemplo 2. procedimiento con parmetros. CONTROL DE ERRORES
CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS BEGIN TRY BEGIN TRY BEGIN TRANSACTION BEGIN TRANSACTION update articulos set preunart = preunart + (preunart*@ipc/100) update articulos set preunart = preunart + (preunart*@ipc/100) where preunart is not null where preunart is not null COMMIT TRANSACTION COMMIT TRANSACTION END TRY END TRY BEGIN CATCH BEGIN CATCH ROLLBACK TRANSACTION ROLLBACK TRANSACTION RAISERROR ( ('No se han modificado los precios,16,1) RAISERROR 'No se han modificado los precios,16,1) END CATCH END CATCH RETURN RETURN exec upd_precio_articulo 3.2 exec upd_precio_articulo 3.2

Marta Zorrilla

2009-2010

84

CREATE FUNCTION CREATE FUNCTION Para crear una funcin escalar en la base de datos. Se pueden usar en el SELECT. Su sintaxis es: CREATE FUNCTION [ [propietario. ] ]nombre CREATE FUNCTION propietario. nombre (([ [{{@parametro [AS] tipo_dato [ [= valor_por_defecto ] ]}}[ [,...n ] ]] ])) @parametro [AS] tipo_dato = valor_por_defecto ,...n RETURNS tipo_dato_valor_retorno RETURNS tipo_dato_valor_retorno AS AS BEGIN BEGIN --cuerpo de la funcin, TSQL --cuerpo de la funcin, TSQL RETURN valor_retorno RETURN valor_retorno END END
propietario: cuenta de usuario que crea la funcin propietario: cuenta de usuario que crea la funcin nombre: es el nombre de la funcin que se va aacrear. nombre: es el nombre de la funcin que se va crear. parmetro: parmetros de entrada de la funcin parmetro: parmetros de entrada de la funcin tipo_dato: tipo de dato asociado aacada parmetro tipo_dato: tipo de dato asociado cada parmetro valor_por_defecto: valor asignado por defecto al parmetro valor_por_defecto: valor asignado por defecto al parmetro tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno. tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno. valor_retorno: valor de retorno de la funcin valor_retorno: valor de retorno de la funcin
Marta Zorrilla 2009-2010 85

CREATE FUNCTION (2) CREATE FUNCTION (2) Para crear una funcin que devuelve una tabla en la base de datos. Se pueden usar en el SELECT Su sintaxis es: CREATE FUNCTION [ [propietario. ] ]nombre CREATE FUNCTION propietario. nombre (([ [{{@parametro [AS] tipo_dato [ [= valor_por_defecto ] ]}}[ [,...n ] ]] ])) @parametro [AS] tipo_dato = valor_por_defecto ,...n RETURNS @variable_retorno TABLE < definicion_tabla > RETURNS @variable_retorno TABLE < definicion_tabla > AS AS BEGIN BEGIN --cuerpo de la funcin, TSQL --cuerpo de la funcin, TSQL RETURN RETURN END END
propietario: cuenta de usuario que crea la funcin propietario: cuenta de usuario que crea la funcin nombre: es el nombre de la funcin que se va aacrear. nombre: es el nombre de la funcin que se va crear. parmetro: parmetros de entrada de la funcin parmetro: parmetros de entrada de la funcin tipo_dato: tipo de dato asociado aacada parmetro tipo_dato: tipo de dato asociado cada parmetro valor_por_defecto: valor asignado por defecto al parmetro valor_por_defecto: valor asignado por defecto al parmetro tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno. tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno. variable_retorno: variable de retorno de la funcin variable_retorno: variable de retorno de la funcin definicion_tabla: definicin de la tabla que devuelve la funcin definicion_tabla: definicin de la tabla que devuelve la funcin
2009-2010

Marta Zorrilla

86

CREATE FUNCTION. Ejemplo funcin escalar CREATE FUNCTION. Ejemplo funcin escalar CREATE FUNCTION Calcular_Pedido (@codigo int) CREATE FUNCTION Calcular_Pedido (@codigo int) RETURNS decimal (10,2) RETURNS decimal (10,2) AS AS BEGIN BEGIN DECLARE @precio money DECLARE @precio money DECLARE @iva float DECLARE @iva float SELECT @precio= sum(totallin) from lineas WHERE numped=@codigo SELECT @precio= sum(totallin) from lineas WHERE numped=@codigo SELECT @iva=ivaped from pedidos WHERE numped=@codigo SELECT @iva=ivaped from pedidos WHERE numped=@codigo SET @precio= (@precio* (@iva/100))+@precio SET @precio= (@precio* (@iva/100))+@precio RETURN @precio RETURN @precio END END GO GO -- Ejecucin -- Ejecucin SELECT dbo.Calcular_Pedido (1) SELECT dbo.Calcular_Pedido (1)
Marta Zorrilla 2009-2010 87

CREATE FUNCTION. Ejemplo tabla CREATE FUNCTION. Ejemplo tabla

CREATE FUNCTION PedidosPorProveedor (@codigo char(4)) CREATE FUNCTION PedidosPorProveedor (@codigo char(4)) RETURNS TABLE RETURNS TABLE AS AS RETURN (SELECT count(numped) numero, nombrpro RETURN (SELECT count(numped) numero, nombrpro FROM pedidos p, proveedores pr FROM pedidos p, proveedores pr WHERE pr.codigpro=@codigo and WHERE pr.codigpro=@codigo and p.codigpro = pr.codigpro p.codigpro = pr.codigpro GROUP BY nombrpro) GROUP BY nombrpro) GO GO -- Ejecucin -- Ejecucin SELECT **from dbo.PedidosPorProveedor(0010) SELECT from dbo.PedidosPorProveedor(0010)

Marta Zorrilla

2009-2010

88

CREATE FUNCTION. Ejemplo tabla CREATE FUNCTION. Ejemplo tabla

CREATE FUNCTION PendientePago (@fecha datetime) CREATE FUNCTION PendientePago (@fecha datetime) RETURNS @Pagos TABLE (numped int primary key, RETURNS @Pagos TABLE (numped int primary key, cantidad float NOT NULL, cantidad float NOT NULL, fechaped datetime) fechaped datetime) AS BEGIN AS BEGIN INSERT @Pagos INSERT @Pagos SELECT numped, dbo.calcular_pedido(numped), fechaped SELECT numped, dbo.calcular_pedido(numped), fechaped FROM pedidos FROM pedidos WHERE fecpago is null or fecpago>=@fecha WHERE fecpago is null or fecpago>=@fecha RETURN RETURN END END GO GO -- Ejecucin -- Ejecucin SELECT **from dbo.PendientePago(getdate()) SELECT from dbo.PendientePago(getdate())

Marta Zorrilla

2009-2010

89

BD Activas
Los triggers DML son procesos predefinidos que entran en accin en respuesta a eventos especficos de manipulacin de datos (insert, update, delete). Generalmente se utilizan para: recoger restricciones complejas automatizar procesos anotar acciones (log) En SQL Server 2005: - se pueden definir varios triggers para el mismo evento (definir orden de ejecucin sp_settriggerorder) - slo puede haber un trigger INSTEAD OF por tipo de operacin - crean tablas inserted y deleted - !Ojo en su programacin pueden afectar a una o varias filas se ejecutan transaccionalmente, si hay error se debe gestionar el ROLLBACK
Marta Zorrilla 2009-2010 90

BD Activas (y 2)

Tambin hay triggers DDL, que entran en accin en respuesta a eventos de definicin (ALTER, CREATE, DROP) Se utilizan para tareas administrativas como auditar y regular operaciones de BD ( evitar / registrar cambios en el schema, exigir reglas en la definicin del schema,..) En SQL Server 2005: -No crean tablas inserted y deleted -No hay desencadenador INSTEAD OF -Trabajar con funcin EVENTDATA (Devuelve informacin acerca de los eventos de base de datos o servidor)

Marta Zorrilla

2009-2010

91

CREATE TRIGGER DML CREATE TRIGGER DML Para crear un desencadenador en una tabla de la base de datos. Su sintaxis es: CREATE TRIGGER nombre CREATE TRIGGER nombre ON {{tabla | |vista }} ON tabla vista {{ {{{{FOR | |AFTER | |INSTEAD OF }}{{[ [INSERT ] ][ [, ,] ][ [UPDATE ] ][ [, ,] ][ [DELETE ] ]}} FOR AFTER INSTEAD OF INSERT UPDATE DELETE [ [NOT FOR REPLICATION ] ] NOT FOR REPLICATION AS AS [ [{{IF UPDATE ((campo )) IF UPDATE campo [ [{{AND | |OR }}UPDATE (campo ))] ] AND OR UPDATE (campo [ [...n ] ] ...n }}] ] instrucciones_sql [ [...n ] ] instrucciones_sql ...n }} }}
nombre: es el nombre del desencadenador que se va aacrear. nombre: es el nombre del desencadenador que se va crear. tabla/vista: es el nombre de una tabla/vista sobre la que se crea. tabla/vista: es el nombre de una tabla/vista sobre la que se crea. campo: campo de la tabla oovista afectada por el desencadenador . . campo: campo de la tabla vista afectada por el desencadenador instrucciones_sql: reglas de negocio que se requieren especificar por medio de SQL instrucciones_sql: reglas de negocio que se requieren especificar por medio de SQL
Marta Zorrilla 2009-2010 92

CREATE TRIGGER (Ej. 1). CREATE TRIGGER (Ej. 1).

No pedir un artculo descatalogado

CREATE TRIGGER tr_lineas ON dbo.Lineas AFTER INSERT, UPDATE CREATE TRIGGER tr_lineas ON dbo.Lineas AFTER INSERT, UPDATE AS BEGIN AS BEGIN DECLARE @valor int DECLARE @valor int DECLARE @errmsg char(255) DECLARE @errmsg char(255) SELECT @valor=count(*) FROM inserted SELECT @valor=count(*) FROM inserted WHERE dbo.ArticuloDescatalogado(codigart)!=0 WHERE dbo.ArticuloDescatalogado(codigart)!=0 IF (@valor) > 00begin IF (@valor) > begin set @errmsg = 'No puede seleccionar un artculo descatalogado' set @errmsg = 'No puede seleccionar un artculo descatalogado' RAISERROR ( ( @errmsg,16,1) RAISERROR @errmsg,16,1) ROLLBACK TRANSACTION ROLLBACK TRANSACTION RETURN RETURN END END END END

Marta Zorrilla

2009-2010

93

CREATE TRIGGER. Ej. 2 CREATE TRIGGER. Ej. 2


CREATE TRIGGER tr_articulos ON articulos CREATE TRIGGER tr_articulos ON articulos FOR UPDATE FOR UPDATE AS BEGIN AS BEGIN ififupdate(stockart) BEGIN update(stockart) BEGIN DECLARE @v_codigart char(6) DECLARE @v_codigart char(6) DECLARE @v_texto varchar(200) DECLARE @v_texto varchar(200)

Notificar si el stock alcanza el mnimo establecido

DECLARE @cursor_insert CURSOR DECLARE @cursor_insert CURSOR SET @cursor_insert ==CURSOR FOR SET @cursor_insert CURSOR FOR SELECT codigart FROM inserted SELECT codigart FROM inserted WHERE stockart<=stockmin WHERE stockart<=stockmin OPEN @cursor_insert OPEN @cursor_insert FETCH NEXT FROM @cursor_insert INTO @v_codigart FETCH NEXT FROM @cursor_insert INTO @v_codigart WHILE @@FETCH_STATUS=0 WHILE @@FETCH_STATUS=0 BEGIN BEGIN set @v_texto='Stock minimo alcanzado en articulo ' '++@v_codigart set @v_texto='Stock minimo alcanzado en articulo @v_codigart insert into eventos (fecha, motivo) values (getdate(), @v_texto) insert into eventos (fecha, motivo) values (getdate(), @v_texto) FETCH NEXT FROM @cursor_insert INTO @v_codigart FETCH NEXT FROM @cursor_insert INTO @v_codigart END END END END CLOSE @cursor_insert CLOSE @cursor_insert DEALLOCATE @cursor_insert DEALLOCATE @cursor_insert END END

Marta Zorrilla

2009-2010

94

CREATE TRIGGER. Ej. 3 CREATE TRIGGER. Ej. 3


CREATE TRIGGER tr_articulos ON articulos CREATE TRIGGER tr_articulos ON articulos FOR UPDATE FOR UPDATE AS BEGIN AS BEGIN ififUPDATE(stockart) BEGIN UPDATE(stockart) BEGIN

Notificar si el stock alcanza el mnimo establecido

INSERT INTO eventos (fecha, motivo) INSERT INTO eventos (fecha, motivo) SELECT getdate(), 'Stock minimo alcanzado ' '++codigart FROM inserted SELECT getdate(), 'Stock minimo alcanzado codigart FROM inserted WHERE stockart<=stockmin WHERE stockart<=stockmin END END END END

Mejor evitar el uso de cursores !!! Cdigo ms eficiente trabaja el motor de almacenamiento y el optimizador para el conjunto de filas y no para cada una

Marta Zorrilla

2009-2010

95

CREATE TRIGGER. Ej. 4 CREATE TRIGGER. Ej. 4

Realizar borrados lgicos

CREATE TRIGGER trd_MiTabla on MiTabla CREATE TRIGGER trd_MiTabla on MiTabla INSTEAD OF DELETE INSTEAD OF DELETE AS AS IF @@ROWCOUNT = 0 IF @@ROWCOUNT = 0 RETURN RETURN UPDATE MiTabla SET col_borrada = S' UPDATE MiTabla SET col_borrada = S' FROM MiTabla JOIN deleted d ON d.PK_ID = MiTabla.PK_ID FROM MiTabla JOIN deleted d ON d.PK_ID = MiTabla.PK_ID

Marta Zorrilla

2009-2010

96

CREATE TRIGGER. Ej. 5 CREATE TRIGGER. Ej. 5

Insertar datos a travs de una vista que incluye informacin de dos tablas

CREATE TRIGGER tri_rellena ON VistaCompleta CREATE TRIGGER tri_rellena ON VistaCompleta INSTEAD OF INSERT AS INSTEAD OF INSERT AS IF @@ROWCOUNT = 0 IF @@ROWCOUNT = 0 RETURN RETURN INSERT EmpleadoDatos INSERT EmpleadoDatos SELECT EmpleadoID, Tfno SELECT EmpleadoID, Tfno FROM inserted FROM inserted INSERT EmpleadoDireccion INSERT EmpleadoDireccion SELECT EmpleadoID, Direccion, Ciudad SELECT EmpleadoID, Direccion, Ciudad FROM inserted FROM inserted go go

Marta Zorrilla

2009-2010

97

Triggers, procedimientos y funciones Triggers, procedimientos y funciones


APLICACIONES: APLICACIONES: Implementacin de reglas de integridad complejas Implementacin de reglas de integridad complejas Gestin de Log (auditora, control de cambios) Gestin de Log (auditora, control de cambios) Flujos de trabajo o proceso (actualizaciones, datos derivados, tablas resumen, Flujos de trabajo o proceso (actualizaciones, datos derivados, tablas resumen, etc.) etc.) VENTAJAS Semntica del problema en un solo sitio integridad Facilita la construccin de aplicaciones Procedimientos y funciones almacenados - lgica de negocio compartida por aplicaciones - reutilizacin de cdigo - seguridad de acceso a los usuarios - reduccin del trfico de red - mantenimiento ms sencillo INCONVENIENTES Deben escribirse con cuidado ejecucin infinita de disparos Control complejo de condiciones Mayor carga computacional del servidor
Marta Zorrilla 2009-2010 102

DROP DROP Para eliminar objetos que existan en la base de datos. Su sintaxis es:

DROP {{TABLE nombre | | DROP TABLE nombre INDEX nombre | | INDEX nombre VIEW nombre | | VIEW nombre TRIGGER nombre | | TRIGGER nombre RULE nombre | | RULE nombre DATABASE nombre | | DATABASE nombre PROCEDURE nombre | | PROCEDURE nombre FUNCTION nombre | | FUNCTION nombre .... Otros objetos .. }} .... Otros objetos ..

nombre: es el nombre del objeto que se va aaeliminar. nombre: es el nombre del objeto que se va eliminar.

Marta Zorrilla

2009-2010

103

Diseo fsico Diseo fsico

Objetivos
Satisfacer los requisitos del sistema optimizando la Satisfacer los requisitos del sistema optimizando la relacin coste/beneficio. relacin coste/beneficio. Se ha de tener en cuenta las caractersticas del Se ha de tener en cuenta las caractersticas del gestor, del SO y del hardware. gestor, del SO y del hardware. Esto se concreta en los siguientes objetivos: Esto se concreta en los siguientes objetivos:
Disminuir los tiempos de respuesta, Disminuir los tiempos de respuesta, Minimizar el espacio de almacenamiento, Minimizar el espacio de almacenamiento, Evitar las reorganizaciones peridicas, Evitar las reorganizaciones peridicas, Proporcionar la mxima seguridad, y Proporcionar la mxima seguridad, y Optimizar el consumo de recursos. Optimizar el consumo de recursos.

Marta Zorrilla

2009-2010

105

Entradas y salidas de la fase de diseo fsico


Las entradas de esta etapa son: Las entradas de esta etapa son:
Lista de objetivos de diseo fsico con sus correspondientes prioridades Lista de objetivos de diseo fsico con sus correspondientes prioridades yy cuantificacin (a ser posible); cuantificacin (a ser posible); Esquema lgico especfico; Esquema lgico especfico; Recursos de mquina disponibles; Recursos de mquina disponibles; Recursos de software disponibles (sistema operativo, middleware, ...); Recursos de software disponibles (sistema operativo, middleware, ...); Informacin sobre las aplicaciones que utilizarn la BD con objeto de Informacin sobre las aplicaciones que utilizarn la BD con objeto de optimizar el tiempo de respuesta. optimizar el tiempo de respuesta. Polticas de seguridad de datos. Polticas de seguridad de datos. Estructura interna (esquema interno, generalmente solo accesible a travs Estructura interna (esquema interno, generalmente solo accesible a travs de parmetros de sintonizacin); de parmetros de sintonizacin); Especificaciones para el sintonizado (tunning) de la BD; Especificaciones para el sintonizado (tunning) de la BD; yy Normas de seguridad. Normas de seguridad.

A partir de estas entradas, se producirn las siguientes salidas: A partir de estas entradas, se producirn las siguientes salidas:

Marta Zorrilla

2009-2010

106

Consideraciones
Algunas de las cuestiones a considerar en el diseo fsico son: Algunas de las cuestiones a considerar en el diseo fsico son:
Asignacin de tablas a particiones y/o a dispositivos fsicos (create Asignacin de tablas a particiones y/o a dispositivos fsicos (create database, create table). database, create table). Determinacin de ndices (cluster, nicos, no cluster, etc.); Determinacin de ndices (cluster, nicos, no cluster, etc.); Desnormalizacin redundancia de datos. Desnormalizacin yyredundancia de datos. Optimizacin de consultas, funciones, disparadores, Optimizacin de consultas, funciones, disparadores,
Actualizacin de estadsticas update statistics). (update statistics update statistics). Actualizacin de estadsticas (update statistics Reorganizacin reconstruccin de ndices. Reorganizacin yyreconstruccin de ndices. Reorganizacin de datos en ficheros. Reorganizacin de datos en ficheros.

Definicin de tamaos de memorias intermedias Buffers) Definicin de tamaos de memorias intermedias ((Buffers) Especificacin de bloqueos (transacciones) Especificacin de bloqueos (transacciones)

NO existe un modelo formal general para el diseo fsico, sino que NO existe un modelo formal general para el diseo fsico, sino que depende mucho de cada producto comercial concreto. depende mucho de cada producto comercial concreto.

Marta Zorrilla

2009-2010

107

Seguridad en SQL Server Seguridad en SQL Server 2005 2005

Tabla de contenidos
Modelo de Seguridad en SQL Server Modelo de Seguridad en SQL Server Inicios de Sesin -- Usuarios Inicios de Sesin Usuarios Esquemas de Base de Datos Esquemas de Base de Datos Usuarios de Base de Datos Usuarios de Base de Datos Contexto de Ejecucin Contexto de Ejecucin Permisos a sentencias y objetos Permisos a sentencias y objetos

Marta Zorrilla

2009-2010

109

Modelo de Seguridad en SQL Server


Solicitud de conexin de Red Conexin con el Servidor de SQL Server Solicitud de Inicio de Sesin en SQL Server Establecer Credenciales de Inicio de Sesin Cambio a una BBDD y autorizacin de acceso Establecer un Contexto de Base de Datos Intento de realizar alguna accin Verificar Permisos para las acciones

Marta Zorrilla

2009-2010

110

Jerarqua de Seguridad

Marta Zorrilla

2009-2010

111

Inicios de sesin - Usuarios


Modo de autentificacin (acceso al servidor) (Inicio de sesin: Login) Windows (S.O.) Servidor SQL Server Acceso y gestin de una BD (autorizacin: User) Permisos a objetos de BD ejecucin de sentencias Permisos a travs de roles: del servidor o de BD definidos por el usuario

Marta Zorrilla

2009-2010

112

Inicios de sesin preestablecidos

Marta Zorrilla

2009-2010

113

Tipos de Inicios de sesin


Windows
Usuario Grupo

SQL Server Certificado o Clave Asimtrica Asociados a Credenciales


Para acceso a recursos externos CREATE CREDENTIAL

Marta Zorrilla

2009-2010

114

Tipos de Inicios de sesin (y 2)


Opciones de Administracin
Podemos forzar el cambio de contrasea en el primer inicio de sesin: MUST_CHANGE Exigir directivas de contrasea Desbloquear Cuentas: UNLOCK Deshabilitar un inicio de sesin: DISABLE BD de conexin predeterminada

Marta Zorrilla

2009-2010

115

Crear Inicios de sesin (y 3)


Grficamente SSMS CREATE LOGIN
CREATE LOGIN Pepe WITH PASSWORD = Passwd' MUST_CHANGE CREATE LOGIN [UNICAN\pepe] FROM WINDOWS

sys.server_principals sys.sql_logins DROP LOGIN / ALTER LOGIN

Marta Zorrilla

2009-2010

116

Roles fijos de Servidor

Marta Zorrilla

2009-2010

117

ROLES FIJOS DE SERVIDOR

sp_addsrvrolemember /sp_dropsrvrolemember sys.server_role_members sp_srvrolepermission sys.server_permissions


Marta Zorrilla 2009-2010 118

Esquemas
ANSI SQL-92:
Coleccin de objetos de la BBDD cuyo propietario es un nico principal y forma un nico espacio de nombres Espacio de nombres: es un conjunto de objetos que no pueden tener nombres duplicados

servidor.basededatos.esquema.objeto Los objetos ahora pertenecen al esquema de forma independiente al usuario Beneficios El borrado de un usuario no requiere que tengamos que renombrar los objetos Resolucin de nombres uniforme Gestin de permisos a nivel de esquema
Marta Zorrilla 2009-2010 119

Seguridad de base de datos

Marta Zorrilla

2009-2010

120

Conceder acceso a una BD

Marta Zorrilla

2009-2010

121

ROLES FIJOS DE BASE DE DATOS

Marta Zorrilla

2009-2010

122

Roles definidos por el usuario

Marta Zorrilla

2009-2010

123

Definir usuario del Gestor Definir usuario del Gestor

Marta Zorrilla

2009-2010

124

Usuarios de Base de Datos


Crear un Usuario
CREATE USER <usuario> FOR LOGIN <login> WITH DEFAULT_SCHEMA = <schema> Podemos crear un usuario sin asociar: WITHOUT LOGIN

Modificar
ALTER USER

Eliminar
DROP USER No si es propietario de objetos

Invitado
GRANT CONNECT TO GUEST

sys.database_principals
Marta Zorrilla 2009-2010 125

Roles de Base de Datos


CREATE ROLE <nombre> sp_addrolemember <role>,<usuario> sys.database_role_members Rol Public

126 Marta Zorrilla 2009-2010 126

Definir role de BD Definir role de BD

Rol de aplicacin. Un usuario que se conecta a travs de una aplicacin que habilita el rol de aplicacin, pierde todos sus privilegios, disponiendo exclusivamente los que le ofrece este rol. Permite establecer un nivel alto de seguridad, impidiendo el acceso va ODBC, OLEDB.

Marta Zorrilla

2009-2010

127

El Contexto de Ejecucin
Representado por dos testigos de seguridad:
Inicio de Sesin y Usuario Existen tantos testigos de usuario como bases de datos acceda el usuario sys.login_token / sys.user_token

Cambio del Contexto


til para la definicin de conjuntos de permisos personalizados EXECUTE AS SETUSER (descatalogado)
128 Marta Zorrilla 2009-2010 128

El Contexto de Ejecucin (ej.)


USE Sales GO CREATE PROCEDURE dbo.usp_Demo WITH EXECUTE AS 'CompanyDomain\SqlUser1' AS SELECT user_name() GO

129 Marta Zorrilla 2009-2010 129

Permisos a sentencias Permisos a sentencias Para otorgar permisos a acciones. Su sintaxis es:

GRANT {{ALL | |instruccin [ [,...n ] ]}} GRANT ALL instruccin ,...n TO {usuario [ [,...n ] ] | | role [ [,...n ] ]}} TO {usuario ,...n role ,...n

instruccin (entre otras): instruccin (entre otras): CREATE {{DATABASE | |DEFAULT | |FUNCTION CREATE DATABASE DEFAULT FUNCTION | |PROCEDURE | |RULE | |TABLE | |VIEW }} PROCEDURE RULE TABLE VIEW ALTER {{DATABASE | |DEFAULT | |FUNCTION ALTER DATABASE DEFAULT FUNCTION | |PROCEDURE | |RULE | |TABLE | |VIEW }} PROCEDURE RULE TABLE VIEW BACKUP DATABASE BACKUP DATABASE BACKUP LOG BACKUP LOG

Marta Zorrilla

2009-2010

130

Permisos a objetos Permisos a objetos Para otorgar permisos a objetos de la BD. Concede y quita permisos, inicialmente, el propietario de la BD. Su sintaxis es: GRANT GRANT {{ALL [ [PRIVILEGES ] ]| |permiso [ [,...n ] ]}} ALL PRIVILEGES permiso ,...n {{ [ [((columna [ [,...n ] ]))] ]ON {{tabla | |vista }} columna ,...n ON tabla vista | |ON {{tabla | |vista }}[ [((columna [ [,...n ] ]))] ] ON tabla vista columna ,...n | |ON {{procedimiento | |procedimiento_extendido }} ON procedimiento procedimiento_extendido | |ON {{funcin} ON funcin} }} TO {usuario [ [,...n ] ] | | role [ [,...n ] ]}} TO {usuario ,...n role ,...n [ [WITH GRANT OPTION ] ] WITH GRANT OPTION [ [AS {{usuario | |role }}] ] AS usuario role
permiso (entre otros): SELECT, INSERT, DELETE, UPDATE, EXECUTE. permiso (entre otros): SELECT, INSERT, DELETE, UPDATE, EXECUTE. WITH GRANT OPTION: el usuario al que se le otorga permiso, puede aa WITH GRANT OPTION: el usuario al que se le otorga permiso, puede su vez, otorgrselo aaotro. su vez, otorgrselo otro. AS : :usuario oorole que establece el permiso AS usuario role que establece el permiso

Marta Zorrilla

2009-2010

131

Ejemplos GRANT Ejemplos GRANT

Permitir a los usuarios Maria, Juan y Marta crear bases de datos y tablas GRANT CREATE DATABASE, CREATE TABLE GRANT CREATE DATABASE, CREATE TABLE TO Maria, Juan, [Servidor\Marta] TO Maria, Juan, [Servidor\Marta]

Permitir a Mara y a Juan, insertar, modificar y borrar en la tabla autores. GRANT INSERT, UPDATE, DELETE ON autores GRANT INSERT, UPDATE, DELETE ON autores TO Maria, Juan TO Maria, Juan

Permitir a Mara actualizar el importe del prstamo. GRANT UPDATE( importe ))ON prestamo GRANT UPDATE( importe ON prestamo TO Maria TO Maria
Marta Zorrilla 2009-2010 132

REVOKE (1) REVOKE (1) Para denegar permisos a acciones. Su sintaxis es:

REVOKE {{ALL | |instruccin [ [,...n ] ]}} REVOKE ALL instruccin ,...n FROM {usuario [ [,...n ] ] | | role [ [,...n ] ]}} FROM {usuario ,...n role ,...n

INSTRUCCIN (entre otras): INSTRUCCIN (entre otras): CREATE {{DATABASE | |DEFAULT | |FUNCTION CREATE DATABASE DEFAULT FUNCTION | |PROCEDURE | |RULE | |TABLE VIEW }} PROCEDURE RULE TABLE VIEW ALTER {{DATABASE | |DEFAULT | |FUNCTION ALTER DATABASE DEFAULT FUNCTION | |PROCEDURE | |RULE | |TABLE | |VIEW }} PROCEDURE RULE TABLE VIEW BACKUP DATABASE BACKUP DATABASE BACKUP LOG BACKUP LOG

Marta Zorrilla

2009-2010

133

REVOKE (2) REVOKE (2) Para quitar permisos. Su sintaxis es:

REVOKE [ [GRANT OPTION FOR ] ] REVOKE GRANT OPTION FOR {{ALL [ [PRIVILEGES ] ]| |permiso [ [,...n ] ]}} ALL PRIVILEGES permiso ,...n {{ [ [((columna [ [,...n ] ]))] ]ON {{tabla | |vista }} columna ,...n ON tabla vista | |ON {{tabla | |vista }}[ [((columna [ [,...n ] ]))] ] ON tabla vista columna ,...n | |ON {{procedimiento | |procedimiento_extendido }} ON procedimiento procedimiento_extendido | |ON {{funcin} ON funcin} }} {{TO | |FROM }} TO FROM {usuario [ [,...n ] ] | | role [ [,...n ] ]}} {usuario ,...n role ,...n [ [CASCADE ] ] CASCADE [ [AS {{usuario | |role }}] ] AS usuario role
GRANT OPTION FOR : :se quita al usuario la GRANT OPTION FOR se quita al usuario la capacidad de dar ooquitar permisos que le fueron capacidad de dar quitar permisos que le fueron concedidos por la clusula WITH GRANT OPTION concedidos por la clusula WITH GRANT OPTION permiso: SELECT, INSERT, DELETE, UPDATE, permiso: SELECT, INSERT, DELETE, UPDATE, REFERENCES, EXECUTE, CREATE, etc. REFERENCES, EXECUTE, CREATE, etc. CASCADE : :se quita el permiso al usuario/role yyaalos CASCADE se quita el permiso al usuario/role los usuarios/roles aa los que dio permiso, si se le concedi usuarios/roles los que dio permiso, si se le concedi GRANT OPTION. GRANT OPTION. AS : :usuario oorole que quita el permiso AS usuario role que quita el permiso
Marta Zorrilla 2009-2010 134

Ejemplos REVOKE Ejemplos REVOKE

Impedir a los usuarios Maria y Marta crear vistas en la BD activa.

REVOKE CREATE VIEW REVOKE CREATE VIEW TO Maria, [Servidor\Marta] TO Maria, [Servidor\Marta] Impedir que Mara ejecute la funcin dameprecio.

REVOKE SELECT ON dbo.dameprecio REVOKE SELECT ON dbo.dameprecio TO Maria TO Maria

Marta Zorrilla

2009-2010

135

Permisos efectivos

Marta Zorrilla

2009-2010

136

A tener en cuenta
SQL Server establece el rol PUBLIC a todos los usuarios de la

BD. Para aquellos usuarios que no tienen cuenta en la BD, pero s acceso al gestor, pueden conectarse a la BD como GUEST, si este usuario est habilitado en ella (GRANT CONNECT TO GUEST). Se ha de tener cuidado respecto a la manera en que se establecen las autorizaciones, si se quiere garantizar que luego se puedan quitar.
U1 U5 Admon U2 U3
Marta Zorrilla 2009-2010 137

U4

Limitaciones de seguridad
No se puede establecer privilegios a nivel de fila (p. ej. cada alumno slo vea sus notas) Hay extensiones para proporcionar control de acceso en el nivel de las filas y para trabajar con gran nmero de usuarios pero an no estn normalizadas. Utilizar vistas para restringir la informacin. Establecer la seguridad en aplicaciones de BD: - Usuarios Usuarios de domino / de gestor con sus privilegios Usuarios de dominio / de gestor con rol de aplicacin Usuario nico con privilegios - Crear BD de seguridad donde se establece con detalle las acciones que cada usuario de aplicacin puede hacer Cdigo de aplicacin se entremezcla con el de autorizacin Ms difcil de garantizar la existencia de agujeros de seguridad
Marta Zorrilla 2009-2010 138

Estrategias de seguridad

Marta Zorrilla

2009-2010

139

Estrategias de seguridad (y 2)

Marta Zorrilla

2009-2010

140

S-ar putea să vă placă și