Beruflich Dokumente
Kultur Dokumente
Marta E. Zorrilla
Dpto. de Matemticas, Estadstica y Computacin
Universidad de Cantabria
Marta Zorrilla
2009-2010
Introduccin Introduccin
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
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
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 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.
Marta Zorrilla
2009-2010
27
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
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]
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
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'
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
Marta Zorrilla
2009-2010
42
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
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
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
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
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
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
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
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
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
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
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
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
Marta Zorrilla
2009-2010
54
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
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
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
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
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
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
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
[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
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
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
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
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 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
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 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 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 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
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
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 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
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
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
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
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
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
Marta Zorrilla
2009-2010
110
Jerarqua de Seguridad
Marta Zorrilla
2009-2010
111
Marta Zorrilla
2009-2010
112
Marta Zorrilla
2009-2010
113
Marta Zorrilla
2009-2010
114
Marta Zorrilla
2009-2010
115
Marta Zorrilla
2009-2010
116
Marta Zorrilla
2009-2010
117
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
Marta Zorrilla
2009-2010
120
Marta Zorrilla
2009-2010
121
Marta Zorrilla
2009-2010
122
Marta Zorrilla
2009-2010
123
Marta Zorrilla
2009-2010
124
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
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
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
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 [ [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
REVOKE CREATE VIEW REVOKE CREATE VIEW TO Maria, [Servidor\Marta] TO Maria, [Servidor\Marta] Impedir que Mara ejecute la funcin dameprecio.
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