domingo, 13 de marzo de 2011

Abrir el puertos del FireWall para SQL Server

Para poder realizar una conexión de un equipo cliente a nuestro SQL Server es necesario permitir el paso por el Firewall en nuestro servidor a través de los puertos  1433, 1434, 2383, 443, para los distintos servicios de SQL Server, aquí un script proporcionado por Microsoft para habilitar en el firewall estos puertos, solo hay que copiar este script en el block de notas, guardarlo con extensión “.bat” y luego ejecutarlo.


@echo =========  SQL Server Ports  ===================
@echo Enabling SQLServer default instance port 1433
netsh firewall set portopening TCP 1433 "SQLServer"
@echo Enabling Dedicated Admin Connection port 1434
netsh firewall set portopening TCP 1434 "SQL Admin Connection"
@echo Enabling conventional SQL Server Service Broker port 4022
netsh firewall set portopening TCP 4022 "SQL Service Broker"
@echo Enabling Transact-SQL Debugger/RPC port 135
netsh firewall set portopening TCP 135 "SQL Debugger/RPC"
@echo =========  Analysis Services Ports  ==============
@echo Enabling SSAS Default Instance port 2383
netsh firewall set portopening TCP 2383 "Analysis Services"
@echo Enabling SQL Server Browser Service port 2382
netsh firewall set portopening TCP 2382 "SQL Browser"
@echo =========  Misc Applications  ==============
@echo Enabling HTTP port 80
netsh firewall set portopening TCP 80 "HTTP"
@echo Enabling SSL port 443
netsh firewall set portopening TCP 443 "SSL"
@echo Enabling port for SQL Server Browser Service's 'Browse' Button
netsh firewall set portopening UDP 1434 "SQL Browser"
@echo Allowing multicast broadcast response on UDP (Browser Service Enumerations OK)
netsh firewall set multicastbroadcastresponse ENABLE


domingo, 6 de marzo de 2011

Arrancar con un disco virtual en Windows 7

Windows 7. Instalar nativamente y arrancar desde un .VHD
Windows 7 permite instalar y/o montar un VHD para que se inicie al arrancar el sistema real. Es decir, su cargador permite montar un disco virtual .VHD como si fuese un disco real y por tanto iniciar el sistema desde allí.
Creación de un VHD e instalación del sistema en máquina real:
  1. Arrancar con el DVD de Windows 7
  2. Seleccionar la Reparación de Windows.
  3. Arrancar la consola de comandos (CMD)
  4. Ejecutar: diskpart y dar los siguientes comandos dentro de él:
  5. create vdisk file=c:\discoVirtual00.vhd maximum=50000
  6. select vdisk file= c:\discoVirtual00.vhd
  7. attach vdisk
  8. exit
  9. Salir de Windows repair... pero NO reiniciar la máquina, sino continuar una instalación
  10. Instalamos ahora en el disco nuevo que aparecerá y que corresponde a ese disco virtual. Necesitaremos evidentemente particionarlo y formatearlo como si fuese realmente un disco real.
Después de la instalación en ese disco de Windows 7, podremos arrancar desde él sin problemas ya que nos aparecerá en el menú de arranque de nuestra máquina real.
Fijémonos en que si ya tuviésemos un disco virtual creado en vacío, podríamos asignarlo saltándonos el paso 5), es decir dicho paso solo es la creación. Esto nos da una idea más: y si tuviésemos ya un sistema operativo procedente de una máquina virtual en un .VHD, ¿podríamos arrancarlo en la máquina real si el gestor de arranque fuese el de Windows 7?. Veamos...
Configurando Opciones de Boot
Sabemos, o debemos saber, que podemos cambiar opciones de Boot mediante el comando bcdedit, la pregunta es ¿cómo se haría entonces para añadir cualquier disco .VHD que contenga un sistema operativo en el menú de inicio de nuestra máquina real? Vamos a ceñirnos a añadir un Windows 7 a nuestra máquina.
Recordemos que con:
bcdedit  –v
veremos las entradas en el arranque del sistema pero expresadas mediante un GUID correspondiente a la firma del disco. Siempre podríamos añadir una entrada en el menú dando un comando de la forma
bcdedit  /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} description "Imagen Windows 7 .VHD "
siendo las {xxxx.....xxx} el GUID correspondiente a la firma de ese disco –real o virtual-.
Igualmente recordemos que podemos cambiar el orden las opciones de boot, por ejemplo:
bcdedit /displayorder {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} /addlast
Y recordemos que, si tenemos una colección de VHD’s con Windows instalado, podemos realizar copias en el boot creando las copias de las entradas de la forma que queramos:
bcdedit /copy {Numero_Original_GUID} /d "mi nueva descripción"
o
bcdedit /copy {current} /d "mi nueva descripción"
o
bcdedit /copy {default} /d "mi nueva descripción"
y después de haber realizado dicha copia, la asignación sería:
bcdedit /set {Mi_nuevo_número_GUID} device vhd=[C:]\MyNuevoVhdFile.vhd
bcdedit /set {Mi_nuevo_número_GUID} osdevice vhd=[C:]\MyNuevoVhdFile.vhd 
En resumen, la posibilidad de usar discos virtuales, VHD en el boot es la manera más rápida de iniciar un sistema operativo virtual, el cual no tiene nada que ver con la manera de funcionamiento de vmware o virtual PC y se aproxima más al funcionamiento de la máquina en real.

SQL SERVER 2008: Tipos de Dato

Categoría
Descripción
Tipo de Dato
Descripción
Binary
Un dato Binary almacena cadenas de bits. El dato consiste de números hexadecimales. Por ejemplo, el número decimal 245 vale en hexadecimal F5.
binary
Los datos deben tener la misma longitud fija (hasta 8 KB)
varbinary
Los datos pueden variar en el número de dígitos hexadecimales (hasta 8 KB)
image
Los datos pueden ser de longitud variable y exceder los  8 KB.
Character
Los datos Character consisten de cualquier combinación de letras, símbolos, y caracteres numéricos. Por ejemplo, datos  character válidos:"John928"  "(0*&(%B99nh jkJ"
char
Los datos deben tener la misma longitud fija (hasta 8 KB)
varchar
Los datos pueden variar en el número de  caracteres (hasta 8 KB)
text
Los datos pueden ser cadena de caracteres ASCII que excedan los 8 KB.
Date time
Los datos Date time consisten de combinaciones de fechas o horas válidas. No existe tipos de datos separados para fechas y horas para almacenar solo fechas o solo horas
datetime
Los datos fecha están comprendidos entre en el 1 de Enero de 1753 hasta el 31 de diciembre de 9999 (requiere 8 bytes por dato).
smalldatetime
Los datos fecha están comprendidos entre en el 1 de Enero de 1900 hasta el 31 de diciembre de 2079 (requiere 4 bytes por dato).
Decimal
Los datos Decimal consisten de datos numéricos que son almacenados al menor dígito significativo
decimal
Los datos pueden tener un máximo de 30 dígitos, que pueden estar todos a la derecha de la coma decimal. El tipo de dato almacena un representación exacta del número.
numeric
En SQL Server, el tipo de datos numeric es equivalente al tipo de datos decimal.
Floating point
Datos numéricos aproximados que consisten de datos con una aproximación tanto como el sistema de numeración binaria pueda ofrecer
float
Desde –1.79E + 308 a 1.79E + 308.
real
Desde –3.40E + 38 a 3.40E + 38.
Integer
Los datos Integer consisten de números enteros positivos y negativos tales como: –15, 0, 5, y 2.509.
bigint
Desde –2^63 (–9223372036854775808) a 2^63–1 (9223372036854775807). Tamaño 8 bytes.
int
Desde –2.147.483.648 a 2.147.483.647 (requiere de 4 bytes por valor).
smallint
Desde –32,768 a 32.767  (requiere de 2 bytes por valor).
tinyint
Desde cero a 255 (requiere de 1 bytes por valor).
Monetary
Monetary representa montos de dinero positivos o negativos
money
Desde –922.337.203.685.477,5808 a +922.337.203.685.477,5807 Tamaño 8 bytes.
smallmoney
Desde –214.748,3648 a 214.748,3647 Tamaño 4 bytes.
Special
Special se utiliza para datos que caben en ninguna de las categorís anteriores.
bit
Consisten en un 1 o un 0. Se usan para representar valores lógicos VERDADERO o FALSO, SI o NO
cursor
Este tipo de dato es usado para variables o prámetros OUTPUT en procedimientos almacenados que contenga una referencia a un cursor. Cualquier variable creada con el tipo de datos cursor puede tomar valor nulo
timestamp
Este tipo de datos es usado para indicar la secuencia de la actividad del SQL Server sobre una fila y es representado por un número incremental en formato binario.
uniqueidentifier
Consiste de números hexadecimales de 16 byte, indicando un identificador único global (GUID). Los GUID son usados cuando una columna deba ser única frente a cualquier otra columna.
SQL_variant
Este tipo de datos soporta a cualquier otro tipo de datos soportado por SQL Server excepto text, ntext, timestamp, image, y sql_variant.
table
Es utilizado para almacenar un conjunto de resultados para su posterior procesamiento. El tipo de datos Table puede ser usado únicamente para para definir variable locales de tipo table o para retornar valores de una función definida por el usuario.
Unicode
Al usar tipo de datos Unicode, una columna puede almacenar cualquier cualquier caracter definido por el estándar Unicode. Lo cual incluye a todos los caracteres definidos en los distintos conjuntos de caracteres. Los tipos de datos Unicode toman el doble de espacio de almacenamiento que los tipos no-Unicode.
nchar
Los datos deben tener la misma longitud fija (hasta 4000 caracteres Unicode)
nvarchar
Los datos pueden variar en el número de  caracteres (hasta 4000 caracteres Unicode)
ntext
Los datos pueden exceder los 4000 caracteres Unicode.

viernes, 4 de marzo de 2011

SQL PROGRAMACIÓN CON TRANSACT: Funciones y Procedimientos Almacenados

CREACIÓN DE FUNCIONES



Las funciones resultan un hibrido entre vista y procedimiento almacenado, permitiendo enviar parametros a una consulta, en este video se revisa su funcionamiento.



CREACIÓN DE PROCEDIMIENTOS ALMACENADOS



El procedimiento almacenado es el objeto estrella y mas optimizado del SQL Server, en esta lección se aprenden los aspectos basicos de un procedimiento.

Índices Agrupados y No Agrupados en SQL Server


En este video conoceremos la diferencia entre un indice agrupado y un no agrupado, como son construidos en sql server

miércoles, 2 de marzo de 2011

EJEMPLOS DE CODIGO TRANSACT

Ejemplos, usando la base de datos Northwind,

1.       La organización necesita saber quién es su mejor cliente (El que más dinero ha generado en ventas),  cree un script que devuelva esta información.

select  Top 1 c.companyname, sum(od.quantity* od.unitprice)
from Customers as c inner join orders as o
on c.CustomerID=o.CustomerID
inner join [Order Details] as od
on o.OrderID=od.OrderID
group by c.CompanyName
order by sum(od.quantity* od.unitprice) desc

2.       Cree script al que se le ingrese el número de orden y la elimine, tenga en cuenta que existe una relación entre el detalle de órdenes y la orden.

Delete [Order Details] where OrderID=10248
delete orders where OrderID=10250
 
3.       Cree un script que elimine todas las ordenes donde se compró el producto 23

Delete from o
from [Order Details] as od
inner join orders as o
on o.OrderID=od.OrderID
where od.ProductID=23

4.       Cree un script que muestre todos los clientes que no han realizado una orden.

Select c.companyname from Customers as c
left outer join orders as od
on c.CustomerID=od.customerid
where od.OrderID is null

5.       En estados Unidos se ha agregado un nuevo impuesto a partir de 1998, por lo que se necesita aumentar el precio de todos los productos en las ventas a partir de ese año, por lo que debe actualizar estas ventas en un 5%

update od set od.UnitPrice=od.UnitPrice* 1.05
from
[Order Details] as od inner join products as p
on od.ProductID=p.ProductID
inner join Suppliers as s
on s.SupplierID=p.SupplierID
where s.Country='USA'
6.       Cree un script que devuelva la cantidad de unidades vendidas del producto 23.

Select SUM(quantity) from [Order Details]
where ProductID=23
7.       Cree un script que devuelva todos los clientes que han comprado productos de Estados Unidos, teniendo en cuenta que la procedencia del producto es en base al proveedor.

select c.CompanyName
from customers as c inner join orders as o
on c.customerid=o.customerid
inner join [Order Details] as od on
o.orderid=od.orderid
inner join products as p
on od.ProductID=p.ProductID
inner join Suppliers as s
on s.SupplierID=p.SupplierID
where s.Country='USA'

8.       Cree un script al que se le ingrese el código del producto y devuelva los clientes que han solicitado este producto.

select c.CompanyName
from customers as c inner join orders as o
on c.customerid=o.customerid
inner join [Order Details] as od on
o.orderid=od.orderid
inner join products as p
on od.ProductID=p.ProductID
where p.ProductID=@producto