03- Ldd y Lmd - SQL Server

116
Marta Zorrilla 2009-2010 1 Marta E. Zorrilla Dpto. de Matemáticas, Estadística y Computación Universidad de Cantabria Lenguaje SQL SQL Server 2005 Lenguaje SQL SQL Server 2005

Transcript of 03- Ldd y Lmd - SQL Server

Page 1: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 1

Marta E. Zorrilla

Dpto. de Matemáticas, Estadística y Computación

Universidad de Cantabria

Lenguaje SQL SQL Server 2005Lenguaje SQL SQL Server 2005

Page 2: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 3

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

Lenguaje declarativo de acceso a los datos.

Estándar 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 investigación 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.

IntroducciónIntroducciIntroduccióónn

En la actualidad, se trabaja con el SQL:1999 y SQL:2003

Page 3: 03- Ldd y Lmd - SQL Server

Lenguaje de definición de datos

SQL Server 2005(Parte 1)

Lenguaje de definiciLenguaje de definicióón de n de datosdatos

SQL Server 2005SQL Server 2005(Parte 1)(Parte 1)

Page 4: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 7

Instrucciones de Definición de Datos (IDD) Instrucciones de DefiniciInstrucciones de Definicióón de Datos (IDD) n 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”

Cláusula CONSTRAINT

Page 5: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 8

IDD: CREATE DATABASEIDD: CREATE DATABASEIDD: CREATE DATABASE

Para crear una base de datos. Su sintaxis es:

CREATE DATABASE nombreBD

[ ON

[ < fichero > [ ,...n ] ] [ , < grupo_fichero > [ ,...n ] ]

]

[ LOG ON { < fichero > [ ,...n ] } ]

[ COLLATE collation_name ]

[ FOR LOAD | FOR ATTACH ]

< fichero > ::=

[ PRIMARY ]

( [ NAME = logical_file_name , ] FILENAME = 'os_file_name'

[ , SIZE = size ]

[ , MAXSIZE = { max_size | UNLIMITED } ] [ , FILEGROWTH = growth_increment ] ) [ ,...n ]

< grupo_fichero > ::=

FILEGROUP filegroup_name < fichero > [ ,...n ]

CREATE DATABASE nombreBD

[ ON

[ < fichero > [ ,...n ] ] [ , < grupo_fichero > [ ,...n ] ]

]

[ LOG ON { < fichero > [ ,...n ] } ] [ COLLATE collation_name ]

[ FOR LOAD | FOR ATTACH ]

< fichero > ::=

[ PRIMARY ]

( [ NAME = logical_file_name , ] FILENAME = 'os_file_name'

[ , SIZE = size ]

[ , MAXSIZE = { max_size | UNLIMITED } ]

[ , FILEGROWTH = growth_increment ] ) [ ,...n ]

< grupo_fichero > ::=

FILEGROUP filegroup_name < fichero > [ ,...n ]

nombreBD: es el nombre de la BD que se va a crear.

collation_name: mapa de caracteres

logical_file_name : nombre lógico del fichero.

os_file_name : nombre físico del fichero.

size: es el tamaño del fichero.

max_size: es el tamaño máximo del fichero.

growth_increment : incremento del fichero.

filegroup_name: nombre grupo de archivos

nombreBD: es el nombre de la BD que se va a crear.

collation_name: mapa de caracteres

logical_file_name : nombre lógico del fichero.

os_file_name : nombre físico del fichero.

size: es el tamaño del fichero.

max_size: es el tamaño máximo del fichero.

growth_increment : incremento del fichero.

filegroup_name: nombre grupo de archivos

Page 6: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 9

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

CREATE DATABASE [compras]

ON (NAME = N'compras',

FILENAME = N'C:\data\compras.mdf' ,

SIZE = 2, MAXSIZE = 3000,FILEGROWTH = 10%)

LOG ON (NAME = N'compras_log',

FILENAME = N'C:\data\compras_log.LDF' ,

SIZE = 1, FILEGROWTH = 10%)

COLLATE Modern_Spanish_CI_AS

CREATE DATABASE [compras]

ON (NAME = N'compras',

FILENAME = N'C:\data\compras.mdf' ,

SIZE = 2, MAXSIZE = 3000,FILEGROWTH = 10%)

LOG ON (NAME = N'compras_log',

FILENAME = N'C:\data\compras_log.LDF' ,

SIZE = 1, FILEGROWTH = 10%)

COLLATE Modern_Spanish_CI_AS

Page 7: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 16

IDD: CREATE TABLEIDD: CREATE TABLEIDD: CREATE TABLE

Para incorporar una tabla nueva a la base de datos. Su sintaxis es:

CREATE TABLE [ nombreDB.[ esquema ] . | esquema. ] tabla

(campo1 tipo [(tamaño)] [NOT NULL] [restricción_un_campo1 [ ... ] ][, campo2 tipo [(tamaño)] [NOT NULL] [restricción_un_campo2 [ ... ] ][, ...]][, restricción_varios_campos [, ...] ] )

[ ON { grupo_fichero | DEFAULT } ] [ TEXTIMAGE_ON { grupo_fichero | DEFAULT } ]

CREATE TABLE [ nombreDB.[ esquema ] . | esquema. ] tabla

(campo1 tipo [(tamaño)] [NOT NULL] [restricción_un_campo1 [ ... ] ][, campo2 tipo [(tamaño)] [NOT NULL] [restricción_un_campo2 [ ... ] ][, ...]][, restricción_varios_campos [, ...] ] )

[ ON { grupo_fichero | DEFAULT } ] [ TEXTIMAGE_ON { grupo_fichero | DEFAULT } ]

tabla: es el nombre de la tabla que se va a crear.

campo1, campo2: son nombres de campos. Debe crearse al menos un campo.

tipo: es el tipo de dato asociado al campo.

tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).

restricción_un_campo1, restricción_un_campo2: son cláusulas CONSTRAINT que afectan a un único campo.

restricción_varios_campos: es una cláusula CONSTRAINT que define un índice de múltiples campos.

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 e image.

tabla: es el nombre de la tabla que se va a crear.

campo1, campo2: son nombres de campos. Debe crearse al menos un campo.

tipo: es el tipo de dato asociado al campo.

tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).

restricción_un_campo1, restricción_un_campo2: son cláusulas CONSTRAINT que afectan a un único campo.

restricción_varios_campos: es una cláusula CONSTRAINT que define un índice de múltiples campos.

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 e image.

Page 8: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 17

IDD: ALTER TABLEIDD: ALTER TABLEIDD: ALTER TABLE

Para modificar el diseño de una tabla que ya existe en la base de datos. Su sintaxis es:

ALTER TABLE tabla

{ ADD campo tipo [(tamaño)] [NOT NULL] [restricción_un_campo] |

[ WITH CHECK | WITH NOCHECK ] ADD { restricción_tabla } [ ,...n ] |

ALTER COLUMN { campo tipo [(tamaño)] } |

DROP {COLUMN campo | CONSTRAINT nombre_restricción} |

{ ENABLE | DISABLE } TRIGGER { ALL | nombre_trigger [ ,...n ] } |

{ CHECK | NOCHECK } CONSTRAINT { ALL | nombre_restricción[ ,...n ] }}

ALTER TABLE tabla

{ ADD campo tipo [(tamaño)] [NOT NULL] [restricción_un_campo] |

[ WITH CHECK | WITH NOCHECK ] ADD { restricción_tabla } [ ,...n ] |

ALTER COLUMN { campo tipo [(tamaño)] } |

DROP {COLUMN campo | CONSTRAINT nombre_restricción} |

{ ENABLE | DISABLE } TRIGGER { ALL | nombre_trigger [ ,...n ] } |

{ CHECK | NOCHECK } CONSTRAINT { ALL | nombre_restricción[ ,...n ] }}

tabla: es el nombre de la tabla que se va a modificar.

campo: es el nombre del campo que se va a añadir o modificar en la tabla .

tipo: es el tipo de dato que se asigna a campo.

tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).

restricción_un_campo: es una cláusula CONSTRAINT que afectan a un único campo.

restricción_tabla: es una cláusula CONSTRAINT que afecta a varios campos.

nombre_restricción: es el nombre de la restricción que se va a eliminar o habilitar/deshabilitar.

nombre_trigger: es el nombre del desencadenador que se va a eliminar o habilitar/deshabilitar.

tabla: es el nombre de la tabla que se va a modificar.

campo: es el nombre del campo que se va a añadir o modificar en la tabla .

tipo: es el tipo de dato que se asigna a campo.

tamaño: es el tamaño del campo en caracteres (solamente para campos de tipo Texto).

restricción_un_campo: es una cláusula CONSTRAINT que afectan a un único campo.

restricción_tabla: es una cláusula CONSTRAINT que afecta a varios campos.

nombre_restricción: es el nombre de la restricción que se va a eliminar o habilitar/deshabilitar.

nombre_trigger: es el nombre del desencadenador que se va a eliminar o habilitar/deshabilitar.

Page 9: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 18

IDD : CLÁUSULA CONSTRAINT SOBRE UN SOLO CAMPOIDD : CLIDD : CLÁÁUSULA CONSTRAINT SOBRE UN SOLO CAMPOUSULA CONSTRAINT SOBRE UN SOLO CAMPO

Se utiliza en instrucciones CREATE TABLE y ALTER TABLE para crear o eliminar restricciones.Esta cláusula puede referirse a un campo de la tabla. La restricción Primary Key y Unique generan índice, Foreign key no.

nombre: es el nombre de la restricción que se va a crear.otra_tabla: es el nombre de la tabla a la que se hace referencia.campo_externo1: son los nombres de los campos de la otra_tabla a los que se hace referencia. factor_relleno: especifica cuánto se debe llenar cada página de índice utilizada para almacenar los

datos de índice.Entre 0 y 100. Por defecto 0.grupo_ficheros: indica dónde se almacena la tablaexpresión_lógica: Expresión que devuelve true o false

nombre: es el nombre de la restricción que se va a crear.otra_tabla: es el nombre de la tabla a la que se hace referencia.campo_externo1: son los nombres de los campos de la otra_tabla a los que se hace referencia. factor_relleno: especifica cuánto se debe llenar cada página de índice utilizada para almacenar los

datos de índice.Entre 0 y 100. Por defecto 0.grupo_ficheros: indica dónde se almacena la tablaexpresión_lógica: Expresión que devuelve true o false

CONSTRAINT nombre{ [ NULL | NOT NULL ] |[ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = factor_relleno ] [ ON {grupo_ficheros | DEFAULT} ] ]

] |[ [ FOREIGN KEY ]

REFERENCES otra_tabla[ (campo_externo1) ] [ ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ NOT FOR REPLICATION ]

] |CHECK [ NOT FOR REPLICATION ] ( expresión_lógica ) }

CONSTRAINT nombre{ [ NULL | NOT NULL ] |[ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = factor_relleno ] [ ON {grupo_ficheros | DEFAULT} ] ]

] |[ [ FOREIGN KEY ]

REFERENCES otra_tabla[ (campo_externo1) ] [ ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ NOT FOR REPLICATION ]

] |CHECK [ NOT FOR REPLICATION ] ( expresión_lógica ) }

Page 10: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 19

IDD : CLÁUSULA CONSTRAINT SOBRE TABLAIDD : CLIDD : CLÁÁUSULA CONSTRAINT SOBRE TABLAUSULA CONSTRAINT SOBRE TABLA

CONSTRAINT nombre

{ [ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ]

{ (principal1 [ ASC | DESC ] [ , principal2 [, ...] ] ) }

[ WITH FILLFACTOR = factor_relleno]

[ ON { grupo_ficheros | DEFAULT } ]

] |FOREIGN KEY

[ (referencia1 [, referencia2 [, ...] ] ) ]

REFERENCES otra_tabla [ (campo_externo1 [ ,... campo_externo2 ] ) ]

[ ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

[ ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

[ NOT FOR REPLICATION ] |CHECK [ NOT FOR REPLICATION ] (expresión_lógica )

}

CONSTRAINT nombre

{ [ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ]

{ (principal1 [ ASC | DESC ] [ , principal2 [, ...] ] ) }

[ WITH FILLFACTOR = factor_relleno]

[ ON { grupo_ficheros | DEFAULT } ]

] |FOREIGN KEY

[ (referencia1 [, referencia2 [, ...] ] ) ]

REFERENCES otra_tabla [ (campo_externo1 [ ,... campo_externo2 ] ) ]

[ ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

[ ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

[ NOT FOR REPLICATION ] |CHECK [ NOT FOR REPLICATION ] (expresión_lógica )

}

nombre: es el nombre de la restricción que se va a crear.principal1, principal2: son los nombres de los campos que compondrán la clave principal. referencia1, referencia2: son los nombres de los campos que hacen referencia a otros de otra tabla.otra_tabla: es el nombre de la tabla a la que se hace referencia.campo_externo1, campo_externo2: son los nombres de los campos de la otra_tabla a los que se

hace referencia. expresión_lógica: criterio que se ha de cumplir. Devuelve true o false

nombre: es el nombre de la restricción que se va a crear.principal1, principal2: son los nombres de los campos que compondrán la clave principal. referencia1, referencia2: son los nombres de los campos que hacen referencia a otros de otra tabla.otra_tabla: es el nombre de la tabla a la que se hace referencia.campo_externo1, campo_externo2: son los nombres de los campos de la otra_tabla a los que se

hace referencia. expresión_lógica: criterio que se ha de cumplir. Devuelve true o false

Page 11: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 20

EjemploEjemploEjemplo

La base de datos trata de informatizar el proceso de compras de una empresa. Esto es, recoger los pedidos de los artículos, contemplados en su catálogo, que compran a proveedores ya conocidos. Reglas: - No puede seleccionar un artículo descatalogado.- Si el stock alcanza el mínimo establecido, se ha de notificar como un evento.

La base de datos trata de informatizar el proceso de compras de una empresa. Esto es, recoger los pedidos de los artículos, contemplados en su catálogo, que compran a proveedores ya conocidos. Reglas: - No puede seleccionar un artículo descatalogado.- Si el stock alcanza el mínimo establecido, se ha de notificar como un evento.

Page 12: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 21

CREATE TABLE Lineas (

numped INTEGER NOT NULL,

numlin SMALLINT NOT NULL,

codigart CHAR(6) NOT NULL,

unilin FLOAT NOT NULL,

preunlin MONEY NOT NULL,

desculin FLOAT NOT NULL CHECK (desculin>=0 and desculin<=100),

totallin AS ([preunlin] * [unilin] * (1 –[desculin] / 100)),

CONSTRAINT id_lin PRIMARY KEY (numped, numlin),

CONSTRAINT f_ped FOREIGN KEY (numped) REFERENCES Pedidos (numped),

CONSTRAINT f_art FOREIGN KEY (codigart) REFERENCES Articulos (codigart))

CREATE TABLE Lineas (

numped INTEGER NOT NULL,

numlin SMALLINT NOT NULL,

codigart CHAR(6) NOT NULL,

unilin FLOAT NOT NULL,

preunlin MONEY NOT NULL,

desculin FLOAT NOT NULL CHECK (desculin>=0 and desculin<=100),

totallin AS ([preunlin] * [unilin] * (1 –[desculin] / 100)),

CONSTRAINT id_lin PRIMARY KEY (numped, numlin),

CONSTRAINT f_ped FOREIGN KEY (numped) REFERENCES Pedidos (numped),

CONSTRAINT f_art FOREIGN KEY (codigart) REFERENCES Articulos (codigart))

IDD: CREATE TABLEEjemplos

IDD: CREATE TABLEIDD: CREATE TABLEEjemplosEjemplos

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

CREATE TABLE Proveedores (

codigpro CHAR(4) NOT NULL CONSTRAINT id_pro PRIMARY KEY,

cifpro CHAR(12) NOT NULL CONSTRAINT u_cif UNIQUE,

nombrpro CHAR(30) NOT NULL,

direcpro CHAR(30) NOT NULL,

cpostpro CHAR(5) NOT NULL CHECK (cpostpro like '[0-9][0-9][0-9][0-9][0-9]'),

localpro CHAR(20) NOT NULL,

telefpro CHAR(17) NOT NULL,

faxpro CHAR(17),

emailpro CHAR(25),

procepro CHAR(10) NOT NULL CHECK (procepro in ('UE', 'No UE')))

CREATE TABLE Proveedores (

codigpro CHAR(4) NOT NULL CONSTRAINT id_pro PRIMARY KEY,

cifpro CHAR(12) NOT NULL CONSTRAINT u_cif UNIQUE,

nombrpro CHAR(30) NOT NULL,

direcpro CHAR(30) NOT NULL,

cpostpro CHAR(5) NOT NULL CHECK (cpostpro like '[0-9][0-9][0-9][0-9][0-9]'),

localpro CHAR(20) NOT NULL,

telefpro CHAR(17) NOT NULL,

faxpro CHAR(17),

emailpro CHAR(25),

procepro CHAR(10) NOT NULL CHECK (procepro in ('UE', 'No UE')))

CREATE TABLE Articulos (

codigart CHAR(6) NOT NULL CONSTRAINT id_art PRIMARY KEY,

descrart CHAR(40) NOT NULL,

preunart MONEY NOT NULL,

stockart INTEGER NOT NULL CHECK (stockart >0),

stockmin INTEGER NOT NULL CHECK (stockmin>0),

fecbaja DATETIME)

CREATE TABLE Articulos (

codigart CHAR(6) NOT NULL CONSTRAINT id_art PRIMARY KEY,

descrart CHAR(40) NOT NULL,

preunart MONEY NOT NULL,

stockart INTEGER NOT NULL CHECK (stockart >0),

stockmin INTEGER NOT NULL CHECK (stockmin>0),

fecbaja DATETIME)

CREATE TABLE Pedidos (

numped INTEGER NOT NULL CONSTRAINT id_ped PRIMARY KEY,

fechaped DATETIME NOT NULL DEFAULT getdate(),

codigpro CHAR(4) NOT NULL,

ivaped FLOAT NOT NULL CHECK (ivaped>0 and ivaped<100),

fentrped DATETIME NOT NULL,

CONSTRAINT f_pro FOREIGN KEY (codigpro) REFERENCES Proveedores (codigpro),

CONSTRAINT c_fecha CHECK (fechaped<=fentrped))

CREATE TABLE Pedidos (

numped INTEGER NOT NULL CONSTRAINT id_ped PRIMARY KEY,

fechaped DATETIME NOT NULL DEFAULT getdate(),

codigpro CHAR(4) NOT NULL,

ivaped FLOAT NOT NULL CHECK (ivaped>0 and ivaped<100),

fentrped DATETIME NOT NULL,

CONSTRAINT f_pro FOREIGN KEY (codigpro) REFERENCES Proveedores (codigpro),

CONSTRAINT c_fecha CHECK (fechaped<=fentrped))

Page 13: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 22

IDD : ALTER TABLE. EjemplosIDD : ALTER TABLE. EjemplosIDD : ALTER TABLE. Ejemplos

ALTER TABLE [dbo].[Proveedores]ADD CONSTRAINT [id_pro] PRIMARY KEY CLUSTERED ( [codigpro] ) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Pedidos] WITH NOCHECK ADDCONSTRAINT [DF_Pedidos_fechaped] DEFAULT (getdate()) FOR [fechaped],

CONSTRAINT [c_fecha] CHECK ([fechaped] <= [fentrped]),

CHECK ([ivaped] > 0 and [ivaped] < 100)

GO

ALTER TABLE [dbo].[Proveedores] ADDCONSTRAINT [u_cif] UNIQUE NONCLUSTERED ( [cifpro] ) ON [PRIMARY] ,CHECK ([cpostpro] like '[0-9][0-9][0-9][0-9][0-9]'),

CHECK ([procepro] = 'No UE' or [procepro] = 'UE')GO

ALTER TABLE [dbo].[Proveedores]ADD CONSTRAINT [id_pro] PRIMARY KEY CLUSTERED ( [codigpro] ) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Pedidos] WITH NOCHECK ADDCONSTRAINT [DF_Pedidos_fechaped] DEFAULT (getdate()) FOR [fechaped],

CONSTRAINT [c_fecha] CHECK ([fechaped] <= [fentrped]),

CHECK ([ivaped] > 0 and [ivaped] < 100)

GO

ALTER TABLE [dbo].[Proveedores] ADDCONSTRAINT [u_cif] UNIQUE NONCLUSTERED ( [cifpro] ) ON [PRIMARY] ,CHECK ([cpostpro] like '[0-9][0-9][0-9][0-9][0-9]'),

CHECK ([procepro] = 'No UE' or [procepro] = 'UE')

GO

Page 14: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 23

IDD : CREATE INDEXIDD : CREATE INDEXIDD : 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

ON {tabla | vista } (campo1 [ {ASC | DESC }] [, campo2 [{ASC|DESC}], ...])

[ WITH < opción_índice > [ ,...n] ] [ ON grupo_ficheros ]

< opción_índice > :: = { PAD_INDEX | FILLFACTOR = factor_relleno | IGNORE_DUP_KEY |

DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB }

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX índice

ON {tabla | vista } (campo1 [ {ASC | DESC }] [, campo2 [{ASC|DESC}], ...])

[ WITH < opción_índice > [ ,...n] ] [ ON grupo_ficheros ]

< opción_índice > :: = { PAD_INDEX | FILLFACTOR = factor_relleno | IGNORE_DUP_KEY |

DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB }

UNIQUE: señala que el índice es de unicidad, en caso contrario permitirá repetición de valores.

índice: es el nombre del índice que se va a crear.

tabla/vista: es el nombre de una tabla/vista existente a la que estará asociado el índice.

campo1, campo2: son los nombres de los campos que van a formar el índice. Puede ser un solo campo. Para forzar una ordenación descendente de un campo, hay que utilizar la palabra reservadaDESC; sino se especifica o se escribe ASC, se entiende que la ordenación es ascendente.

UNIQUE: señala que el índice es de unicidad, en caso contrario permitirá repetición de valores.

índice: es el nombre del índice que se va a crear.

tabla/vista: es el nombre de una tabla/vista existente a la que estará asociado el índice.

campo1, campo2: son los nombres de los campos que van a formar el índice. Puede ser un solo campo. Para forzar una ordenación descendente de un campo, hay que utilizar la palabra reservadaDESC; sino se especifica o se escribe ASC, se entiende que la ordenación es ascendente.

CREATE INDEX FK_Lineas ON Lineas (codigart)CREATE INDEX FK_Lineas ON Lineas (codigart)

Page 15: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 24

Tipos de datosTipos de datosTipos de datos

Consideraciones previas:

• Qué tipo de información se va a almacenar. Por ejemplo, no se

pueden guardar caracteres en un campo cuyo tipo de datos sea

numérico.

• El espacio de almacenamiento necesario (dimensionar el 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

texto.

• Si se desea ordenar o indexar por ese campo. Los criterios de

ordenación difieren en función del tipo de dato, así, los números

almacenados en un campo texto se ordenan según el valor de su

código ASCII (1,10,11,2,20,...) que no coincide con la ordenación

numérica.

Consideraciones previas:

• Qué tipo de información se va a almacenar. Por ejemplo, no se

pueden guardar caracteres en un campo cuyo tipo de datos sea

numérico.

• El espacio de almacenamiento necesario (dimensionar el 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

texto.

• Si se desea ordenar o indexar por ese campo. Los criterios de

ordenación difieren en función del tipo de dato, así, los números

almacenados en un campo texto se ordenan según el valor de su

código ASCII (1,10,11,2,20,...) que no coincide con la ordenación

numérica.

Page 16: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 25

Tipos de datos en SQL Server 2005 ITipos de datos en SQL Server 2005 ITipos de datos en SQL Server 2005 I

NUMNUMÉÉRICOSRICOS

bigint Datos enteros (números enteros) comprendidos entre -2 6̂3 (-9223372036854775808) y 2 6̂3

-1 (9223372036854775807).

int Datos enteros (números enteros) comprendidos entre -2 3̂1 (-2.147.483.648) y 2 3̂1 - 1

(2.147.483.647).

smallint Datos enteros comprendidos entre 2 1̂5 (-32.768) y 2 1̂5 - 1 (32.767).

tinyint Datos enteros comprendidos 0 y 255.

bit Datos enteros con valor 1 ó 0.

decimal Datos de precisión y escala numérica fijas comprendidos entre -10 3̂8 +1 y 10 3̂8 – 1.

numeric Funcionalmente equivalente a decimal.

money Valores de moneda comprendidos entre -2 6̂3 (-922.337.203.685.477,5808) y 2 6̂3 - 1

(+922.337.203.685.477,5807), con una precisión de una diezmilésima de la unidad

monetaria.

smallmoney Valores de moneda comprendidos entre -214.748,3648 y +214.748,3647, con una precisión

de una diezmilésima de la unidad monetaria.

float Números con precisión de coma flotante comprendidos entre -1,79E + 308 y 1,79E + 308.

real Números con precisión de coma flotante comprendidos entre -3,40E + 38 y 3,40E + 38.

Page 17: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 26

Tipos de datos en SQL Server 2005 IITipos de datos en SQL Server 2005 IITipos de datos en SQL Server 2005 II

FECHASFECHAS

datetime Datos de fecha y hora comprendidos entre el 1 de enero de 1753 y el 31 de diciembre de

9999, con una precisión 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 precisión de un minuto.

CADENAS DE CARACTERESCADENAS DE CARACTERES

char Datos de caracteres no Unicode de longitud fija con una longitud máxima de 8.000

caracteres.

varchar Datos no Unicode de longitud variable con un máximo de 8.000 caracteres.

text Datos no Unicode de longitud variable con una longitud máxima de 2 3̂1 - 1 (2.147.483.647)

caracteres.

nchar Datos Unicode de longitud variable con una longitud máxima de 4.000 caracteres.

nvarchar Datos Unicode de longitud variable con una longitud máxima de 4.000 caracteres.

ntext Datos Unicode de longitud variable con una longitud máxima de 2 3̂0 - 1 (1.073.741.823)

caracteres.

Page 18: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 27

Tipos de datos en SQL Server 2005 IIITipos de datos en SQL Server 2005 IIITipos de datos en SQL Server 2005 III

BINARIOSBINARIOS

cursor Una referencia a un 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.

table Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para un

proceso posterior.

timestamp Un número único para toda la base de datos que se actualiza cada vez que se actualiza una

fila. (utilizar rowversion para versiones futuras)

uniqueiden

tifier

Un identificador exclusivo global (GUID), necesario para replicación

xml Almacena una instancia de XML

OTROS TIPOS DE DATOSOTROS TIPOS DE DATOS

binary Datos binarios de longitud fija con una longitud máxima de 8.000 bytes.

varbinary Datos binarios de longitud variable con una longitud máxima de 8.000 bytes.

image Datos binarios de longitud variable con una longitud máxima de 2 3̂1 - 1 (2.147.483.647)

bytes.

Page 19: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 28

Tipo de dato Autonumérico: IDENTITYTipo de dato Tipo de dato AutonumAutonumééricorico: IDENTITY: IDENTITY

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

semilla: valor de inicio.

incremento: incremento que se aplica

semilla: valor de inicio.

incremento: incremento que se aplica

CREATE TABLE dbo.herramientas(

ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

Nombre VARCHAR(40) NOT NULL

)

-- insertamos valores

INSERT INTO dbo.herramientas (Nombre ) VALUES (‘Martillo')

INSERT INTO dbo.herramientas (Nombre ) VALUES (‘Taladro')

-- si borramos, Martillo, se pierde el ID 1. Para reutilizarlo

SET IDENTITY_INSERT dbo.Tool ON

INSERT INTO dbo.herramientas (ID, Nombre) VALUES (1, Serrucho')

CREATE TABLE dbo.herramientas(

ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

Nombre VARCHAR(40) NOT NULL

)

-- insertamos valores

INSERT INTO dbo.herramientas (Nombre ) VALUES (‘Martillo')

INSERT INTO dbo.herramientas (Nombre ) VALUES (‘Taladro')

-- si borramos, Martillo, se pierde el ID 1. Para reutilizarlo

SET IDENTITY_INSERT dbo.Tool ON

INSERT INTO dbo.herramientas (ID, Nombre) VALUES (1, Serrucho')

Page 20: 03- Ldd y Lmd - SQL Server

Manipulación de datosSQL Server 2005

ManipulaciManipulacióón de datosn de datosSQL Server 2005SQL Server 2005

Page 21: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 34

Instrucciones de Manipulación de Datos (IMD) IInstrucciones de ManipulaciInstrucciones de Manipulacióón de Datos (IMD) In de Datos (IMD) I

Las IMD permiten actuar sobre los propios datos.

Las operaciones básicas de manipulación de datos son: insertar, modificar, borrar y consultar.

Las tres primeras permiten alterar el contenido de la base de datos.

La última consiste en localizar datos para su observación.

Principales instrucciones:

INSERT

UPDATE

DELETE

SELECT

Las IMD permiten actuar sobre los propios datos.

Las operaciones básicas de manipulación de datos son: insertar, modificar, borrar y consultar.

Las tres primeras permiten alterar el contenido de la base de datos.

La última consiste en localizar datos para su observación.

Principales instrucciones:

INSERT

UPDATE

DELETE

SELECT

Page 22: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 35

IMD II : INSERTIMD II : INSERTIMD II : INSERT

INSERT INTO destino [(campo1[, campo2[, ...]])]

VALUES (valor1[, valor2[, ...]])

INSERT INTO destino [(campo1[, campo2[, ...]])]

VALUES (valor1[, valor2[, ...]])

Permite añadir una o más filas en una tabla. La sintaxis para insertar una sola fila es:

destino: es el nombre de la tabla o vista donde se van a añadir filas.

campo1, campo2: son los nombres de los campos donde se van a añadir los datos.

valor1, valor2: son los valores que tomarán los campos en la nueva fila que se van a insertar. Cada valor se asigna al campo que corresponde a la posición 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').

Instrucción_SELECT: es la instrucción SELECT cuya ejecución proporcionará las filas a insertar.

INSERT INTO destino [(campo1[, campo2[, ...]])]

Instrucción_SELECT

INSERT INTO destino [(campo1[, campo2[, ...]])]

Instrucción_SELECT

La sintaxis para insertar varias filas es:

Page 23: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 36

IMD III : UPDATE IMD III : UPDATE IMD III : UPDATE

Permite modificar información existente en una o varias filas de una tabla. Su sintaxis es:

UPDATE destino SET campo1=nuevovalor1 [, campo2=nuevovalor2 [, ...]]

[WHERE condición]

UPDATE destino SET campo1=nuevovalor1 [, campo2=nuevovalor2 [, ...]]

[WHERE condición]

• 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.

• condición: es una expresión lógica que determina qué filas se actualizarán. Sólo se actualizarán las filas que satisfagan la expresión. Si no se incluye cláusula WHERE (no hay condición) se modificarán todas las filas de la tabla.

Page 24: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 37

IMD IV : DELETE IMD IV : DELETE IMD IV : DELETE

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

DELETE FROM destino [WHERE condición]DELETE FROM destino [WHERE condición]

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

• condición: es una expresión lógica que determina qué filas se borrarán. Sólo se borrarán las filas que satisfagan la expresión. Si no se incluye cláusula WHERE (no hay condición) se borrarán todas las filas de la tabla.

Page 25: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 38

IMD V : INSERT, UPDATE, DELETEEjemplos

IMD V : INSERT, UPDATE, DELETEIMD V : INSERT, UPDATE, DELETEEjemplos Ejemplos

INSERT INTO Proveedores (codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro, procepro)VALUES ('P005', 'A39144325', 'Angulo Lastra, Antonio', 'Hernán Cortés,18', '39002', 'Santander', '(34) 942 202 022', '(34) 942 202 022', 'UE')

INSERT INTO Proveedores (codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro, telefpro, faxpro, procepro)VALUES ('P005', 'A39144325', 'Angulo Lastra, Antonio', 'Hernán Cortés,18', '39002', 'Santander', '(34) 942 202 022', '(34) 942 202 022', 'UE')

Insertar una nueva fila en la tabla Proveedores.

UPDATE Proveedores SET emailpro='mailto:[email protected]'WHERE codigpro='P004'

UPDATE Proveedores SET emailpro='mailto:[email protected]'WHERE codigpro='P004'

DELETE FROM ProveedoresWHERE localpro='Santander'

DELETE FROM ProveedoresWHERE localpro='Santander'

Borrar todos los proveedores de Santander.

Incorporar el e-mail del proveedor Luis Gil Laso, con valor mailto:[email protected].

Page 26: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 39

DatosDatosDatos

Page 27: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 41

IMD VI : SELECT IMD VI : SELECT IMD VI : SELECT

Está dedicada a obtener información de la base de datos. El resultado de su ejecución, si existe, siempre tiene estructura de una tabla y los campos de sus filas responden a la lista de selección. Tiene enormes posibilidades, lo que hace que su sintaxis presente muchas variantes.

SELECT [ predicado ] Lista_de_selección

[INTO tabla_temporal]

FROM lista_de_tablas

[WHERE condición ]

[GROUP BY lista_campos_group_by]

[HAVING condición_group_by]

[ORDER BY colum1 { [ASC] | DESC } [, colum2 { [ASC] | DESC }, .... ] ]

SELECT [ predicado ] Lista_de_selección

[INTO tabla_temporal]

FROM lista_de_tablas

[WHERE condición ]

[GROUP BY lista_campos_group_by]

[HAVING condición_group_by]

[ORDER BY colum1 { [ASC] | DESC } [, colum2 { [ASC] | DESC }, .... ] ]

Page 28: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 42

IMD VII : SELECT IMD VII : SELECT IMD VII : SELECT

� predicado: puede tomar uno de los siguientes valores: ALL, DISTINCT o TOP número_de_filas (devuelve el número de registros especificado según una cláusula ORDER BY). Puede utilizar el predicado para limitar el número de registros devueltos. Si no especifica ninguno, el valor predeterminado es ALL.

� Lista_de_selección: es el conjunto de los elementos que serán 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.

� condición: es una expresión lógica con los criterios de selección de registros.

� lista_campos_group_by: son los nombres de los campos que se van a utilizar para agrupar los registros.

� condición_group_by: son las condiciones que se imponen sobre el criterio de agrupamiento.

� colum1, colum2: son nombres de elementos de la lista de selección o la posición que ocupan en ella. ASC quiere decir ordenación ascendente (es la opción por defecto) y DESC significa ordenación descendente.

Page 29: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 43

IMD VIII : SELECT IMD VIII : SELECT IMD VIII : SELECT

Búsquedas Sencillas

BBúúsquedas squedas SencillasSencillas

Búsquedas Cualificadas

BBúúsquedas squedas CualificadasCualificadas

Condiciones de Comparación

Condiciones de Condiciones de ComparaciComparacióónn

Condiciones de Combinación

Condiciones de Condiciones de CombinaciCombinacióónn

Condiciones de Subsentencia

Condiciones de Condiciones de SubsentenciaSubsentencia

CombinaciCombinacióón Externan Externa

AutocombinaciAutocombinacióónn

MMúúltipleltiple

SimpleSimple

Con Predicado EXISTSCon Predicado EXISTS

Con Predicado INCon Predicado INDe ComparaciDe Comparacióónn

Con Con PredPred. LIKE . LIKE ‘‘cadena_caracterescadena_caracteres’’

Con Con PredPred. NULL. NULL

Con Con PredPred. IN (lista_de_valores). IN (lista_de_valores)

Con Con PredPred. BETWEEN... AND.... BETWEEN... AND...

Con OperadoresCon Operadores

Page 30: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 44

IMD IX : SELECT IMD IX : SELECT IMD IX : SELECT

Funciones de GrupoFunciones de GrupoFunciones de Grupo

Funciones de FechaFunciones de FechaFunciones de Fecha

Condición de AgrupamientoCondiciCondicióón de Agrupamienton de AgrupamientoAgrupamiento de DatosAgrupamientoAgrupamiento dede DatosDatos

Ordenación del ResultadoOrdenaciOrdenacióón del Resultadon del Resultado

Guardar Resultado en una Tabla

Guardar Resultado Guardar Resultado en una Tablaen una Tabla

Unión, Intersección y Excepción de SentenciasUniUnióón, Interseccin, Interseccióón y Excepcin y Excepcióón de Sentenciasn de Sentencias

Uso de funciones almacenadas Uso de funciones almacenadas Uso de funciones almacenadas

Page 31: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 45

IMD X : SELECTBúsquedas Sencillas (Ejemplos)

IMD X : SELECTIMD X : SELECTBBúúsquedas Sencillas (Ejemplos)squedas Sencillas (Ejemplos)

SELECT * FROM ArticulosSELECT * FROM Articulos

• Obtener el contenido de la tabla Articulos.

• Listar el nombre y el teléfono de todos los Proveedores.

SELECT nombrpro as Nombre, telefpro as Telf

FROM Proveedores

SELECT nombrpro as Nombre, telefpro as TelfFROM Proveedores

Page 32: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 46

IMD XI : SELECTBúsquedas Cualificadas. Cond. de Comparación 1(Ejemplos)

IMD XI : SELECTIMD XI : SELECTBBúúsquedas Cualificadas. Cond. de Comparacisquedas Cualificadas. Cond. de Comparacióón 1n 1(Ejemplos)(Ejemplos)

exp operador_de_comparación exp

exp [NOT] BETWEEN exp AND exp

exp [NOT] IN (lista de valores)

campo [NOT] LIKE 'cadena_de_caracteres'

campo IS [NOT] NULL

exp operador_de_comparación exp

exp [NOT] BETWEEN exp AND exp

exp [NOT] IN (lista de valores)

campo [NOT] LIKE 'cadena_de_caracteres'

campo IS [NOT] NULL

Las condiciones de comparación son expresiones lógicas que permiten comparar una columna o expresión con otra columna, expresión o lista de columnas. Pueden adoptar una de las formas siguientes:

• Encontrar los artículos cuyo precio unitario sea superior a 180 € y su stock sea inferior o igual a 100.

SELECT * FROM Articulos

WHERE preunart > 180 AND stockart <= 100

SELECT * FROM Articulos

WHERE preunart > 180 AND stockart <= 100

Page 33: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 47

• Listar los artículos cuyo precio unitario esté comprendido entre 180 € y 300 €.

SELECT * FROM Articulos

WHERE preunart BETWEEN 180 AND 300

SELECT * FROM Articulos

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 ProveedoresWHERE localpro IN ('Santander', 'Madrid', 'Barcelona')

SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores

WHERE localpro IN ('Santander', 'Madrid', 'Barcelona')

IMD XII : SELECTBúsquedas Cualificadas. Cond. de Comparación 2(Ejemplos)

IMD XII : SELECTIMD XII : SELECTBBúúsquedas Cualificadas. Cond. de Comparacisquedas Cualificadas. Cond. de Comparacióón 2n 2(Ejemplos)(Ejemplos)

Page 34: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 48

• 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

WHERE nombrpro LIKE '[A-J]%'

SELECT codigpro, nombrpro, direcpro, cpostpro, localpro FROM Proveedores

WHERE nombrpro LIKE '[A-J]%'

• Hallar todos los proveedores de los que no se tenga información sobre su correo electrónico.

SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefproFROM Proveedores

WHERE emailpro IS NULL

SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefproFROM Proveedores

WHERE emailpro IS NULL

IMD XIII : SELECTBúsquedas Cualificadas. Cond. de Comparación 3(Ejemplos)

IMD XIII : SELECTIMD XIII : SELECTBBúúsquedas Cualificadas. Cond. de Comparacisquedas Cualificadas. Cond. de Comparacióón 3n 3(Ejemplos)(Ejemplos)

Page 35: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 49

Las búsquedas cualificadas son las que afectan a datos de más de una tabla.

IMD XIV : SELECTBúsquedas Cualificadas. Cond. de CombinaciónCombinación Simple (Ejemplo)

IMD XIV : SELECTIMD XIV : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnCombinaciCombinacióón Simple (Ejemplo)n Simple (Ejemplo)

• Listar todos los proveedores a los que se ha efectuado algún pedido entre el 20/1/2006 y el 15/9/2006.

Una Combinación Simple es aquella en la que la condición de la cláusula

FROM (o WHERE) contiene una comparación de igualdad entre campos pertenecientes a dos tablas distintas.

Una Combinación Simple es aquella en la que la condición de la cláusula

FROM (o WHERE) contiene una comparación de igualdad entre campos pertenecientes a dos tablas distintas.

SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro

FROM Proveedores INNER JOIN Pedidos

ON Proveedores.codigpro = Pedidos.codigpro

WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'

SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro

FROM Proveedores INNER JOIN Pedidos

ON Proveedores.codigpro = Pedidos.codigpro

WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'

Page 36: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 50

SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro

FROM Proveedores INNER JOIN Pedidos

ON Proveedores.codigpro = Pedidos.codigpro

WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'

SELECT DISTINCT Proveedores.codigpro, nombrpro, direcpro, localpro

FROM Proveedores INNER JOIN Pedidos

ON Proveedores.codigpro = Pedidos.codigpro

WHERE fechaped BETWEEN '2006/01/20' AND '2006/09/15'

InformaciInformacióón n de procesode proceso

IMD XIV : SELECTBúsquedas Cualificadas. Cond. de CombinaciónCombinación Simple (Ejemplo. Continuación)

IMD XIV : SELECTIMD XIV : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnCombinaciCombinacióón Simple (Ejemplo. Continuacin Simple (Ejemplo. Continuacióón)n)

Page 37: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 51

IMD XV : SELECTBúsquedas Cualificadas. Cond. de CombinaciónCombinación Múltiple (Ejemplo)

IMD XV : SELECTIMD XV : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnCombinaciCombinacióón Mn Múúltiple (Ejemplo)ltiple (Ejemplo)

• Encontrar todos los artículos que han sido pedidos entre el 15/5/2006 y el 30/5/2006.

Una Combinación Múltiple es aquella combinación que relaciona varios

campos de más de dos tablas.

Una Combinación Múltiple es aquella

combinación que relaciona varios

campos de más de dos tablas.

SELECT DISTINCT Articulos.codigart, descrart

FROM Pedidos INNER JOIN

(Lineas INNER JOIN Articulos ON Lineas.codigart = Articulos.codigart)

ON Pedidos.numped = Lineas.numped

WHERE fechaped BETWEEN '2006/05/15' AND '2006/05/30'

SELECT DISTINCT Articulos.codigart, descrart

FROM Pedidos INNER JOIN

(Lineas INNER JOIN Articulos ON Lineas.codigart = Articulos.codigart)

ON Pedidos.numped = Lineas.numped

WHERE fechaped BETWEEN '2006/05/15' AND '2006/05/30'

Page 38: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 52

IMD XVI : SELECTBúsquedas Cualificadas. Cond. de CombinaciónAutocombinación (Ejemplo)

IMD XVI : SELECTIMD XVI : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnAutocombinaciAutocombinacióónn (Ejemplo)(Ejemplo)

• Localizar todos los pedidos que tienen varias líneas del mismo artículo.

Una Autocombinación es una combinación de una tabla con ella misma. Una Autocombinación es una combinación de una tabla con ella misma.

SELECT x.numped, x.numlin, x.codigart

FROM Lineas x, Lineas y

WHERE x.numped = y.numped AND x.numlin <> y.numlin

AND x.codigart = y.codigart

SELECT x.numped, x.numlin, x.codigart

FROM Lineas x, Lineas y

WHERE x.numped = y.numped AND x.numlin <> y.numlin

AND x.codigart = y.codigart

Page 39: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 53

SELECT x.numped, x.numlin, x.codigart

FROM Lineas x, Lineas y

WHERE x.numped = y.numped AND x.numlin <> y.numlin

AND x.codigart = y.codigart

SELECT x.numped, x.numlin, x.codigart

FROM Lineas x, Lineas y

WHERE x.numped = y.numped AND x.numlin <> y.numlin

AND x.codigart = y.codigart

• Localizar todos los pedidos que tienen varias líneas del mismo artículo.

InformaciInformacióón n de procesode proceso

Acceso XAcceso XAcceso XAcceso X Acceso YAcceso YAcceso YAcceso YAcceso XAcceso XAcceso XAcceso X Acceso YAcceso YAcceso YAcceso Y

Acceso XAcceso XAcceso XAcceso X Acceso YAcceso YAcceso YAcceso YAcceso XAcceso XAcceso XAcceso X Acceso YAcceso YAcceso YAcceso YAcceso XAcceso XAcceso XAcceso X Acceso YAcceso YAcceso YAcceso YAcceso XAcceso XAcceso XAcceso X Acceso YAcceso YAcceso YAcceso Y

IMD XVI : SELECTBúsquedas Cualificadas. Cond. de CombinaciónAutocombinación (Ejemplo)

IMD XVI : SELECTIMD XVI : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnAutocombinaciAutocombinacióónn (Ejemplo)(Ejemplo)

Page 40: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 54

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Pedidos RIGHT JOIN Proveedores

ON Proveedores.codigpro = Pedidos.codigpro

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Pedidos RIGHT JOIN Proveedores

ON Proveedores.codigpro = Pedidos.codigpro

IMD XVII : SELECTBúsquedas Cualificadas. Cond. de CombinaciónCombinación Externa (Ejemplo)

IMD XVII : SELECTIMD XVII : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnCombinaciCombinacióón Externa (Ejemplo)n Externa (Ejemplo)

• Listar todos los proveedores indicando, en su caso, los que han recibido algún pedido.

Una Combinación Externa es aquella que da preferencia a una tabla con respecto a otra. Así, las filas de la tabla dominante serán

seleccionadas aunque la condición de enlace no se haya verificado.

Una Combinación Externa es aquella que da preferencia a una tabla con respecto a otra. Así, las filas de la tabla dominante serán

seleccionadas aunque la condición de enlace no se haya verificado.

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Proveedores LEFT JOIN Pedidos

ON Proveedores.codigpro = Pedidos.codigpro

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Proveedores LEFT JOIN Pedidos

ON Proveedores.codigpro = Pedidos.codigpro

Preferencia a la Preferencia a la tabla de la izquierdatabla de la izquierda

Preferencia a la Preferencia a la tabla de la derechatabla de la derecha

Page 41: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 55

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Pedidos LEFT JOIN Proveedores

ON Proveedores.codigpro = Pedidos.codigpro

WHERE Localpro=‘SANTANDER’

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Pedidos LEFT JOIN Proveedores

ON Proveedores.codigpro = Pedidos.codigpro

WHERE Localpro=‘SANTANDER’

IMD XVII : SELECTBúsquedas Cualificadas. Cond. de CombinaciónCombinación Externa (Ejemplo 2)

IMD XVII : SELECTIMD XVII : SELECTBBúúsquedas Cualificadas. Cond. de Combinacisquedas Cualificadas. Cond. de CombinacióónnCombinaciCombinacióón Externa (Ejemplo 2)n Externa (Ejemplo 2)

• Listar todos los proveedores de Santander indicando, en su caso, los que han recibido algún pedido.

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

ejecutan al resultado del join.

El resultado puede ser distinto si la condición de join es LEFT o RIGHT.

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

ejecutan al resultado del join.

El resultado puede ser distinto si la condición de join es LEFT o RIGHT.

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Pedidos LEFT JOIN Proveedores

ON Proveedores.codigpro = Pedidos.codigpro

AND Localpro='SANTANDER'

SELECT Proveedores.codigpro, nombrpro, Pedidos.numped

FROM Pedidos LEFT JOIN Proveedores

ON Proveedores.codigpro = Pedidos.codigpro

AND Localpro='SANTANDER'

Page 42: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 56

IMD XVIII : SELECTBúsquedas Cualificadas. Cond. de Subsentencias(Ejemplo de comparación)

IMD XVIII : SELECTIMD XVIII : SELECTBBúúsquedas Cualificadas. Cond. de squedas Cualificadas. Cond. de SubsentenciasSubsentencias(Ejemplo de comparaci(Ejemplo de comparacióón)n)

La instrucción SELECT permite contrastar una expresión o un campo con el resultado

de otra instrucción (subsentencia) SELECT. A este contraste se le llama condición de

subsentencia y las dos instrucciones se llaman instrucciones imbricadas. A su vez, la

subsentencia puede incluir en su condición a otra subsentencia y así sucesivamente.Las condiciones de subsentencia pueden adoptar una de las formas siguientes:

La instrucción SELECT permite contrastar una expresión o un campo con el resultado

de otra instrucción (subsentencia) SELECT. A este contraste se le llama condición de

subsentencia y las dos instrucciones se llaman instrucciones imbricadas. A su vez, la

subsentencia puede incluir en su condición a otra subsentencia y así sucesivamente.Las condiciones de subsentencia pueden adoptar una de las formas siguientes:

exp operador_de_comparación {ALL | [ANY | SOME] } (instrucción SELECT)

exp [NOT] IN (instrucción SELECT)

[NOT] EXISTS (instrucción SELECT)

exp operador_de_comparación {ALL | [ANY | SOME] } (instrucción SELECT)

exp [NOT] IN (instrucción SELECT)

[NOT] EXISTS (instrucción SELECT)

SELECT articulos.codigart, descrart, stockart FROM Articulos

WHERE stockart > ALL (SELECT unilin FROM Lineas

WHERE Articulos.codigart = Lineas.codigart)

SELECT articulos.codigart, descrart, stockart FROM Articulos

WHERE stockart > ALL (SELECT unilin FROM Lineas

WHERE Articulos.codigart = Lineas.codigart)

• Encontrar los artículos cuyo stock es mayor que toda cantidad pedida del mismo artículo.

Page 43: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 57

IMD XIX : SELECTBúsquedas Cualificadas. Cond. de Subsentencias. (Ejemplos con predicados IN y EXIST)

IMD XIX : SELECTIMD XIX : SELECTBBúúsquedas Cualificadas. Cond. de squedas Cualificadas. Cond. de SubsentenciasSubsentencias. . (Ejemplos con predicados IN y EXIST)(Ejemplos con predicados IN y EXIST)

SELECT DISTINCT Articulos.codigart, descrart FROM Articulos

WHERE Articulos.codigart NOT IN (SELECT Lineas.codigart FROM Lineas, Pedidos

WHERE Pedidos.numped = Lineas.numped

AND Pedidos.fechaped

BETWEEN '2006/09/24' AND '2006/11/21')

SELECT DISTINCT Articulos.codigart, descrart FROM Articulos

WHERE Articulos.codigart NOT IN (SELECT Lineas.codigart FROM Lineas, Pedidos

WHERE Pedidos.numped = Lineas.numped

AND Pedidos.fechaped

BETWEEN '2006/09/24' AND '2006/11/21')

• Listar los artículos que no han sido pedidos entre el 24 de Septiembre y el 21 de Noviembre de 2006.

SELECT DISTINCT Proveedores.codigpro, nombrpro FROM Proveedores

WHERE EXISTS ( SELECT * FROM Pedidos

WHERE Proveedores.codigpro = Pedidos.codigpro

AND fechaped BETWEEN '2006/09/24' AND '2006/11/21')

AND localpro = 'Madrid‘

SELECT DISTINCT Proveedores.codigpro, nombrpro FROM Proveedores

WHERE EXISTS ( SELECT * FROM Pedidos

WHERE Proveedores.codigpro = Pedidos.codigpro

AND fechaped BETWEEN '2006/09/24' AND '2006/11/21')

AND localpro = 'Madrid‘

• Encontrar los proveedores de Madrid a los que se les ha realizado algún pedido entre el 24/09/2006 y el 21/11/2006 .

Page 44: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 58

IMD XX : SELECTFunciones de grupo (Ejemplo)

IMD XX : SELECTIMD XX : SELECTFunciones de grupo (Ejemplo)Funciones de grupo (Ejemplo)

SELECT COUNT(codigart) AS Cantidad, MAX(preunart) AS Max,

MIN(preunart) AS Min, AVG(preunart) AS Precio_medio,

SUM(preunart*stockart) AS Valoración

FROM Articulos

SELECT COUNT(codigart) AS Cantidad, MAX(preunart) AS Max,

MIN(preunart) AS Min, AVG(preunart) AS Precio_medio,

SUM(preunart*stockart) AS Valoración

FROM Articulos

• Encontrar cuántos artículos hay registrados, el máximo y el mínimo precio unitario, el precio unitario medio y la valoración del almacén.

Con las filas de la información de proceso correspondiente a una

instrucción SELECT se pueden establecer grupos.

En cada uno de estos grupos,

mediante las funciones de grupo, se pueden efectuar ciertos cálculos.

Con las filas de la información de proceso correspondiente a una

instrucción SELECT se pueden establecer grupos.

En cada uno de estos grupos,

mediante las funciones de grupo, se pueden efectuar ciertos cálculos.

COUNT(*) Nº de filas que componen

el grupo.

COUNT(campo) Nº de filas con valor

asignado al campo (nulos no cuentan).

SUM(exp) Suma de valores obtenidos

con la expresión en cada fila.

AVG(exp) Media.

MAX(exp) Máximo.

MIN(exp) Mínimo.

STDEV(exp) Desviación típica.

VAR(exp) Varianza.

COUNT(*) Nº de filas que componen

el grupo.

COUNT(campo) Nº de filas con valor

asignado al campo (nulos no cuentan).

SUM(exp) Suma de valores obtenidos

con la expresión en cada fila.

AVG(exp) Media.

MAX(exp) Máximo.

MIN(exp) Mínimo.

STDEV(exp) Desviación típica.

VAR(exp) Varianza.

Page 45: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 59

IMD XXI : SELECTFunciones de fecha (Ejemplo)

IMD XXI : SELECTIMD XXI : SELECTFunciones de fecha (Ejemplo)Funciones de fecha (Ejemplo)

SELECT numped, fechaped,

DAY(fechaped) as dia_mes, MONTH(fechaped) as mes,

YEAR(fechaped) as año, DATEPART(dw,fechaped) as dia_sem

FROM Pedidos

SELECT numped, fechaped,

DAY(fechaped) as dia_mes, MONTH(fechaped) as mes,

YEAR(fechaped) as año, DATEPART(dw,fechaped) as dia_sem

FROM Pedidos

• Listar día, mes y año de cada pedido, así como el día de la semana al que corresponden sus fechas.

DAY(fecha) Devuelve el día de mes de fecha.

MONTH (fecha) Devuelve el mes de fecha.

YEAR (fecha) Devuelve el año de fecha.

DATEPART(dw,fecha) Devuelve el día de la

semana correspondiente

a fecha (el 1 � domingo,

el 2 � lunes, ...).

DAY(fecha) Devuelve el día de mes de fecha.

MONTH (fecha) Devuelve el mes de fecha.

YEAR (fecha) Devuelve el año de fecha.

DATEPART(dw,fecha) Devuelve el día de la

semana correspondiente

a fecha (el 1 � domingo,

el 2 � lunes, ...).

Los datos de tipo fecha son almacenados como una unidad de

información. Cuando se necesita trabajar con componentes de una fecha, es preciso utilizar funciones

de fecha.

Los datos de tipo fecha son almacenados como una unidad de

información. Cuando se necesita trabajar con componentes de una

fecha, es preciso utilizar funciones

de fecha.

Page 46: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 60

IMD XXII : SELECTAgrupamiento de datos (Ejemplo)

IMD XXII : SELECTIMD XXII : SELECTAgrupamiento de datos (Ejemplo)Agrupamiento de datos (Ejemplo)

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe

FROM Lineas

GROUP BY numped

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe

FROM Lineas

GROUP BY numped

• Obtener el importe de cada pedido sin aplicar el IVA.

La cláusula GROUP permite formar grupos con las filas de datos que

tengan valores iguales para determinados campos.

La respuesta tiene tantas filas como grupos haya establecido la

instrucción.

La cláusula GROUP permite formar grupos con las filas de datos que

tengan valores iguales para determinados campos.

La respuesta tiene tantas filas como grupos haya establecido la

instrucción.

Page 47: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 61

IMD XXIII : SELECTAgrupamiento de Datos. Cond. de agrupamiento (Ejemplo)

IMD XXIII : SELECTIMD XXIII : SELECTAgrupamiento de Datos. Cond. de agrupamiento Agrupamiento de Datos. Cond. de agrupamiento (Ejemplo)(Ejemplo)

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe

FROM Lineas

GROUP BY numped

HAVING COUNT(*) > 1

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe

FROM Lineas

GROUP BY numped

HAVING COUNT(*) > 1

• Listar el importe, sin aplicar el IVA, de los pedidos que tienen más de una línea.

Page 48: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 65

IMD XXV : SELECTOrdenación del Resultado (Ejemplo)

IMD XXV : SELECTIMD XXV : SELECTOrdenaciOrdenacióón del Resultado (Ejemplo)n del Resultado (Ejemplo)

SELECT numped, numlin

FROM Lineas

ORDER BY 1 DESC, 2 DESC

SELECT numped, numlin

FROM Lineas

ORDER BY 1 DESC, 2 DESC

• 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 línea.

[ORDER BY colum1 { [ASC] | DESC } [, colum2 { [ASC] | DESC }, .... ] ]

� colum1, colum2, ...: son nombres de elementos (campos, expresiones

o funciones) de la lista de selección o la posición que ocupan en ella.

� ASC: quiere decir ordenación ascendente (opción por defecto) y DESC

descendente.

[ORDER BY colum1 { [ASC] | DESC } [, colum2 { [ASC] | DESC }, .... ] ]

� colum1, colum2, ...: son nombres de elementos (campos, expresiones

o funciones) de la lista de selección o la posición que ocupan en ella.

� ASC: quiere decir ordenación ascendente (opción por defecto) y DESC

descendente.

Page 49: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 66

IMD XXVI : SELECTGuardar Resultado en una Tabla (Ejemplo)

IMD XXVI : SELECTIMD XXVI : SELECTGuardar Resultado en una Tabla (Ejemplo)Guardar Resultado en una Tabla (Ejemplo)

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe

INTO #t1

FROM Lineas

GROUP BY numped

HAVING COUNT(*) > 1

SELECT numped, SUM((preunlin*unilin)*(1-desculin/100)) as Importe

INTO #t1

FROM Lineas

GROUP BY numped

HAVING COUNT(*) > 1

• Crear una tabla temporal, llamada t1, para guardar el importe, sin aplicar el IVA, de los pedidos que tienen más de una línea.

INTO tabla_adicional

� tabla_adicional: es el nombre de la tabla a generar, que ha de ser único. Esta tabla hereda el esquema de la lista de selección (nombres

campos, tipos de datos, ...).

INTO tabla_adicional

� tabla_adicional: es el nombre de la tabla a generar, que ha de ser único. Esta tabla hereda el esquema de la lista de selección (nombres

campos, tipos de datos, ...).

Page 50: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 67

SELECT codigpro, nombrpro, localpro

FROM Proveedores

UNION

SELECT codigp, nombrp, localp

FROM Proveedores_Anulados

ORDER BY 1

SELECT codigpro, nombrpro, localpro

FROM Proveedores

UNION

SELECT codigp, nombrp, localp

FROM Proveedores_Anulados

ORDER BY 1

• Listar todos los proveedores de las tablas Proveedores y Proveedores_Anulados ordenados por su código.

Permite combinar los resultados de dos o más consultas. Para ello se

requiere el operador UNION [ALL].

Permite combinar los resultados de dos o más consultas. Para ello se

requiere el operador UNION [ALL].

IMD XXVII : SELECTUnión de Sentencias (Ejemplo)

IMD XXVII : SELECTIMD XXVII : SELECTUniUnióón de Sentencias (Ejemplo)n de Sentencias (Ejemplo)

Page 51: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 68

SELECT codigcli, nombrcli, localcli

FROM clientes

EXCEPT

SELECT codigpro, nombrpro, localpro

FROM Proveedores

SELECT codigcli, nombrcli, localcli

FROM clientes

EXCEPT

SELECT codigpro, nombrpro, localpro

FROM Proveedores

• Listar los clientes exceptuando aquellos que son también Proveedores.

EXCEPT Devuelve los valores distintos de la primera consulta que no

son devueltos por la segunda consulta.

INTERSECT Devuelve los distintos valores que son devueltos por ambas consultas.

EXCEPT Devuelve los valores distintos de la primera consulta que no

son devueltos por la segunda consulta.

INTERSECT Devuelve los distintos valores que son devueltos por ambas consultas.

IMD XXVIII: SELECTEXCEPT e INTERSECT de Sentencias (Ejemplo)

IMD XXVIII: SELECTIMD XXVIII: SELECTEXCEPT e INTERSECT de Sentencias (Ejemplo)EXCEPT e INTERSECT de Sentencias (Ejemplo)

Page 52: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 69

SELECT codigart as Codigo, descrart as Descripcion,

dbo.dame_precio_articulo(codigart) as Precio

FROM ARTICULOS

SELECT codigart as Codigo, descrart as Descripcion,

dbo.dame_precio_articulo(codigart) as Precio

FROM ARTICULOS

• Obtener el precio y la descripción de los artículos haciendo uso de la función dame_precio_articulos(@codigo_art).

IMD XXIX : SELECTUso de funciones (Ejemplo)

IMD XXIX : SELECTIMD XXIX : SELECTUso de funciones (Ejemplo)Uso de funciones (Ejemplo)

SELECT codigart as Codigo, descrart as Descripcion, preunart as Precio

FROM ARTICULOS

WHERE dbo.dame_precio_articulo(codigart) > 190

SELECT codigart as Codigo, descrart as Descripcion, preunart as Precio

FROM ARTICULOS

WHERE dbo.dame_precio_articulo(codigart) > 190

• Obtener los artículos haciendo uso de la función dame_precio_articulos cuyo precio sea superior a 190 €

Page 53: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 70

INSERT INTO proveedores

SELECT codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro,

telefpro, faxpro, procepro

FROM prov_tmp

INSERT INTO proveedores

SELECT codigpro, cifpro, nombrpro, direcpro, cpostpro, localpro,

telefpro, faxpro, procepro

FROM prov_tmp

• 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.

IMD XXX: INSERT con SELECTIMD XXX: INSERT con SELECTIMD XXX: INSERT con SELECT

Page 54: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 71

UPDATE articulo

SET preunart = preunart * 1.02

WHERE tipo_id IN

(SELECT tipo_id

FROM TipoArticulo

WHERE tipo_nombre = 'Bebidas')

UPDATE articulo

SET preunart = preunart * 1.02

WHERE tipo_id IN

(SELECT tipo_id

FROM TipoArticulo

WHERE tipo_nombre = 'Bebidas')

• Actualizar los precios en un 2% de los artículos del grupo Bebidas.

IMD XXXI: UPDATE, DELETE con SELECTIMD XXXI: UPDATE, DELETE con SELECTIMD XXXI: UPDATE, DELETE con SELECT

DELETE FROM pedidos

FROM pedidos INNER JOIN

proveedores ON proveedores.codigpro = pedidos.codigpro

WHERE procepro = 'No UE'

DELETE FROM pedidos

FROM pedidos INNER JOIN

proveedores ON proveedores.codigpro = pedidos.codigpro

WHERE procepro = 'No UE'

• Borrar los pedidos de los proveedores no comunitarios

Page 55: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 72

SELECT ‘precio' =

CASE

WHEN preunart IS NULL THEN ‘No establecido'

WHEN preunart < 200 THEN ‘Bajo‘

ELSE ‘Alto'

END,

descrart

FROM articulos

SELECT ‘precio' =

CASE

WHEN preunart IS NULL THEN ‘No establecido'

WHEN preunart < 200 THEN ‘Bajo‘

ELSE ‘Alto'

END,

descrart

FROM articulos

• Listar los artículos mostrando su precio categorizado por alto, bajo y no establecido.

IMD XXXII: SELECT, UPDATE con CASEIMD XXXII: SELECT, UPDATE con CASEIMD XXXII: SELECT, UPDATE con CASE

UPDATE articulos SET preunart=

CASE

WHEN preunart <10 THEN preunart*1.05

ELSE preunart*1.07

END

UPDATE articulos SET preunart=

CASE

WHEN preunart <10 THEN preunart*1.05

ELSE preunart*1.07

END

• Actualizar los artículos con precio < 10 con 5% y los > =10 con un 7%

Page 56: 03- Ldd y Lmd - SQL Server

Lenguaje de definición de datos

SQL Server 2005(Parte 2)

Lenguaje de definiciLenguaje de definicióón de n de datosdatos

SQL Server 2005SQL Server 2005(Parte 2)(Parte 2)

Page 57: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 77

CREATE VIEWCREATE VIEWCREATE VIEW

Para crear una vista en la base de datos. Su sintaxis es:

CREATE VIEW [ < nombreBD > . ] [ < propietario > . ] nombre [ ( campo [ ,...n ] ) ]

[ WITH <view_attribute> [ ,...n ] ]ASInstrucción_Select

[ WITH CHECK OPTION ]

CREATE VIEW [ < nombreBD > . ] [ < propietario > . ] nombre [ ( campo [ ,...n ] ) ]

[ WITH <view_attribute> [ ,...n ] ]ASInstrucción_Select

[ WITH CHECK OPTION ]

nombreBD: es el nombre de la base de datos en la que se crea.

propietario: cuenta de usuario que crea la vista

nombre: es el nombre de la vista que se va a crear.

campo: es el nombre que se va a utilizar para una columna en una vista.

instrucción_Select: consulta a través de la cuál se define la vista

view_attribute: toma uno de los siguientes valores

[ ENCRYPTION ]: evita que la vista se publique como parte de la réplica de SQL Server

[ 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 a la definición de la vista.

[ VIEW_METADATA ]: Especifica que la instancia de SQL Server devolverá a las API de DB-Library, ODBC y OLE DB la información de metadatos sobre la vista en vez de las tablas base.

� [ WITH CHECK OPTION ] : Exige que todas las instrucciones de modificación de datos ejecutadas contra la vista se adhieran a los criterios establecidos en la instrucción Select.

nombreBD: es el nombre de la base de datos en la que se crea.

propietario: cuenta de usuario que crea la vista

nombre: es el nombre de la vista que se va a crear.

campo: es el nombre que se va a utilizar para una columna en una vista.

instrucción_Select: consulta a través de la cuál se define la vista

view_attribute: toma uno de los siguientes valores

[ ENCRYPTION ]: evita que la vista se publique como parte de la réplica de SQL Server

[ 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 a la definición de la vista.

[ VIEW_METADATA ]: Especifica que la instancia de SQL Server devolverá a las API de DB-Library, ODBC y OLE DB la información de metadatos sobre la vista en vez de las tablas base.

� [ WITH CHECK OPTION ] : Exige que todas las instrucciones de modificación de datos ejecutadas contra la vista se adhieran a los criterios establecidos en la instrucción Select.

Page 58: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 78

CREATE VIEW . EjemploCREATE VIEW . EjemploCREATE VIEW . Ejemplo

CREATE VIEW dbo.EncabezadoPedido

AS

SELECT dbo.Pedidos.numped, dbo.Pedidos.fechaped, dbo.Pedidos.codigpro,

dbo.Pedidos.ivaped, dbo.Pedidos.fentrped, dbo.Proveedores.nombrpro,

dbo.Proveedores.direcpro, dbo.Proveedores.cpostpro, dbo.Proveedores.localpro,

dbo.Proveedores.telefpro, dbo.Proveedores.faxpro,

dbo.Proveedores.procepro, dbo.Proveedores.emailpro, dbo.Proveedores.cifpro

FROM dbo.Proveedores INNER JOIN

dbo.Pedidos ON dbo.Proveedores.codigpro = dbo.Pedidos.codigpro

CREATE VIEW dbo.EncabezadoPedido

AS

SELECT dbo.Pedidos.numped, dbo.Pedidos.fechaped, dbo.Pedidos.codigpro,

dbo.Pedidos.ivaped, dbo.Pedidos.fentrped, dbo.Proveedores.nombrpro,

dbo.Proveedores.direcpro, dbo.Proveedores.cpostpro, dbo.Proveedores.localpro,

dbo.Proveedores.telefpro, dbo.Proveedores.faxpro,

dbo.Proveedores.procepro, dbo.Proveedores.emailpro, dbo.Proveedores.cifpro

FROM dbo.Proveedores INNER JOIN

dbo.Pedidos ON dbo.Proveedores.codigpro = dbo.Pedidos.codigpro

Page 59: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 79

Vistas actualizables, vistas materializadas Vistas actualizables, vistas materializadas Vistas actualizables, vistas materializadas

Vista actualizable si:

• El SELECT no tiene ninguna expresión de valor agregado ni especificación de

DISTINCT

• Cualquier atributo que no aparezca en la cláusula SELECT puede definirse

como nulo

• La consulta no tiene cláusulas GROUP BY ni HAVING

• Cualquier modificación, UPDATE, INSERT y DELETE, debe hacer referencia

a las columnas de una única tabla base

• Las columnas que se van a modificar no se ven afectadas por las cláusulas

GROUP BY, HAVING o DISTINCT.

Vista actualizable si:

• El SELECT no tiene ninguna expresión de valor agregado ni especificación de

DISTINCT

• Cualquier atributo que no aparezca en la cláusula SELECT puede definirse

como nulo

• La consulta no tiene cláusulas GROUP BY ni HAVING

• Cualquier modificación, UPDATE, INSERT y DELETE, debe hacer referencia

a las columnas de una única tabla base

• Las columnas que se van a modificar no se ven afectadas por las cláusulas

GROUP BY, HAVING o DISTINCT.

Vista materializada (Indexed views SCHEMABINDING )

• La vista es computada y almacenada.

• Se crea al definir un índice cluster sobre ella.

• Son adecuadas para consultas frecuentes sobre datos agregados sobre

muchas filas.

• No se aconsejan para datos que cambien frecuentemente.

Vista materializada (Indexed views SCHEMABINDING )

• La vista es computada y almacenada.

• Se crea al definir un índice cluster sobre ella.

• Son adecuadas para consultas frecuentes sobre datos agregados sobre

muchas filas.

• No se aconsejan para datos que cambien frecuentemente.

Page 60: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 80

Vista materializable (ejemplo)Vista Vista materializablematerializable (ejemplo)(ejemplo)

CREATE VIEW UdsPedidas WITH SCHEMABINDING as

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

GROUP BY A.descrart;

CREATE UNIQUE CLUSTERED INDEX cix_MiVistaMaterializada

ON dbo.UdsPedidas(descrart);

CREATE VIEW UdsPedidas WITH SCHEMABINDING as

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

GROUP BY A.descrart;

CREATE UNIQUE CLUSTERED INDEX cix_MiVistaMaterializada

ON dbo.UdsPedidas(descrart);

Page 61: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 81

CREATE PROCEDURECREATE PROCEDURECREATE PROCEDURE

Para crear un procedimiento en la base de datos. Su sintaxis es:

CREATE PROC [ EDURE ] nombre

[ { @parametros tipo_dato }

[ = valor_por_defecto ] [ OUTPUT ]

] [ ,...n ] [ WITH

{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS instrucciones_sql [ ...n ]

CREATE PROC [ EDURE ] nombre

[ { @parametros tipo_dato }

[ = valor_por_defecto ] [ OUTPUT ]

] [ ,...n ] [ WITH

{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS instrucciones_sql [ ...n ]

nombre: es el nombre del procedimiento que se va a crear.

parámetros: parámetros de entrada y salida del procedimiento

tipo_dato: tipo de dato asociado al parámetro.

valor_por_defecto: valor asignado por defecto al parámetro

instrucciones_sql: instrucciones SQL

nombre: es el nombre del procedimiento que se va a crear.

parámetros: parámetros de entrada y salida del procedimiento

tipo_dato: tipo de dato asociado al parámetro.

valor_por_defecto: valor asignado por defecto al parámetro

instrucciones_sql: instrucciones SQL

Page 62: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 82

CREATE PROC. Ejemplo procedimiento sin parámetrosCREATE PROC. Ejemplo procedimiento sin parCREATE PROC. Ejemplo procedimiento sin paráámetrosmetros

CREATE PROCEDURE dameProveedores AS

SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro

FROM Proveedores;

Go

exec dameProveedores;

CREATE PROCEDURE dameProveedores AS

SELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefpro

FROM Proveedores;

Go

exec dameProveedores;

Page 63: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 83

CREATE PROC. Ejemplo 2. procedimiento con parámetrosCREATE PROC. Ejemplo 2. procedimiento con parCREATE PROC. Ejemplo 2. procedimiento con paráámetrosmetros

CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS

BEGIN TRANSACTION

update articulos set preunart = preunart + (preunart*@ipc/100)where preunart is not null

if @@ERROR <> 0

beginROLLBACK TRANSACTIONRAISERROR ( 'No se han modificado los precios’,16,1)

RETURNend

COMMIT TRANSACTIONGo

exec upd_precio_articulo 3.2

CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS

BEGIN TRANSACTION

update articulos set preunart = preunart + (preunart*@ipc/100)where preunart is not null

if @@ERROR <> 0

beginROLLBACK TRANSACTIONRAISERROR ( 'No se han modificado los precios’,16,1)

RETURNend

COMMIT TRANSACTIONGo

exec upd_precio_articulo 3.2

Page 64: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 84

CREATE PROC. Ejemplo 2. procedimiento con parámetros. CONTROL DE ERRORESCREATE PROC. Ejemplo 2. procedimiento con parCREATE PROC. Ejemplo 2. procedimiento con paráámetros. CONTROL DE ERRORESmetros. CONTROL DE ERRORES

CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS

BEGIN TRYBEGIN TRANSACTION

update articulos set preunart = preunart + (preunart*@ipc/100)

where preunart is not null

COMMIT TRANSACTIONEND TRY

BEGIN CATCHROLLBACK TRANSACTIONRAISERROR ( 'No se han modificado los precios,16,1)

END CATCH

RETURN

exec upd_precio_articulo 3.2

CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS

BEGIN TRYBEGIN TRANSACTION

update articulos set preunart = preunart + (preunart*@ipc/100)

where preunart is not null

COMMIT TRANSACTIONEND TRY

BEGIN CATCHROLLBACK TRANSACTIONRAISERROR ( 'No se han modificado los precios,16,1)

END CATCH

RETURN

exec upd_precio_articulo 3.2

Page 65: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 85

CREATE FUNCTIONCREATE FUNCTIONCREATE FUNCTION

Para crear una función escalar en la base de datos. Se pueden usar en el SELECT. Su sintaxis es:

CREATE FUNCTION [ propietario. ] nombre

( [ { @parametro [AS] tipo_dato [ = valor_por_defecto ] } [ ,...n ] ] )

RETURNS tipo_dato_valor_retorno

AS

BEGIN--cuerpo de la función, TSQL

RETURN valor_retorno

END

CREATE FUNCTION [ propietario. ] nombre

( [ { @parametro [AS] tipo_dato [ = valor_por_defecto ] } [ ,...n ] ] )

RETURNS tipo_dato_valor_retorno

AS

BEGIN--cuerpo de la función, TSQL

RETURN valor_retorno

END

propietario: cuenta de usuario que crea la función

nombre: es el nombre de la función que se va a crear.

parámetro: parámetros de entrada de la función

tipo_dato: tipo de dato asociado a cada parámetro

valor_por_defecto: valor asignado por defecto al parámetro

tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno.

valor_retorno: valor de retorno de la función

propietario: cuenta de usuario que crea la función

nombre: es el nombre de la función que se va a crear.

parámetro: parámetros de entrada de la función

tipo_dato: tipo de dato asociado a cada parámetro

valor_por_defecto: valor asignado por defecto al parámetro

tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno.

valor_retorno: valor de retorno de la función

Page 66: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 86

CREATE FUNCTION (2)CREATE FUNCTION (2)CREATE FUNCTION (2)

Para crear una función que devuelve una tabla en la base de datos. Se pueden usar en el SELECT Su sintaxis es:

CREATE FUNCTION [ propietario. ] nombre

( [ { @parametro [AS] tipo_dato [ = valor_por_defecto ] } [ ,...n ] ] )

RETURNS @variable_retorno TABLE < definicion_tabla > AS

BEGIN--cuerpo de la función, TSQL

RETURNEND

CREATE FUNCTION [ propietario. ] nombre

( [ { @parametro [AS] tipo_dato [ = valor_por_defecto ] } [ ,...n ] ] )

RETURNS @variable_retorno TABLE < definicion_tabla > AS

BEGIN--cuerpo de la función, TSQL

RETURNEND

propietario: cuenta de usuario que crea la función

nombre: es el nombre de la función que se va a crear.

parámetro: parámetros de entrada de la función

tipo_dato: tipo de dato asociado a cada parámetro

valor_por_defecto: valor asignado por defecto al parámetro

tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno.

variable_retorno: variable de retorno de la función

definicion_tabla: definición de la tabla que devuelve la función

propietario: cuenta de usuario que crea la función

nombre: es el nombre de la función que se va a crear.

parámetro: parámetros de entrada de la función

tipo_dato: tipo de dato asociado a cada parámetro

valor_por_defecto: valor asignado por defecto al parámetro

tipo_dato_valor_retorno: tipo de dato asociado al valor de retorno.

variable_retorno: variable de retorno de la función

definicion_tabla: definición de la tabla que devuelve la función

Page 67: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 87

CREATE FUNCTION. Ejemplo función escalarCREATE FUNCTION. Ejemplo funciCREATE FUNCTION. Ejemplo funcióón escalarn escalar

CREATE FUNCTION Calcular_Pedido (@codigo int)

RETURNS decimal (10,2)ASBEGIN

DECLARE @precio money

DECLARE @iva float

SELECT @precio= sum(totallin) from lineas WHERE numped=@codigo

SELECT @iva=ivaped from pedidos WHERE numped=@codigo

SET @precio= (@precio* (@iva/100))+@precio

RETURN @precio

ENDGO

-- EjecuciónSELECT dbo.Calcular_Pedido (1)

CREATE FUNCTION Calcular_Pedido (@codigo int)RETURNS decimal (10,2)

ASBEGIN

DECLARE @precio moneyDECLARE @iva float

SELECT @precio= sum(totallin) from lineas WHERE numped=@codigo

SELECT @iva=ivaped from pedidos WHERE numped=@codigo

SET @precio= (@precio* (@iva/100))+@precio

RETURN @precio

ENDGO

-- EjecuciónSELECT dbo.Calcular_Pedido (1)

Page 68: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 88

CREATE FUNCTION. Ejemplo tablaCREATE FUNCTION. Ejemplo tablaCREATE FUNCTION. Ejemplo tabla

CREATE FUNCTION PedidosPorProveedor (@codigo char(4))

RETURNS TABLEAS

RETURN (SELECT count(numped) numero, nombrproFROM pedidos p, proveedores pr

WHERE pr.codigpro=@codigo and

p.codigpro = pr.codigpro

GROUP BY nombrpro)

GO

-- Ejecución

SELECT * from dbo.PedidosPorProveedor(‘0010’)

CREATE FUNCTION PedidosPorProveedor (@codigo char(4))

RETURNS TABLEAS

RETURN (SELECT count(numped) numero, nombrproFROM pedidos p, proveedores pr

WHERE pr.codigpro=@codigo and

p.codigpro = pr.codigpro

GROUP BY nombrpro)

GO

-- Ejecución

SELECT * from dbo.PedidosPorProveedor(‘0010’)

Page 69: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 89

CREATE FUNCTION. Ejemplo tablaCREATE FUNCTION. Ejemplo tablaCREATE FUNCTION. Ejemplo tabla

CREATE FUNCTION PendientePago (@fecha datetime)

RETURNS @Pagos TABLE (numped int primary key,cantidad float NOT NULL,fechaped datetime)

AS BEGIN

INSERT @Pagos

SELECT numped, dbo.calcular_pedido(numped), fechaped

FROM pedidosWHERE fecpago is null or fecpago>=@fecha

RETURN

ENDGO

-- EjecuciónSELECT * from dbo.PendientePago(getdate())

CREATE FUNCTION PendientePago (@fecha datetime)

RETURNS @Pagos TABLE (numped int primary key,cantidad float NOT NULL,fechaped datetime)

AS BEGIN

INSERT @Pagos

SELECT numped, dbo.calcular_pedido(numped), fechaped

FROM pedidosWHERE fecpago is null or fecpago>=@fecha

RETURN

ENDGO

-- EjecuciónSELECT * from dbo.PendientePago(getdate())

Page 70: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 90

Los triggers DML son procesos predefinidos que entran en acción en respuesta a eventos específicos de manipulación 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 ejecución sp_settriggerorder)- sólo puede haber un trigger INSTEAD OF por tipo de operación- crean tablas inserted y deleted- !Ojo en su programación¡� pueden afectar a una o varias filas� se ejecutan transaccionalmente, si hay error se debe gestionar el

ROLLBACK

BD Activas

Page 71: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 91

También hay triggers DDL, que entran en acción en respuesta a eventos de definición (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 definición del schema,..)

En SQL Server 2005:-No crean tablas inserted y deleted-No hay desencadenador INSTEAD OF-Trabajar con función EVENTDATA (Devuelve información acerca de los eventos de base de datos o servidor)

BD Activas (y 2)

Page 72: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 92

CREATE TRIGGER DMLCREATE TRIGGER DMLCREATE TRIGGER DML

Para crear un desencadenador en una tabla de la base de datos. Su sintaxis es:

CREATE TRIGGER nombre

ON { tabla | vista }

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ]

AS[ { IF UPDATE ( campo )

[ { AND | OR } UPDATE (campo ) ]

[ ...n ] } ]

instrucciones_sql [ ...n ]

} }

CREATE TRIGGER nombre

ON { tabla | vista }

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ]

AS[ { IF UPDATE ( campo )

[ { AND | OR } UPDATE (campo ) ]

[ ...n ] } ]

instrucciones_sql [ ...n ]

}

}

nombre: es el nombre del desencadenador que se va a crear.

tabla/vista: es el nombre de una tabla/vista sobre la que se crea.

campo: campo de la tabla o vista afectada por el desencadenador .

instrucciones_sql: reglas de negocio que se requieren especificar por medio de SQL

nombre: es el nombre del desencadenador que se va a crear.

tabla/vista: es el nombre de una tabla/vista sobre la que se crea.

campo: campo de la tabla o vista afectada por el desencadenador .

instrucciones_sql: reglas de negocio que se requieren especificar por medio de SQL

Page 73: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 93

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

CREATE TRIGGER tr_lineas ON dbo.Lineas AFTER INSERT, UPDATE AS BEGIN

DECLARE @valor int

DECLARE @errmsg char(255)

SELECT @valor=count(*) FROM inserted

WHERE dbo.ArticuloDescatalogado(codigart)!=0

IF (@valor) > 0 begin

set @errmsg = 'No puede seleccionar un artículo descatalogado'

RAISERROR ( @errmsg,16,1)

ROLLBACK TRANSACTIONRETURN

END

END

CREATE TRIGGER tr_lineas ON dbo.Lineas AFTER INSERT, UPDATE AS BEGIN

DECLARE @valor int

DECLARE @errmsg char(255)

SELECT @valor=count(*) FROM inserted

WHERE dbo.ArticuloDescatalogado(codigart)!=0

IF (@valor) > 0 begin

set @errmsg = 'No puede seleccionar un artículo descatalogado'

RAISERROR ( @errmsg,16,1)

ROLLBACK TRANSACTIONRETURN

END

END

No pedir un artículo descatalogado

Page 74: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 94

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

CREATE TRIGGER tr_articulos ON articulosFOR UPDATE AS BEGIN

if update(stockart) BEGINDECLARE @v_codigart char(6)DECLARE @v_texto varchar(200)

DECLARE @cursor_insert CURSORSET @cursor_insert = CURSOR FORSELECT codigart FROM inserted

WHERE stockart<=stockminOPEN @cursor_insertFETCH NEXT FROM @cursor_insert INTO @v_codigart

WHILE @@FETCH_STATUS=0BEGIN

set @v_texto='Stock minimo alcanzado en articulo ' + @v_codigartinsert into eventos (fecha, motivo) values (getdate(), @v_texto)

FETCH NEXT FROM @cursor_insert INTO @v_codigartEND

ENDCLOSE @cursor_insertDEALLOCATE @cursor_insertEND

CREATE TRIGGER tr_articulos ON articulosFOR UPDATE AS BEGIN

if update(stockart) BEGINDECLARE @v_codigart char(6)DECLARE @v_texto varchar(200)

DECLARE @cursor_insert CURSORSET @cursor_insert = CURSOR FORSELECT codigart FROM inserted

WHERE stockart<=stockminOPEN @cursor_insertFETCH NEXT FROM @cursor_insert INTO @v_codigart

WHILE @@FETCH_STATUS=0BEGIN

set @v_texto='Stock minimo alcanzado en articulo ' + @v_codigartinsert into eventos (fecha, motivo) values (getdate(), @v_texto)

FETCH NEXT FROM @cursor_insert INTO @v_codigartEND

ENDCLOSE @cursor_insertDEALLOCATE @cursor_insertEND

Notificar si el stock alcanza el mínimo establecido

Page 75: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 95

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

CREATE TRIGGER tr_articulos ON articulosFOR UPDATE AS BEGIN

if UPDATE(stockart) BEGIN

INSERT INTO eventos (fecha, motivo)SELECT getdate(), 'Stock minimo alcanzado ' + codigart FROM inserted

WHERE stockart<=stockmin

ENDEND

CREATE TRIGGER tr_articulos ON articulosFOR UPDATE AS BEGIN

if UPDATE(stockart) BEGIN

INSERT INTO eventos (fecha, motivo)SELECT getdate(), 'Stock minimo alcanzado ' + codigart FROM inserted

WHERE stockart<=stockmin

ENDEND

Notificar si el stock alcanza el mínimo establecido

¡¡¡¡ Mejor evitar el uso de cursores !!!

Código más eficiente � trabaja el motor de almacenamiento y el optimizador para

el conjunto de filas y no para cada una

Page 76: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 96

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

CREATE TRIGGER trd_MiTabla on MiTabla

INSTEAD OF DELETE

AS

IF @@ROWCOUNT = 0

RETURN

UPDATE MiTabla SET col_borrada = ‘S'

FROM MiTabla JOIN deleted d ON d.PK_ID = MiTabla.PK_ID

CREATE TRIGGER trd_MiTabla on MiTabla

INSTEAD OF DELETE

AS

IF @@ROWCOUNT = 0

RETURN

UPDATE MiTabla SET col_borrada = ‘S'

FROM MiTabla JOIN deleted d ON d.PK_ID = MiTabla.PK_ID

Realizar borrados lógicos

Page 77: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 97

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

CREATE TRIGGER tri_rellena ON VistaCompleta

INSTEAD OF INSERT AS

IF @@ROWCOUNT = 0

RETURN

INSERT EmpleadoDatos

SELECT EmpleadoID, Tfno

FROM inserted

INSERT EmpleadoDireccion

SELECT EmpleadoID, Direccion, Ciudad

FROM inserted

go

CREATE TRIGGER tri_rellena ON VistaCompleta

INSTEAD OF INSERT AS

IF @@ROWCOUNT = 0

RETURN

INSERT EmpleadoDatos

SELECT EmpleadoID, Tfno

FROM inserted

INSERT EmpleadoDireccion

SELECT EmpleadoID, Direccion, Ciudad

FROM inserted

go

Insertar datos a través de una vista que incluye información de dos tablas

Page 78: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 102

VENTAJAS

Semántica del problema en un solo sitio → integridadFacilita la construcción de aplicaciones

→ Procedimientos y funciones almacenados- lógica de negocio compartida por aplicaciones- reutilización de código - seguridad de acceso a los usuarios- reducción del tráfico de red- mantenimiento más sencillo

VENTAJAS

Semántica del problema en un solo sitio → integridadFacilita la construcción de aplicaciones

→ Procedimientos y funciones almacenados- lógica de negocio compartida por aplicaciones- reutilización de código - seguridad de acceso a los usuarios- reducción del tráfico de red- mantenimiento más sencillo

APLICACIONES:

• Implementación de reglas de integridad complejas• Gestión de Log (auditoría, control de cambios)• Flujos de trabajo o proceso (actualizaciones, datos derivados, tablas resumen, etc.)

APLICACIONES:

• Implementación de reglas de integridad complejas• Gestión de Log (auditoría, control de cambios)• Flujos de trabajo o proceso (actualizaciones, datos derivados, tablas resumen, etc.)

Triggers, procedimientos y funcionesTriggersTriggers, procedimientos y funciones, procedimientos y funciones

INCONVENIENTES

Deben escribirse con cuidado → ejecución infinita de disparosControl complejo de condicionesMayor carga computacional del servidor

INCONVENIENTES

Deben escribirse con cuidado → ejecución infinita de disparosControl complejo de condicionesMayor carga computacional del servidor

Page 79: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 103

DROPDROPDROP

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

DROP { TABLE nombre |

INDEX nombre |

VIEW nombre |

TRIGGER nombre |

RULE nombre |

DATABASE nombre |

PROCEDURE nombre |

FUNCTION nombre |

.... Otros objetos .. }

DROP { TABLE nombre |

INDEX nombre |

VIEW nombre |

TRIGGER nombre |

RULE nombre |

DATABASE nombre |

PROCEDURE nombre |

FUNCTION nombre |

.... Otros objetos .. }

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

Page 80: 03- Ldd y Lmd - SQL Server

Diseño físicoDiseDiseñño fo fíísicosico

Page 81: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 105

ObjetivosObjetivos

• Satisfacer los requisitos del sistema optimizando la relación coste/beneficio.

• Se ha de tener en cuenta las características del gestor, del SO y del hardware.

• Esto se concreta en los siguientes objetivos:– Disminuir los tiempos de respuesta,– Minimizar el espacio de almacenamiento,– Evitar las reorganizaciones periódicas,– Proporcionar la máxima seguridad, y– Optimizar el consumo de recursos.

• Satisfacer los requisitos del sistema optimizando la relación coste/beneficio.

• Se ha de tener en cuenta las características del gestor, del SO y del hardware.

• Esto se concreta en los siguientes objetivos:– Disminuir los tiempos de respuesta,– Minimizar el espacio de almacenamiento,– Evitar las reorganizaciones periódicas,– Proporcionar la máxima seguridad, y– Optimizar el consumo de recursos.

Page 82: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 106

Entradas y salidas de la fase de Entradas y salidas de la fase de disediseñño fo fíísicosico

• Las entradas de esta etapa son:– Lista de objetivos de diseño físico con sus correspondientes prioridades y

cuantificación (a ser posible);– Esquema lógico específico;– Recursos de máquina disponibles;– Recursos de software disponibles (sistema operativo, middleware, ...);– Información sobre las aplicaciones que utilizarán la BD con objeto de

optimizar el tiempo de respuesta.– Políticas de seguridad de datos.

• A partir de estas entradas, se producirán las siguientes salidas:– Estructura interna (esquema interno, generalmente solo accesible a través

de parámetros de sintonización);– Especificaciones para el sintonizado (tunning) de la BD; y– Normas de seguridad.

• Las entradas de esta etapa son:– Lista de objetivos de diseño físico con sus correspondientes prioridades y

cuantificación (a ser posible);– Esquema lógico específico;– Recursos de máquina disponibles;– Recursos de software disponibles (sistema operativo, middleware, ...);– Información sobre las aplicaciones que utilizarán la BD con objeto de

optimizar el tiempo de respuesta.– Políticas de seguridad de datos.

• A partir de estas entradas, se producirán las siguientes salidas:– Estructura interna (esquema interno, generalmente solo accesible a través

de parámetros de sintonización);– Especificaciones para el sintonizado (tunning) de la BD; y– Normas de seguridad.

Page 83: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 107

ConsideracionesConsideraciones• Algunas de las cuestiones a considerar en el diseño físico son:

– Asignación de tablas a particiones y/o a dispositivos físicos (createdatabase, create table).

– Determinación de índices (cluster, únicos, no cluster, etc.);– Desnormalización y redundancia de datos.– Optimización de consultas, funciones, disparadores,…

� Actualización de estadísticas (update statisticsupdate statisticsupdate statisticsupdate statistics).� Reorganización y reconstrucción de índices.� Reorganización de datos en ficheros.

– Definición de tamaños de memorias intermedias ( Buffers)– Especificación de bloqueos (transacciones)

• NONONONO existe un modelo formal general para el diseño físico, sino que depende mucho de cada producto comercial concreto.

• Algunas de las cuestiones a considerar en el diseño físico son:– Asignación de tablas a particiones y/o a dispositivos físicos (create

database, create table).– Determinación de índices (cluster, únicos, no cluster, etc.);– Desnormalización y redundancia de datos.– Optimización de consultas, funciones, disparadores,…

� Actualización de estadísticas (update statisticsupdate statisticsupdate statisticsupdate statistics).� Reorganización y reconstrucción de índices.� Reorganización de datos en ficheros.

– Definición de tamaños de memorias intermedias ( Buffers)– Especificación de bloqueos (transacciones)

• NONONONO existe un modelo formal general para el diseño físico, sino que depende mucho de cada producto comercial concreto.

Page 84: 03- Ldd y Lmd - SQL Server

Seguridad en SQL Server 2005

Seguridad en SQL Server Seguridad en SQL Server 20052005

Page 85: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 109

Tabla de contenidos

• Modelo de Seguridad en SQL Server

• Inicios de Sesión - Usuarios

• Esquemas de Base de Datos

• Usuarios de Base de Datos

• Contexto de Ejecución

• Permisos a sentencias y objetos

• Modelo de Seguridad en SQL Server

• Inicios de Sesión - Usuarios

• Esquemas de Base de Datos

• Usuarios de Base de Datos

• Contexto de Ejecución

• Permisos a sentencias y objetos

Page 86: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 110

Modelo de Seguridad en SQL Server

ConexiConexióón con el Servidor de SQL Servern con el Servidor de SQL Server

Establecer Credenciales de Inicio de SesiEstablecer Credenciales de Inicio de Sesióónn

Establecer un Contexto de Base de DatosEstablecer un Contexto de Base de Datos

Verificar Permisos para las accionesVerificar Permisos para las acciones

Solicitud de conexión de Red

Solicitud de Inicio de Sesión en SQL Server

Cambio a una BBDD y autorización de acceso

Intento de realizar alguna acción

Page 87: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 111

Jerarquía de Seguridad

Page 88: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 112

Modo de autentificación (acceso al servidor)� Windows (S.O.) � Servidor SQL Server

Acceso y gestión de una BD (autorización: User)

� Permisos a� objetos de BD� ejecución de sentencias

� Permisos a través de roles: � del servidor o de BD� definidos por el usuario

(Inicio de sesión: Login)

Inicios de sesión - Usuarios

Page 89: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 113

Inicios de sesión preestablecidos

Page 90: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 114

Tipos de Inicios de sesión

Windows– Usuario

– Grupo

SQL Server

Certificado o Clave Asimétrica

Asociados a Credenciales– Para acceso a recursos externos

– CREATE CREDENTIAL

Page 91: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 115

Tipos de Inicios de sesión (y 2)

Opciones de Administración – Podemos forzar el cambio de contraseña en el primer inicio de sesión: MUST_CHANGE

– Exigir directivas de contraseña

– Desbloquear Cuentas: UNLOCK

– Deshabilitar un inicio de sesión: DISABLE

– BD de conexión predeterminada

Page 92: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 116

Crear Inicios de sesión (y 3)

Gráficamente 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

Page 93: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 117

Roles fijos de Servidor

Page 94: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 118

ROLES FIJOS DE SERVIDOR

� sp_addsrvrolemember /sp_dropsrvrolemember� sys.server_role_members� sp_srvrolepermission� sys.server_permissions

Page 95: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 119

Esquemas

ANSI SQL-92:– Colección 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

Resolución de nombres uniforme

Gestión de permisos a nivel de esquema

Page 96: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 120

Seguridad de base de datos

Page 97: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 121

Conceder acceso a una BD

Page 98: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 122

ROLES FIJOS DE BASE DE DATOS

Page 99: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 123

Roles definidos por el usuario

Page 100: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 124

Definir usuario del GestorDefinir usuario del GestorDefinir usuario del Gestor

Page 101: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 125

Usuarios de Base de DatosCrear 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

Page 102: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 126

126

Roles de Base de Datos

CREATE ROLE <nombre>

sp_addrolemember <role>,<usuario>

sys.database_role_members

Rol Public

Page 103: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 127

Definir role de BDDefinir role de BDDefinir role de BD Rol de aplicación. Un usuario que se conecta a través de una aplicación que habilita el rol de aplicación, pierde todos sus privilegios, disponiendo exclusivamente los que le ofrece este rol. Permite establecer un nivel alto de seguridad, impidiendo el acceso vía ODBC, OLEDB.

Page 104: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 128

128

El Contexto de EjecuciónRepresentado por dos testigos de seguridad:– Inicio de Sesión 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 definición de conjuntos de permisos

personalizados

EXECUTE AS

SETUSER (descatalogado)

Page 105: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 129

129

El Contexto de Ejecución (ej.)USE Sales

GO

CREATE PROCEDURE dbo.usp_Demo

WITH EXECUTE AS 'CompanyDomain\SqlUser1'

AS

SELECT user_name()

GO

Page 106: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 130

Permisos a sentenciasPermisos a sentenciasPermisos a sentencias

Para otorgar permisos a acciones. Su sintaxis es:

GRANT { ALL | instrucción [ ,...n ] }

TO {usuario [ ,...n ] | role [ ,...n ] }

GRANT { ALL | instrucción [ ,...n ] }

TO {usuario [ ,...n ] | role [ ,...n ] }

instrucción (entre otras):

CREATE { DATABASE | DEFAULT | FUNCTION

| PROCEDURE | RULE | TABLE | VIEW }

ALTER { DATABASE | DEFAULT | FUNCTION| PROCEDURE | RULE | TABLE | VIEW }

BACKUP DATABASE

BACKUP LOG

instrucción (entre otras):

CREATE { DATABASE | DEFAULT | FUNCTION

| PROCEDURE | RULE | TABLE | VIEW }

ALTER { DATABASE | DEFAULT | FUNCTION| PROCEDURE | RULE | TABLE | VIEW }

BACKUP DATABASE

BACKUP LOG

Page 107: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 131

Permisos a objetosPermisos a objetosPermisos a objetos

Para otorgar permisos a objetos de la BD. Concede y quita permisos, inicialmente, el propietario de la BD. Su sintaxis es:

GRANT{ ALL [ PRIVILEGES ] | permiso [ ,...n ] }

{

[ ( columna [ ,...n ] ) ] ON { tabla | vista } | ON { tabla | vista } [ ( columna [ ,...n ] ) ]

| ON { procedimiento | procedimiento_extendido }

| ON { función}

} TO {usuario [ ,...n ] | role [ ,...n ] }[ WITH GRANT OPTION ]

[ AS { usuario | role } ]

GRANT{ ALL [ PRIVILEGES ] | permiso [ ,...n ] }

{ [ ( columna [ ,...n ] ) ] ON { tabla | vista } | ON { tabla | vista } [ ( columna [ ,...n ] ) ]

| ON { procedimiento | procedimiento_extendido }

| ON { función}

}

TO {usuario [ ,...n ] | role [ ,...n ] }[ WITH GRANT OPTION ]

[ AS { usuario | role } ]

permiso (entre otros): SELECT, INSERT, DELETE, UPDATE, EXECUTE.

WITH GRANT OPTION: el usuario al que se le otorga permiso, puede a su vez, otorgárselo a otro.

AS : usuario o role que establece el permiso

permiso (entre otros): SELECT, INSERT, DELETE, UPDATE, EXECUTE.

WITH GRANT OPTION: el usuario al que se le otorga permiso, puede a su vez, otorgárselo a otro.

AS : usuario o role que establece el permiso

Page 108: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 132

Ejemplos GRANTEjemplos GRANTEjemplos GRANT

GRANT INSERT, UPDATE, DELETE ON autores

TO Maria, Juan

GRANT INSERT, UPDATE, DELETE ON autores

TO Maria, Juan

• Permitir a María y a Juan, insertar, modificar y borrar en la tabla autores.

GRANT CREATE DATABASE, CREATE TABLE

TO Maria, Juan, [Servidor\Marta]

GRANT CREATE DATABASE, CREATE TABLE

TO Maria, Juan, [Servidor\Marta]

• Permitir a los usuarios Maria, Juan y Marta crear bases de datos y tablas

GRANT UPDATE( importe ) ON prestamo

TO Maria

GRANT UPDATE( importe ) ON prestamo

TO Maria

• Permitir a María actualizar el importe del préstamo.

Page 109: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 133

REVOKE (1)REVOKE (1)REVOKE (1)

Para denegar permisos a acciones. Su sintaxis es:

REVOKE { ALL | instrucción [ ,...n ] }

FROM {usuario [ ,...n ] | role [ ,...n ] }

REVOKE { ALL | instrucción [ ,...n ] }

FROM {usuario [ ,...n ] | role [ ,...n ] }

INSTRUCCIÓN (entre otras):

CREATE { DATABASE | DEFAULT | FUNCTION

| PROCEDURE | RULE | TABLE VIEW }

ALTER { DATABASE | DEFAULT | FUNCTION| PROCEDURE | RULE | TABLE | VIEW }

BACKUP DATABASE

BACKUP LOG

INSTRUCCIÓN (entre otras):

CREATE { DATABASE | DEFAULT | FUNCTION

| PROCEDURE | RULE | TABLE VIEW }

ALTER { DATABASE | DEFAULT | FUNCTION| PROCEDURE | RULE | TABLE | VIEW }

BACKUP DATABASE

BACKUP LOG

Page 110: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 134

REVOKE (2)REVOKE (2)REVOKE (2)

Para quitar permisos. Su sintaxis es:

REVOKE [ GRANT OPTION FOR ]

{ ALL [ PRIVILEGES ] | permiso [ ,...n ] }

{ [ ( columna [ ,...n ] ) ] ON { tabla | vista }

| ON { tabla | vista } [ ( columna [ ,...n ] ) ]

| ON { procedimiento | procedimiento_extendido }

| ON { función}}

{ TO | FROM }

{usuario [ ,...n ] | role [ ,...n ] }[ CASCADE ]

[ AS { usuario | role } ]

REVOKE [ GRANT OPTION FOR ]

{ ALL [ PRIVILEGES ] | permiso [ ,...n ] } {

[ ( columna [ ,...n ] ) ] ON { tabla | vista }

| ON { tabla | vista } [ ( columna [ ,...n ] ) ]

| ON { procedimiento | procedimiento_extendido }

| ON { función}

}

{ TO | FROM }

{usuario [ ,...n ] | role [ ,...n ] }[ CASCADE ]

[ AS { usuario | role } ]

GRANT OPTION FOR : se quita al usuario la capacidad de dar o quitar permisos que le fueron concedidos por la cláusula WITH GRANT OPTION

permiso: SELECT, INSERT, DELETE, UPDATE, REFERENCES, EXECUTE, CREATE, etc.

CASCADE : se quita el permiso al usuario/role y a los usuarios/roles a los que dio permiso, si se le concedióGRANT OPTION.

AS : usuario o role que quita el permiso

GRANT OPTION FOR : se quita al usuario la capacidad de dar o quitar permisos que le fueron concedidos por la cláusula WITH GRANT OPTION

permiso: SELECT, INSERT, DELETE, UPDATE, REFERENCES, EXECUTE, CREATE, etc.

CASCADE : se quita el permiso al usuario/role y a los usuarios/roles a los que dio permiso, si se le concedióGRANT OPTION.

AS : usuario o role que quita el permiso

Page 111: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 135

Ejemplos REVOKEEjemplos REVOKEEjemplos REVOKE

REVOKE SELECT ON dbo.dameprecio

TO Maria

REVOKE SELECT ON dbo.dameprecio

TO Maria

• Impedir que María ejecute la función “dameprecio”.

REVOKE CREATE VIEW

TO Maria, [Servidor\Marta]

REVOKE CREATE VIEW

TO Maria, [Servidor\Marta]

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

Page 112: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 136

Permisos efectivos

Page 113: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 137

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.U5

U2Admon U4

U3

U1

A tener en cuenta

Page 114: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 138

• No se puede establecer privilegios a nivel de fila (p. ej. cada alumno sólo vea

sus notas)

• Hay extensiones para proporcionar control de acceso en el nivel de las filas y

para trabajar con gran número de usuarios pero aún no están normalizadas.

• Utilizar vistas para restringir la información.

• Establecer la seguridad en aplicaciones de BD:

- Usuarios

• Usuarios de domino / de gestor con sus privilegios

• Usuarios de dominio / de gestor con rol de aplicación

• Usuario único con privilegios

- Crear BD de seguridad donde se establece con detalle las acciones que cada

usuario de aplicación puede hacer

• Código de aplicación se entremezcla con el de autorización

• Más difícil de garantizar la existencia de “agujeros” de seguridad

Limitaciones de seguridad

Page 115: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 139

Estrategias de seguridad

Page 116: 03- Ldd y Lmd - SQL Server

Marta Zorrilla 2009-2010 140

Estrategias de seguridad (y 2)