SQL Server
SQL Server
SQL Server 2000 ofrece el soporte de informacin para las tradicionales aplicaciones Cliente/Servidor, las cuales estn conformadas por una interfaz a travs de la cual los clientes acceden a los datos por medio de una LAN. SQL Server 2000 est diseado para trabajar con dos tipos de bases de datos : OLTP (OnLine Transaction Processing) Son bases de datos caracterizadas por mantener una gran cantidad de usuarios conectados concurrentemente realizando ingreso y/o modificacin de datos. Por ejemplo : entrada de pedidos en lnea, inventario, contabilidad o facturacin. OLAP (OnLine Analytical Processing) Son bases de datos que almacenan grandes cantidades de datos que sirven para la toma de decisiones, como por ejemplo las aplicaciones de anlisis de ventas SQL Server incluye un conjunto de herramientas que facilitan la instalacin y administracin del servidor as como un conjunto de herramientas que facilitan el diseo e implementacin de base de datos, entre ellos podemos mencionar: SQL Server 2000 Database Engine, diseado para almacenar detalladamente los registros de las operaciones transaccionales (OLTP), este motor es responsable de mantener la seguridad de los datos, proveer un adecuado nivel de tolerancia a fallos, optimizar las consultas, emplear adecuadamente los bloqueos de recursos para optimizar la concurrencia, etc. SQL Server 2000 Analysis Services, provee herramientas para consultar informacin almacenada en data warehouses y data marts, como por ejemplo cuando se desea obtener informacin totalizada acerca de los niveles de ventas mensuales por regiones de ventas, etc Modos de autenticar las cuentas de los usuarios SQL Server valida a los usuarios en dos niveles de seguridad: una a travs de un Inicio de sesin que establece el hecho de realizar la conexin a SQL Server y otro a partir de la validacin de los permisos que tienen los usuarios sobre una base de datos. INICIO DE SESIN Todos los usuarios deben tener un Inicio de sesin para poder conectarse a SQL Server, para esto SQL Server reconoce 2 mecanismos de autentificacin: SQL Server es cuando el usuario debe proveer de un usuario y una contrasea que sern validados por el propio SQL Server cuando el cliente intente conectarse. Windows NT es cuando una cuenta o grupo de Windows NT controla el acceso a SQL Server, el cliente no provee usuario y contrasea, ya que se emplear la cuenta con la que se ingresa al sistema operativo. Para modificar la autenticacin realice los siguientes pasos: 1 Haga clic derecho sobre el servidor, en el men contextual haga clic sobre la opcin Properties. 2 En la caja de dilogo haga clic sobre la ficha Seguridad, se presentar la siguiente pantalla:
Seleccione la opcin SQL Server y Windows cuando desee brindar servicios de informacin a terceros por ejemplo a usuarios de internet. Seleccione Slo Windows cuando los datos estarn disponibles slo a los empleados de la organizacin. En cualquiera de los dos casos debe pulsar Aceptar, espere por un instante mientras SQL Server 2000 detiene los servicios y los vuelve a iniciar para hacer efectivos los cambios. Hecho esto Ud. podr definir sus Inicios de sesin de acceso a SQL Server, para ello realice la siguiente secuencia desde el Administrador Empresarial: Expanda la carpeta Seguridad del Administrador Empresarial y haga clic derecho sobre Inicios de sesin En la ficha Acceso a base de datos podr especificar que el Inicio de sesin se definir como usuario de alguna de las bases de datos existentes. Pulse Aceptar al finalizar. La creacin de Inicios de sesin tambin es posible desde el Analizador de Consultas, que es una herramienta a la cual accesamos a partir de la siguiente secuencia: /* Activar Base de datos */
Use Master GO
Expanda la base de datos donde desea definir al nuevo usuario y haga clic derecho sobre la carpeta Usuarios
Adems de los Inicios de sesin y usuarios SQL Server brinda un conjunto de roles por servidor y por base de datos que son derechos predefinidos que podrn especificarse por cada usuario de ser necesario. Tambin es posible crear roles personalizados. Los roles son los siguientes:
Roles por Servidor Rol Descripcin
Crea y modifica bases de datos. Administra los archivos de datos. Administra los procesos de SQL Server. Administra los Inicios de sesin. Opciones de configuracin del servidor. Instala la replicacin. Realiza cualquier actividad.
public Mantiene los permisos En forma predeterminada para todos los usuarios. db_owner Realiza cualquier actividad en la BD db_accessadmin Agrega o retira usuarios y/o roles db_ddladmin Agrega, modifica o elimina objetos db_SecurityAdmin Asigna permisos sobre objetos o sobre sentencias db_backupoperator Backup y Restore de la base de datos db_datareader Lee informacin desde cualquier tabla db_datawriter Agrega, modifica o elimina datos
Archivos y grupos de archivos fsicos de la base de datos Un archivo de base de datos no es mas que un archivo del sistema operativo. Una base de datos se distribuye en por lo menos dos archivos, aunque es muy probable que sean varios los archivos de base de datos que se especifican al crear o al modificar una base de datos. Principalmente SQL Server divide su trabajo en un archivo para datos y otro para el registro de las transacciones (log). SQL Server 2000 permite los tres siguientes tipos de archivos: Archivos de datos primarios Toda base de datos tiene un archivo de datos primario que realiza el seguimiento de todos los dems archivos, adems de almacenar datos. Por convenio este archivo tiene la extensin MDF. Archivos de datos secundarios Una base de datos puede tener cero o varios archivos de datos secundarios. Por convenio la extensin recomendada para los archivos de datos secundarios es NDF. Archivos de registro (LOG) Todas las bases de datos por lo menos tendrn un archivo de registro que contiene la informacin necesaria para recuperar todas las transacciones que suceden sobre la misma. Por convenio la extensin de este archivo es LDF. Por lo tanto al crear una base de datos, debemos considerar los siguientes premisas y reglas para el almacenamiento de los datos: 1. Todas las Bases de Datos tienen un archivo de base de datos primario (.mdf) y uno para el Log de Transacciones (.ldf). Adems puede tener archivos de datos secundarios (.ndf). 2. Cuando se crea una Base de Datos, una copia de la Base de Datos Model, la cual incluye tablas del sistema, es copiada en la Nueva Base de Datos. 3. La Data es almacenada en bloques de 8-kilobytes (KB) de espacio de disco contiguo llamado pginas. 4. Las filas o registros no pueden atravesar pginas. Esto, es, que la mxima cantidad de datos en una fila de datos simple es de 8060 bytes. 5. Las tablas y los ndices son almacenados en Extents. Un Extents consta de ocho pginas contiguas, o sea 64 KB. 6. El Log de Transacciones lleva toda la informacin necesaria para la recuperacin de la Base de Datos en una eventual cada del sistema. Por default, el tamao del Log de Transacciones es del 25% del tamao de los archivos de datos. Use esta configuracin como punto de partida y ajuste de acuerdo a las necesidades de su aplicacin.
Archivos de Registro (LOG de Transacciones) El LOG de transacciones archiva todas las modificaciones de los datos tal cual son ejecutados. El proceso es como sigue: 1. Una modificacin de datos es enviada por la aplicacin cliente. 2. Cuando una modificacin es ejecutada, las pginas afectadas son ledas del disco a memoria (Buffer Cache), provista de las pginas que no estn todava en la Data Cache del query previo. 3. Cada comando de modificacin de datos es archivado en el LOG. El cambio siempre es archivado en el LOG y es escrito en el disco antes que el cambio sea hecho en la Base de Datos. Este tipo de LOG es llamado LOG de tipo write-ahead. 4. Una vez que las pginas de datos residen en el Buffer Cache, y las pginas de LOG son archivadas sobre el disco en el archivo del LOG, el proceso de CHECKPOINT, escribe todas las transacciones completas a la Base de Datos en el disco. Si el sistema falla, automticamente el proceso de recuperacin usa el LOG de Transacciones para llevar hacia delante todas las transacciones comprometidas (COMMIT) y llevar hacia atrs alguna transaccin incompleta (ROLLBACK). Los marcadores de transaccin en el LOG son usados durante la recuperacin automtica para determinar los puntos de inicio y el fin de una transaccin. Una transaccin es considerada completa cuando el marcador BEGIN TRANSACTION tiene un marcador asociado COMMIT TRANSACTION. Las pginas de datos son escritas al disco cuando ocurre el CHECKPOINT. Creacin de Base de Datos
Se puede crear una base de datos de distintas maneras, utilizando el Wizard, desde el Administrador Empresarial o a travs del Query Analizer.
Desde el Analizador de Consultas
Conteste que No, luego de lo cual en el Administrador Empresarial podr observar la nueva base de datos.
Desde el Administrador Empresarial
En forma predeterminada podrn hacerlos los usuarios que pertenecen al rol sysadmin y dbcreator. Los miembros de las funciones fijas de servidor sysadmin y SecurityAdmin pueden conceder permisos CREATE DATABASE a otros inicios de sesin. Los miembros de las funciones fijas de servidor sysadmin y dbcreator pueden agregar otros inicios de sesin a la funcin dbcreator. El permiso CREATE DATABASE debe concederse explcitamente; no se concede mediante la instruccin GRANT ALL. Estos permisos se limitan a unos cuantos inicios de sesin para mantener el control de la utilizacin de los discos del equipo que ejecuta SQL Server. Ejemplo 1 Crear la base de datos Prueba1 con los parmetros En forma predeterminada.
Use Master GO Create Database Prueba1 GO
Ejemplo 2 Crear la base de datos Prueba2 con un archivo de datos de 10Mb, un tamao mximo de 20Mb y un crecimiento de 1Mb., el archivo de registro debe asumir los valores por default.
Use Master GO Create Database Prueba2 On Primary (NAME = Prueba2_Data, FILENAME = C:\Program Files\Microsoft SQL Server\MSSQL\data\Prueba2 _Data.Mdf, SIZE = 10Mb, MAXSIZE = 20Mb, FILEGROWTH= 1Mb) GO
Ejemplo 3 Crear la base de datos Prueba3 especificando un archivo de datos con un tamao inicial de 15Mb, un tamao mximo de 30Mb y un crecimiento de 5Mb., el archivo de registro debe tener un tamao inicial de 5MB y uno mximo de 10MB, el crecimiento debe ser de 1MB.
Use Master GO Create Database Prueba3 On Primary (NAME = Prueba3_Data, FILENAME = C:\Program Files\Microsoft SQL Server\MSSQL\data\Prueba3 _Data.Mdf SIZE = 15Mb, MAXSIZE = 30Mb, FILEGROWTH= 5Mb) Log On (NAME = Prueba3_Log, FILENAME = C:\Program Files\Microsoft SQL
Otra de las formas de comprobar la creacin de las bases de datos es mostrando las filas de la tabla del sistema SysDatabases.
Use Master GO Select DbID, Name From SysDatabases GO
Ejemplo 1
Modificar la base de datos Prueba2, de tal manera que le debe agregar un archivo de datos secundario de 5MB y un tamao mximo de 10 MB. con un crecimiento de 1MB. Antes de ejecutar el siguiente comando utilice Sp_HelpDB Prueba2, para comparar luego con los resultados despus de ejecutar la sentencia.
USE master GO ALTER DATABASE Prueba2 ADD FILE ( NAME = Prueba2Sec_Data, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\data\ Prue2Data.ndf', SIZE = 5MB, MAXSIZE = 10MB, FILEGROWTH = 1MB ) GO Sp_HelpDB Prueba2 GO
Ejemplo 2
Crear dos grupos de archivos en la base de datos Prueba2, el primer grupo se llamar CONSULTORES y el otro se llamar OPERACIONES.
ALTER DATABASE Prueba2 ADD FILEGROUP Consultores GO ALTER DATABASE Prueba2 ADD FILEGROUP Operaciones GO -- Verifique la informacin con las siguientes instrucciones: Use Prueba2 GO Sp_HelpFileGroup GO
Ejemplo 3
A cada uno de los grupos creados anteriormente aadale dos archivos de datos, para ello considere lo siguiente: los archivos del grupo CONSULTORES deben tener un tamao de 10 MB. cada uno, con un tamao mximo de 20 MB y un crecimiento de 2 MB., mientras que los del grupo OPERACIONES tendrn un tamao inicial de 5 MB y un mximo de 30 MB. con un crecimiento de 5 Mb.
Use Master GO ALTER DATABASE Prueba2 ADD FILE (NAME = DatCons01, FILENAME = C:\Program Files\Microsoft Server\MSSQL\data\DatCons1.ndf, SIZE = 10MB, MAXSIZE = 20MB, FILEGROWTH = 2MB), (NAME = DatCons02, FILENAME = C:\Program Files\Microsoft Server\MSSQL\data\DatCons2.ndf, SIZE = 10MB, MAXSIZE = 20MB, FILEGROWTH = 2MB), TO FILEGROUP CONSULTORES GO ALTER DATABASE Prueba2 ADD FILE (NAME = DatOper01, FILENAME = C:\Program Files\Microsoft Server\MSSQL\data\DatOper1.ndf, SIZE = 5MB, MAXSIZE = 30MB, FILEGROWTH = 5MB), (NAME = DatOper02, FILENAME = C:\Program Files\Microsoft Server\MSSQL\data\DatOper2.ndf, SIZE = 5MB, MAXSIZE = 30MB, FILEGROWTH = 5MB), TO FILEGROUP OPERACIONES GO
SQL
SQL
SQL
Ejemplo 4 Modificar el tamao del DatOper01 asignndole como nuevo tamao mximo 40 Mb.
Use Master GO ALTER DATABASE Prueba2 MODIFY FILE ( NAME = DatOper01, MAXSIZE = 40Mb) GO
El resultado sera: DBCC execution completed. If DBCC printed error messages, contact your system administrator. The database is now single usuario.
/* En este instante la base de datos puede ser renombrada */ Sp_RenameDB Prueba3, NuevoNombre GO /* Compruebe el correcto renombrado de la base de datos y luego retire la opcin single usuario de la base de datos */ Select Name From SysDatabases GO Sp_DBOption 'NuevoNombre', 'Single Usuario', False GO
Creacin de Tablas
Tipos de datos definidos por el usuario
Los tipos de datos definidos por el usuario estn basados en los tipos de datos disponibles a travs de SQL Server 2000. Los tipos de datos definidos por el usuario se pueden emplear para asegurar que un dato tenga las mismas caractersticas sobre mltiples tablas. Para crear un tipo de dato puede emplear el Administrador Empresarial expandiendo la base de datos donde desea crear el dato, luego deber hacer un clic derecho sobre Tipos de datos definidos por el Usuario y seleccionar Nuevo tipo de datos definido por el usuario, tal como lo muestra la siguiente representacin:
Ejemplo 1 En este ejemplo se crear la base de datos Ejemplo y en ella se definir el tipo de datos RUC de tipo char(11) el cual no permitir valores NULL.
USE master GO CREATE DATABASE Ejemplo ON PRIMARY (NAME = 'Ejem_Data', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\data\EjemData.Mdf', SIZE = 20Mb, MAXSIZE = 40Mb, FILEGROWTH = 2Mb) LOG ON (NAME = 'Ejem_Log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\data\EjemLog.Ldf', SIZE = 5Mb, MAXSIZE = 10Mb, FILEGROWTH = 1Mb) GO Use Ejemplo GO Sp_Addtype RUC, 'CHAR(11)', 'NOT NULL' GO
Ejemplo 2 En este ejemplo se crear el tipo de datos Onomstico de tipo datetime y que permitir valores NULL.
EXEC sp_addtype Onomastico, datetime, 'NULL' GO
Los tipos de datos que se agregan son inscritos en la tabla systypes, estos tipos de datos son eliminados con el procedimiento almacenado del sistema sp_droptype. Ejemplo:
Use Ejemplo GO Sp_droptype Onomastico GO Select * From Systypes GO Sp_droptype RUC GO Select * From Systypes GO
La informacin usada por SQL Server y sus componentes son almacenadas en tablas especiales denominadas como tablas del sistema. Estas tablas no deben alterarse directamente por el usuario Las tablas del sistema almacenan informacin, llamada Metadata, acerca del sistema y de los objetos de las bases de datos. Todas las tablas del sistema comienzan con el prefijo SYS.
Son las tablas donde se almacena la informacin que los usuarios utilizan para sus operaciones. Esta informacin existir hasta que se elimine explcitamente.
- Temporales
Estas son tablas similares a las permanentes que se graban en tempdb, y son eliminadas automticamente cuando ya no son usadas. Hay dos tipos de tablas temporales, locales y globales, difieren una de la otra en sus nombres, su visibilidad y su mbito de vida. Tablas Temporales Locales. El primer carcter del nombre de #, su visibilidad es solamente para la conexin actual del usuario y son eliminadas cuando el usuario se desconecta. Tablas Temporales Globales. Su nombre comienza con ##, su visibilidad es para cualquier usuario, y son eliminadas luego que todos los usuarios que la referencian se desconectan del SQL Server.
Creacin de tablas
Consideraciones al crear tablas
billones de tablas por base de datos 1024 columnas por tabla 8060 es el tamao mximo de registro (sin considerar datos image, text y ntext) Al momento de definir una columna se puede especificar si la columna soporta o no valores NULL. Para crear tablas debe utilizar la sentencia CREATE TABLE,
Ejercicios:
RepVentas
Nombre de Columna Tipo de dato
NOT NULL
NOT NULL
Tambin podemos crear tablas a partir de sentencias del Transact para ingrese al Analizador de Consultas y ejecute las siguientes instrucciones:
Use Ejemplo GO CREATE TABLE Oficinas ( oficina integer not null, ciudad varchar(15) not null, region varchar(10) not null,
CREATE TABLE pedidos (num_pedido integer not null,fecha_pedido datetime not null, clie integer not null, rep integer, fab char(3)not null, producto char(5) not null, cant integer not null, importe money not null) CREATE TABLE productos (id_fab char(3) not null, id_producto char(5) not null, descripcion varchar(20) not null, precio money not null, existencias integer not null)
Con SQL Server 2000 se puede modificar la estructura de las tablas, se podr agregar, eliminar o modificar las caractersticas de las columnas de la tabla.
Create Table Prueba ( cod char(1) NOT NULL, nom char(20) NULL, pat varchar(20) NOT NULL, mat varchar(20) NOT NULL) GO
Ahora modificaremos el campo nom para asignarle como tipo de datos varchar con la misma longitud y que no permita valores NULL
ALTER TABLE Prueba ALTER COLUMN nom varchar(20) NOT NULL GO
En SQL Server 2000 se puede definir columnas que obtengan valores generados por el sistema, para ello podemos hacer uso de:
Propiedad Identity
Permite generar valores secuenciales del sistema, este tipo de valores pueden ser utilizados en columnas que sern empleadas como primary key. Para emplear esta propiedad debe especificar un valor de inicio y uno de incremento. Recuerde que este tipo de columnas no son editable.
Se puede definir una columna de valor incremental al momento de crear su tabla o alterar su estructura. Adicionalmente, se puede definir una "semilla" que se utilizara como valor inicial, en la primera fila, mientras que se utilizara el valor "incremento" para ir calculando los siguientes. Para realizar esta tarea desde el Administrador Corporativo, bien en la creacin o en la modificacin de una tabla, tenemos los campos: identidad (identity), iniciacin de identidad, e incremento de identidad.
Podemos utilizar cualquier tipo de dato numrico, en la figura anterior hemos utilizado un int, cuyo valor inicial es 100, y su incremento 1. En el siguiente ejemplo, crea la misma tabla "alumnos" con un campo que representa un cdigo de identificacin que tendr valores a partir de 100: CREATE TABLE alumnos (Nombre char(20), ident int IDENTITY (100,1), curso char(5), edad int null) En el siguiente ejemplo, se altera una tabla para agregar una columna autoincremental: ALTER TABLE ex_alumnos ADD ex_alumno_Id INT IDENTITY (100,1)
Ejemplo:
USE EJEMPLO GO ALTER TABLE Prueba ADD cod integer Identity(1,1) NOT NULL GO
Para ver informacin sobre la columna IDENTITY puede utilizar las funciones:
Select Ident_Seed('Prueba') /* Retorna el valor de inicio de la columna identity */ GO Select Ident_Incr('Prueba') /* Retorna el valor de incremento de la columna identity */
El tipo de dato uniqueidentifier y la funcin NEWID trabajan unidas para poder generar valores en el formato GUID (Global Unique Identifier). Este tipo de datos no genera valores automticamente, sino que por el contrario hay que definirle un valor En forma predeterminada que especifique el empleo de la funcin NEWID. GUID en SQL Server es bueno o malo?
Desde la version 7.0 (o 2000, la verdad no recuerdo), SQL Server incorpora el campo Uniqueidentifier, que es un campo computado, que suele generar un GUID (Global Unique Identifier). La caracteristica de este campo, que mediante la funcion NEWID, genera un codigo de 128 bits unico en todo el espacio y universo conocido por el hombre. La pregunta del millon, es para que demonio queremos hacer algo asi? Principalmente para identificar uniquivocamente un registro de otro, o sea, ser la clave primaria de la tabla. El problema que este tipo de campos, es cuando se usa mal. El GUID es ideal en un Datawharehousing, con tablas enormes de mas de 4 mil millones de registros, donde el campo Identity no nos sirve mas, o en replicaciones de tablas con un volumen enorme. En estos casos, GUID puede ser la mejor opcion (y tal vez, la unica).
El tema pasa cuando se quiere reemplazar en bases "normales" el uso de Identity por GUID para solucionar los problemas de replicacion que tienen los Identity. Bueno, es una PESIMA idea. Y voy a enumerar los motivos:
Costo de I/O: En primer lugar, un campo Uniqueidentifier ocupa 16 bytes contra 4 bytes de un int. En una base de datos de 10 millones de registros, esto significa 8 megas de diferencia. Y como 95% probable que este campo sea tambien la PK de la tabla, el indice tambien ocuparia 8 megas mas. Con lo cual, tendriamos 16 megas de diferencia entre una tabla con un campo GUID y otra con un Identity. El problema no pasa por el espacio en disco, que hoy en dia es baratisimo, sino por el costo de I/O que representa esto. Recordemos que las operaciones de I/O son las mas lentas en una base de datos. Costo de Insercion: Generalmente los campos GUID e Identity son PK y en su mayoria son un clustered index. La caracteristica de este tipo de indice, es que orden fisicamente la pagina de datos segun el valor del indice. Si tenemos un indice que se incrementa secuencialmente esto no es ningun problema, ya que el orden es automatico. Ahora, si tenemos valores aleatorios, que es el caso del GUID, estamos fritos. Porque cada vez que insertamos un registro, el SQL tiene que insertar de manera ordenada este registro, lo que genera un overhead y page spliting impresionante. Insertar un campo cuyo cluster index es un GUID tiene un costo ALTISIMO. Una solucion que que se incorporo recien en el SQL2005 es la funcion NEWSEQUENTIALID, que lo que hace es generar GUID secuenciales (en realidad no son secuenciales, sino mayores al ultimo generado), lo que nos evita los page spliting. Con lo cual, si vas a usar GUID y SQLServer 2005, USA ESTA FUNCION!!!
Debugueo: Bueno, esto no es un problema tanto a nivel performance, sino logico. Si tenemos que debuguear con un campo Identity, en el peor de los casos, nos tenemos que acordar 10 numeros, pero en la enorme mayoria de los casos, cuando debugueamos lidiamos con campos identity menores a 1.000.000 (generalmente), que es mas facil de recordar. En cambio, con un campo GUID SIEMPRE vamos a estar lidiando con una secuencia de numeros y letras enorme que nunca vamos a recordar.
Este ejemplo crea una tabla cust con el tipo de datos uniqueidentifier y utiliza NEWID para llenarla con un valor predeterminado. Al asignar como valor predeterminado NEWID(), cada fila nueva y existente tendr un valor nico en la columna cust_id.
-- Creating a table using NEWID for uniqueidentifier data type. CREATE TABLE cust ( cust_id uniqueidentifier NOT NULL DEFAULT newid(), company varchar(30) NOT NULL, contact_name varchar(60) NOT NULL, address varchar(30) NOT NULL, city varchar(30) NOT NULL, state_province varchar(10) NULL, postal_code varchar(10) NOT NULL, country varchar(20) NOT NULL, telephone varchar(15) NOT NULL, fax varchar(15) NULL ) GO -- Inserting data into cust table. INSERT cust (cust_id, company, contact_name, address, city, state_province, postal_code, country, telephone, fax) VALUES (newid(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL, '90110', 'Finland', '981-443655', '981-443655') INSERT cust (cust_id, company, contact_name, address, city, state_province, postal_code, country, telephone, fax)
VALUES (newid(), 'Wellington Importadora', 'Paula Parente', 'Rua do Mercado, 12', 'Resende', 'SP', '08737-363', 'Brazil', '(14) 555-8122', '') INSERT cust (cust_id, company, contact_name, address, city, state_province, postal_code, country, telephone, fax) VALUES (newid(), 'Cactus Comidas para Ilevar', 'Patricio Simpson', 'Cerrito 333', 'Buenos Aires', NULL, '1010', 'Argentina', '(1) 135-5555', '(1) 135-4892') INSERT cust (cust_id, company, contact_name, address, city, state_province, postal_code, country, telephone, fax) VALUES (newid(), 'Ernst Handel', 'Roland Mendel', 'Kirchgasse 6', 'Graz', NULL, '8010', 'Austria', '7675-3425', '7675-3426') INSERT cust (cust_id, company, contact_name, address, city, state_province, postal_code, country, telephone, fax) VALUES (newid(), 'Maison Dewey', 'Catherine Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68') GO
Para poder observar un ejemplo de lo antes explicado, ejecute la siguiente secuencia de comandos:
CREATE TABLE Prueba2 ( cdigo uniqueidentifier NOT NULL DEFAULT NEWID(), nombre char(20) NOT NULL) GO INSERT Prueba2 (nombre) VALUES (Mauricio) GO INSERT Prueba2 (nombre) VALUES (Gina) GO INSERT Prueba2 (nombre) VALUES (Cristina) SELECT * FROM Prueba2 CODIGO NOMBRE
Compruebe que las tablas Prueba y Prueba2 estn eliminadas, con la siguiente instruccin:
Implementar Restricciones
Uno de los principales objetivos de una base de datos relacional es cuidar y controlar la integridad de datos, la cual podra perderse ante operaciones que modifican la informacin como: INSERT, UPDATE y DELETE. Por ejemplo se puede perder la integridad de datos ante alguna de las siguientes situaciones: Se puede registrar un pedido de un producto no existente Podra modificarse los datos existentes con valores incorrectos Los cambios a la base de datos podran aplicarse parcialmente, por ejemplo si se registra un pedido sin actualizar el stock del producto requerido. SQL Server provee de mltiples medios para controlar la integridad de datos, como por ejemplo: Datos Requeridos, es una de las restricciones mas sencillas que especifican que columnas permiten valores nulos y que columnas no. Al momento de definir las columnas de una tabla podr asignar a cada columna la especificacin NULL o NOT NULL. Control de validez, permite controlar los valores que se le asignarn a una columna. Por ejemplo en una columna que guarde promedios de estudiantes se podra controlar que el rango de valores se encuentre entre 0 y 10. Integridad de entidad, referido a que una clave principal asegura la unicidad de cada registro. Integridad referencial, asegura las relaciones entre las claves primarias y claves forneas, por ejemplo al agregar un pedido controlar que el cdigo de producto que se especifica en el pedido exista en la tabla de productos. Reglas comerciales, las modificaciones en la base de datos deben cumplir con ciertos requisitos para poder mantener la informacin ntegra, por ejemplo en el caso anteriormente mencionado, el producto podra existir pero el stock encontrarse en 0, de tal manera que no debera registrarse el pedido. SQL Server para poder forzar la integridad de datos propone dos modalidades: Integridad Declarativa Se debe definir el criterio de consistencia como criterio de la definicin del objeto. Para utilizar integridad declarativa se puede emplear constraints, defaults y rules. Integridad por Procedimientos Se pueden escribir procedimientos almacenados y desencadenadores (Triggers) para poder forzar la integridad de datos. Aunque las restricciones muy complejas podran implementarse a travs de lenguajes de programacin y otras herramientas clientes. En esta parte del captulo revisaremos la integridad declarativa definindola a partir de los CONSTRAINTS. Los CONSTRAINTS son un mtodo estndar de forzar la integridad de datos, Son validaciones a Nivel Base de DATOS aseguran que los datos ingresados a las columnas sean vlidos y que las relaciones entre las tablas se mantendr. Los constraints pueden definirse al momento de crear la tabla, aunque tambin es posible hacerlo despus de que las tablas se han creado.
O sea... NOT NULL = Obliga a contener un dato. PRIMARY KEY = No permite valores duplicados no nulos. Permite acceder rpido a los datos. FOREIGN KEY = es un ndice que hace referencia al PK de otra tabla con el fin de validar la existencia del dato ingresado. LA PK QUE SE HACE MEDIANTE RELACION ESTIRANDO UNA TABLA A OTRA CHECK = Restriccin sobre el dominio, entendiendo dominio por los valores vlidos para el tipo de dato especificado. PONER RESTRICCION TIPO CONDICION edad >= 18 and edad <=65 UNIQUE = Impide la asignacin de valores repetidos, cuando un ndice para la columna o las columnas especificadas. DEFAULT = Asigna valores por omisin en caso que no le asigne algn dato. Ejercicio. Crear una tabla personas Nombre verchar (30) Edad tinyint
Sexo char (1) ciPadre int ciMadre int Pasos: 1- Crear la tabla 2- Ir a disear tabla 3- Ir a administracin de Restricciones (aparece propiedades) 4- Cuadro de propiedades Nueva 5- Restriccin CHECK, (poner condicin en campo) edad >= 18 and edad <=65 Cerrar 6- Cuadro de propiedades, Restriccin CHECK nueva sexo ='M' or sexo = 'F' cerrar 7- Ir a administracin de Restricciones (aparece propiedades) 8- ndices y Claves/ nueva 9- Desplegar nombre de columna/ elegir nombre/ marcar crear con UNIQUE y cerrar 10- En CI darle como clave primaria PRIMARY KEY (La llavecita) 11- NOT NULL en ci, nombre, ciPadre y ciMadre 12- DEFAULT (en valor predeterminado)en ci, ciPadre, ciMadre con oooooooo y nombre con VACIO 13- Para el FOREIGN KEY se realiza un diagrama de relacin donde se asigna al campo FK de referencia a la otra tabla donde esta el valor FK SECUENCIA SQL EN ANALIZADOR
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_personas_personas]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[personas] DROP CONSTRAINT FK_personas_personas GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_personas_personas1]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[personas] DROP CONSTRAINT FK_personas_personas1 GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[personas]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[personas] GO CREATE TABLE [dbo].[personas] ( [ci] [int] NOT NULL , [nombre] [varchar] (30) COLLATE Modern_Spanish_CI_AS NOT NULL , [edad] [tinyint] NULL , [sexo] [char] (1) COLLATE Modern_Spanish_CI_AS NULL , [cipadre] [int] NOT NULL , [cimadre] [int] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[personas] WITH NOCHECK ADD CONSTRAINT [PK_personas] PRIMARY KEY CLUSTERED ( [ci] ) ON [PRIMARY] GO ALTER TABLE [dbo].[personas] WITH NOCHECK ADD CONSTRAINT [DF_personas_sexo] DEFAULT ('M') FOR [sexo], CONSTRAINT [IX_personas] UNIQUE NONCLUSTERED ( [nombre] ) ON [PRIMARY] , CONSTRAINT [CK_personas] CHECK ([edad] >= 18 and [edad] <= 65), CONSTRAINT [CK_personas_1] CHECK ([sexo] = 'M' or [sexo] = 'F') GO ALTER TABLE [dbo].[personas] ADD CONSTRAINT [FK_personas_personas] FOREIGN KEY ( [cipadre] ) REFERENCES [dbo].[personas] ( [ci] ), CONSTRAINT [FK_personas_personas1] FOREIGN KEY
Un constraint de tipo PRIMARY KEY asegura la unicidad de cada fila en la tabla, slo se podr definir uno por tabla y debemos recordar que no permite valores NULL. En forma predeterminada crea un ndice CLUSTERED. Ejemplos: Implementar un PRIMARY KEY Constraint que asegure la unicidad de cada cliente.
Use Ejemplo GO Select * From Clientes /* Note el orden de los cdigos de clientes */ GO ALTER TABLE Clientes ADD CONSTRAINT PK_num_clie PRIMARY KEY (num_clie) GO Select * From Clientes /* Note que las filas aparecen ordenadas */ GO
Implementar un PRIMARY KEY Constraint que asegure la unicidad de cada representante de ventas.
Select * From RepVentas /* Note el orden de los cdigos de empleados */ GO ALTER TABLE RepVentas ADD CONSTRAINT PK_num_empl PRIMARY KEY (num_empl) GO Select * From RepVentas /* Note que las filas aparecen ordenadas */ GO
Select * From Productos /* Note el orden de los cdigos de producto */ GO ALTER TABLE Productos ADD CONSTRAINT PK_fab_prod PRIMARY KEY (id_fab, id_producto) GO Select * From Productos /* Note que las filas aparecen ordenadas */
Un foreign key constraint permjite forzar la integridad de datos manteniendo la relacin entre una llave primaria y una llave secundaria. Para implementar este tipo de caracterstica debemos recordar que el nmero de columnas y el tipo de datos referenciados en la clusula FOREIGN KEY debe ser el mismo que el mencionado en la clusula REFERENCES
Ejemplos: Implementar un foreign key constraint que asegure que cada vez que asigne un representante de ventas a un cliente este exista.
USE Ejemplo GO ALTER TABLE Clientes ADD CONSTRAINT FK_Cli_RepVentas FOREIGN KEY (Rep_Clie) REFERENCES RepVentas(Num_Empl) GO
Se realiza el alter sobre la tabla clientes en la columna rep_clie que seria la clave fornea haciendo referencia o sea unindose a la tabla repVentas en la columna Num_empl
Implementar un foreign key constraint que asegure que cada vez que a un representante de ventas se le asigne un director, est se encuentre registrado.
ALTER TABLE RepVentas ADD CONSTRAINT FK_Dir_RepVentas FOREIGN KEY (Director) REFERENCES RepVentas(Num_Empl) GO
Implementar un foreign key constraint que asegure que la oficina asignada al representante de ventas se encuentre en la tabla oficinas.
ALTER TABLE RepVentas ADD CONSTRAINT FK_Ofi_Oficinas FOREIGN KEY (oficina_rep) REFERENCES Oficinas(Oficina) GO
Implementar un foreign key constraint que verifique la existencia del representante de ventas que toma un pedido.
ALTER TABLE Pedidos ADD CONSTRAINT FK_Rep_RepVentas FOREIGN KEY (rep) REFERENCES RepVentas(num_empl) GO
Implementar un foreign key constraint que verifique la existencia de los productos que se indican al momento de tomar un pedido.
ALTER TABLE Pedidos ADD CONSTRAINT FK_FabPro_Productos FOREIGN KEY (fab, producto) REFERENCES Productos(id_fab, id_producto) GO
Un Check Constraint restringe a los usuarios la posibilidad de ingresar valores inapropiados a una columna. Este constraint acta cuando el usuario emplea una instruccin INSERT o UPDATE.
Ejemplos:
Implementar un check constraint que verifique que los cdigos de los representantes de ventas sean mayores que 100.
ALTER TABLE RepVentas ADD CONSTRAINT CK_RV_100 CHECK (Num_Empl > 100) GO
Implementar un check constraint que verifique que los cdigos de los pedidos sean mayores que 100000.
ALTER TABLE Pedidos ADD CONSTRAINT CK_Pedidos CHECK (num_pedido > 100000) GO
Estos constraints trabajan al momento de utilizar la funcin INSERT y asignan un valor automticamente a la columna que no se le asign. Ejemplo: Asignar un valor en forma predeterminada a la columna DIRECTOR de la tabla que almacena los datos de los representantes de ventas haciendo que el cdigo En forma predeterminada sea 106.
ALTER TABLE RepVentas ADD CONSTRAINT DF_RV_Director DEFAULT 106 FOR Director GO
Como parte final de esta implementacin emplearemos un conjunto de instrucciones para tratar de modificar la informacin de las distintas tablas y veremos como los constraints implementados realizan su trabajo. Para ello ejecute las siguientes instrucciones desde el Analizador de Consultas
Recuperar Informacin
Objetivos: Conocer los comandos DML Realizar JOINS Conocer la funcionalidad de los Desencadenadores Temas: Sentencia SELECT Sentencia INSERT Sentencia UPDATE Sentencia DELETE Recuperar informacin de dos o ms tablas Desencadenadores Uno de los principales motivos por el cual se guarda informacin, es por que posteriormente la vamos a consultar, una de las principales razones por las cuales las bases de datos relacionales lograron gran aceptacin fue por la forma tan sencilla de lograr acceder a los datos. Y como parte de estas facilidades para poder realizar consultas, encontramos a la sentencia SELECT.
Select Recupera informacin de la Base de Datos y permite la seleccin de una o ms filas o columnas de una o muchas tablas. La sintaxis completa de la instruccin SELECT es compleja, sus clusulas principales pueden ser resumidas de la siguiente manera. SELECT lista_cols [INTO nueva_tabla] FROM tabla_origen [WHERE condicin] [GROUP BY columna1,] [HAVING condicin] [ORDER BY columna1, [ASC][DESC]] lista_cols Especfica las columnas a ser devueltas por el query.
INTO nueva_tabla Define la creacin de una nueva tabla a partir de la respuesta a la consulta especificada. Esta operacin no es registrada en el log. FROM Determina la tabla o tablas de donde se muestra la informacin. WHERE Establece un criterio de seleccin de filas GROUP BY Establece la lista de columna por las cuales se agrupara la informacin. HAVING Permite filtrar los grupos generados por GROUP BY ORDER BY Permite ordenar la informacin de acuerdo a los requerimientos.
Ejemplos
PAGINA 98
REPASO DE CONSULTAS SOBRE BASE DE DATOS(SELECT, CLAUSULA WHERE,GROUP BY HAVING Y ORDER BY ) COPIAR REGISTROS A OTRA TABLA NUEVA Y MODIFICANDO REGISTRO A LA VEZ (UPDATE)
PAGINA 105
Si desea ver las caractersticas slo del archivo que agrego utilice la siguiente sentencia:
Sp_HelpFile Prueba2Sec_Data GO
Otra observacin que cuando definimos un tipo de dato primero copiar en Model para que al crear nuevas bases de datos se copien ah todos los tipos de datos para tener accesibilidad a ellos en la definicin de tipos de datos en el modo diseo de tablas.
Use Ejemplo GO Sp_Addtype RUC, 'CHAR(11)', 'NOT NULL' GO
Ejemplo:
Sirve para sacar cdigo de tablas o tipos de datos til para tener info de cdigos
CODIGO PARA CREAR TABLAS
Use Ejemplo GO CREATE TABLE Oficinas ( oficina integer not null, ciudad varchar(15) not null, region varchar(10) not null, dir integer, objetivo money, ventas money not null)
Propiedad Identity
Permite generar valores secuenciales del sistema utilizados en columnas que sern empleadas como primary key.
Para ver informacin sobre la columna IDENTITY puede utilizar las funciones:
Select Ident_Seed('Prueba') /* Retorna el valor de inicio de la columna identity */ GO Select Ident_Incr('Prueba') /* Retorna el valor de incremento de la columna identity */
>>> Cuando se carga valores se genera caracteres varios en el campo cdigo mediante la definicin uniqueidentifier con la funcin newind()
Eliminacin de tablas
DROP TABLE Prueba2 GO
Create table director(codd char PRIMARY KEY, nombre varchar (50) not null unique)
CODIGO PARA CAMBIAR DE NULL A NOT NULL PRIMERO AGREGAR POR EJEMPLO UN ALTER: alter table login alter column tipo varchar (10) not null default (" ") luego entrar en el administrador corporativo ir a disear tabla y borrar valor predeterminado () ir al analizador de consultas y ejecutar el codigo: alter table login alter column tipo varchar (10) not null
USE Ejemplo GO ALTER TABLE Clientes ADD CONSTRAINT FK_Cli_RepVentas FOREIGN KEY (Rep_Clie) REFERENCES RepVentas(Num_Empl) GO
CODIGO PARA AGREGAR CLAVE FORNEA EN CREACION DE TABLA Create table pelicula(codP int, titulo varchar (50) not null unique, codD char, primary key(codP), FOREIGN KEY(codD) REFERENCES Director); CODIGO PARA AGREGAR CHECK MODIFICANDO VALORES
ALTER TABLE Pedidos ADD CONSTRAINT CK_Pedidos CHECK (num_pedido > 100000) GO
UPDATE Clientes SET empresa = 'Cristina Hidalgo' WHERE num_clie = 502 GO Se le puede agregar valores al cambio y condicionales UPDATE Clientes SET num_clie = num_clie + 500 WHERE num_clie < 1000 GO METODO DE COPIAR REGISTROS CON MODIFICACION MEDIANTE UPDATE DE REGISTROS
Crear una tabla llamada MejoresCli, con los registros de los clientes con un limite de crdito mayor que 60000, en esta nueva tabla incremente el lmite de crdito en un 20%
SP_DBOPTION 'EJEMPLO', 'SELECT INTO/BULKCOPY', 'TRUE' GO SELECT * INTO MEJORESCLI FROM CLIENTES WHERE LIMITE_CREDITO > 60000 GO UPDATE MEJORESCLI SET LIMITE_CREDITO = LIMITE_CREDITO * 1.2 GO SELECT * FROM MEJORESCLI GO SP_DBOPTION 'EJEMPLO', 'SELECT INTO/BULKCOPY', 'FALSE' GO Ejemplo de Prueba SP_DBOPTION 'parfums', 'SELECT INTO/BULKCOPY', 'TRUE' SELECT * INTO mejoresclientes FROM datos_clientes where nombrecliente like 'Rosana%' UPDATE mejoresclientes SET nombrecliente='Rosanita'
select * from mejoresclientes DBCC CHECKIDENT (datos_clientes, RESEED,0) Comprobacin de informacin de identidad: valor de identidad actual '11', valor de columna actual '0'. Ejecucin de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema. ***************************************************************************************************************************
CREATE TABLE pedidos (num_pedido integer primary key,fecha_pedido datetime not null,
clie integer not null, rep integer, fab char(3)not null, producto char(5) not null, cant integer not null, importe money not null)
(id_fab char(3) not null, id_producto char(5) not null, descripcion varchar(20) not null, precio money not null, existencias integer not null,
USO DEL DECODE PARA Descifra una expresin despus de compararla con cada valor de
bsqueda. Si la expresin es la misma que la bsqueda, se devuelve el resultado. Si se omite el valor por defecto, se devolver un valor nulo donde una bsqueda no coincida con ninguno de los valores resultantes. SELECT job, sal, DECODE (job, ANALYST, sal*1.1, CLERK, sal*1.15, MANAGER, sal*1.20, sal) AS Nuevo salario FROM emp;
Si job = ANALYST entonces el salario se incrementa en un 10% Si job = CLERK entonces se incrementa en un 15% Si jog = MANAGER entonces se incrementa en un 20% Para otro caso, entones no hay incremento de salario
create table datocliente (idcliente int identity(1,1) primary key, nombreapesocio varchar(30) not null, numtel varchar(20) not null, direccion varchar(40), observa varchar(50)) create table tamaoproducto (id_tamaoproducto int primary key , tamao varchar (8) not null) create table estadocuenta (idestadocuenta int primary key, nombrecuenta varchar (8)) create table producto (idproducto int primary key, nombre_producto varchar(30) not null, id_tamaoproducto int foreign key(id_tamaoproducto) references tamaoproducto, costo money not null, venta money not null, precio_credito money not null) create table micompra (idcompra int primary key, fechacompra datetime not null,idproducto int, foreign key (idproducto) references producto,cantidad int not null, montounitario money not null,fechapagar datetime not null,idtipocuenta int foreign key(idtipocuenta) references estadocuenta, fechapago datetime)
create table compradecliente (idcompracliente int primary key, idcliente int,idtipocuenta int foreign key(idtipocuenta) references estadocuenta ,idproducto int, id_tamaoproducto int,costoproducto money not null ,fecha_entregaproducto datetime not null,montoabonado money, fechacobro datetime, observa varchar (50) , foreign key(idcliente)references datocliente,foreign key (idproducto) references producto, foreign key (id_tamaoproducto) references tamaoproducto) create table clientecomprapago (idcliente int, foreign key (idcliente) references datocliente, fechapago datetime not null, montopago money not null) create table saldocliente (idsaldo int primary key, idcliente int, foreign key(idcliente) references datocliente, saldo money not null)
.
hola qtal te cuento que mi pareja y yo estamos a tu disposicion ambos somos atleticos jovenes de 25 aos de gym fuertes escribime, te vamos a estar esperando... Las correcciones concretas realizadas en el valor de identidad actual dependen de las especificaciones de los parmetros.
Comando DBCC CHECKIDENT DBCC CHECKIDENT (table_name, NORESEED) DBCC CHECKIDENT (table_name) O bien: DBCC CHECKIDENT (table_name, RESEED) DBCC CHECKIDENT (table_name, RESEED,new_reseed_value)
Correccin o correcciones de identidad realizadas No se restablece el valor de identidad actual. DBCC CHECKIDENT devuelve el valor de identidad actual y el valor mximo actual de la columna de identidad. Si los dos valores no coinciden, debe restablecer el valor de identidad para evitar posibles errores o espacios en la secuencia de valores. Si el valor de identidad actual de una tabla es menor que el valor de identidad mximo almacenado en la columna de identidad, se restablece con el valor mximo de la columna de identidad.
El valor de identidad actual se establece en new_reseed_value. Si no se han insertado filas en la tabla desde su creacin, o su todas las filas se han quitado con la instruccin TRUNCATE TABLE, la primera fila insertada despus de ejecutar DBCC CHECKIDENT utiliza new_reseed_value como identidad. De lo contrario, la siguiente fila insertada utilizanew_reseed_value + el valor de incremento actual. Si la tabla no est vaca y se establece el valor de identidad en un nmero menor que el valor mximo de la columna de identidad, puede darse una de las siguientes condiciones:
Si existe una restriccin PRIMARY KEY o UNIQUE en la columna de identidad, se generar el mensaje de error 2627 en operaciones de insercin en la tabla posteriores ya que el valor de identidad generado provocar un conflicto con los valores existentes.
Si no existe una restriccin PRIMARY KEY o UNIQUE, las operaciones de insercin posteriores provocarn la duplicacin de los valores de identidad.
PARA CORREGIR EL VALOR DE LA COLUMNA IDENTITY E IGUALAR EL VALOR DEL REGISTRO EN UN INSERT REFREZCAR LA BASE DE DATOS CON ESTOS COMANDOS (EN EL MOMENTO DE AGREGAR UN REGISTRO Y ELIMINARLO)
DBCC CHECKIDENT (datos_clientes, reseed,0) DBCC CHECKIDENT (datos_clientes, reseed)
Comprobacin de informacin de identidad: valor de identidad actual '1', valor de columna actual '0'. Ejecucin de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema. Comprobacin de informacin de identidad: valor de identidad actual '0', valor de columna actual '1'. Ejecucin de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.
Condicin El valor de identidad actual es mayor que el valor mximo de la tabla. Mtodos para restablecer
Ejecute DBCC CHECKIDENT (table_name, NORESEED) para determinar el valor mximo actual de la columna y, a continuacin, especifquelo como new_reseed_value en un comando DBCC CHECKIDENT (table_name, RESEED, new_reseed_value). O bien:
Ejecute DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) con new_reseed_valueestablecido en un valor muy bajo y, a continuacin, ejecute DBCC CHECKIDENT (table_name, RESEED) para corregir el valor. Se eliminan todas las filas de la Ejecute DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) con new_reseed_value establecido en el tabla. valor de inicio que desee.