jueves, 3 de noviembre de 2016

Listar y ejecutar procedimientos almacenados de SQL Server con PowerShell

Listar y ejecutar procedimientos almacenados de SQL Server con PowerShell

Problema

Una tarea común que muchos administradores de base de datos (DBA) realizan de forma regular está trabajando con procedimientos almacenados de SQL Server. Los procedimientos almacenados permiten al DBA automatizar una determinada tarea agrupando una consulta y ejecutándola como un solo conjunto de lógica. Esto es un progreso considerable en la inclusión de más automatización, pero ¿por qué no automatizar la automatización? Para crear un procedimiento almacenado, un DBA puede ir a SQL Server Management Studio (SSMS), hacer clic en la GUI y crear un procedimiento almacenado de esa manera o, al igual que, al ejecutar un procedimiento almacenado perseguir la misma ruta. Esto es una pérdida de su precioso tiempo! Vamos a automatizar eso.

Solución

Lo que quiero decir con "automatizar la automatización" es la construcción de una herramienta en PowerShell que nos permite recuperar los procedimientos almacenados para su revisión y ejecutarlos todos desde la línea de comandos. Entre muchos otros beneficios, esto nos da la ventaja de poder agregar estos comandos a proyectos de automatización más grandes por el camino. Veamos cómo podemos construir esta herramienta y mostrar cómo funciona.

En primer lugar, tendremos que descargar e instalar algunos requisitos previos si aún no tiene SSMS instalado. Para acelerar las cosas a continuación se muestra un código de PowerShell que descarga e instala cada uno de los paquetes necesarios para que funcione nuestra herramienta. Este código descargará cada paquete MSI en su directorio temporal de usuario y ejecutará la instalación en cada uno.


$files = [ordered]@{
 
'SQLSysClrTypes.msi' = 
'http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409'
 
'SharedManagementObjects.msi' = 
'http://go.microsoft.com/fwlink/?LinkID=239659&clcid=0x409'
 
'PowerShellTools.msi' = 
'http://go.microsoft.com/fwlink/?LinkID=239656&clcid=0x409'
}

foreach ($file in $files.GetEnumerator())
{
 $downloadFile 
= (Join-Path -Path $env:TEMP -ChildPath $file.Key)
 if (-not 
(Test-Path -Path $downloadFile -PathType Leaf)) 
 {
 
Invoke-WebRequest -Uri $file.Value -OutFile $downloadFile
 }
 Start-Process 
-FilePath 'msiexec.exe' -Args "/i $downloadFile /qn" -Wait
}


Ahora que tienes los requisitos previos descargados, podemos empezar a diseñar nuestra herramienta.

Para crear una gran herramienta de PowerShell, es importante que el código sea lo más genérico posible al crear parámetros de entrada de una manera que fomente la reutilización. Esto significa llevar a cabo elementos que pueden cambiar con el tiempo y construirse como parámetro en lugar de una referencia estática. En este caso, esto será cosas como el nombre de instancia de SQL Server, nombre de base de datos, nombre de procedimiento almacenado y así sucesivamente. Empecemos primero con una función para ejecutar un procedimiento almacenado. Esta función (así como todas las siguientes funciones que estaremos construyendo) tienen todos los parámetros apropiados.


function Invoke-SqlStoredProcedure
{
 
[CmdletBinding()]
 param
 (
 [Parameter(Mandatory)]
 [ValidateNotNullOrEmpty()] 
 [string]$ServerName,
 
 [Parameter(Mandatory)] 
 [ValidateNotNullOrEmpty()] 
 [string]$Database,

 [Parameter(Mandatory)] 
 [ValidateNotNullOrEmpty()] 
 [string]$Name,
 
 [Parameter(Mandatory)] 
 [ValidateNotNullOrEmpty()] 
 [pscredential]$Credential
 )
 begin
 {
 $ErrorActionPreference = 'Stop'
 }
 process
 { 
 try
 { 
  $connectionString = New-SqlConnectionString -ServerName $ServerName -Database $Database -Credential $Credential
  $SqlConnection = New-SqlConnection -ConnectionString $connectionString

   $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
 
  $SqlCmd.CommandType=[System.Data.CommandType]’StoredProcedure’
 
  $SqlCmd.CommandText = $Name
 
  $SqlCmd.Connection = $SqlConnection
 
  $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
 
  $SqlAdapter.SelectCommand = $SqlCmd
 
  $DataSet = New-Object System.Data.DataSet
 
  $SqlAdapter.Fill($DataSet)
 }
 catch
 {
 $PSCmdlet.ThrowTerminatingError($_) 
 }
 }
}

La mayor parte de este código está disponible con SMO cuando se instala el módulo SQLPS. Sin embargo, observe las referencias a New-SqlConnectionString y New-SqlConnection. Esas son las funciones personalizadas que he elegido para salir. ¿Por qué? Porque no sólo vamos a construir esta función sino también una para recuperar una lista de todos los procedimientos almacenados que existen en un servidor. Con estos comandos estándar divididos en otros comandos, pueden ser compartidos. No voy a aburrir con los detalles sobre ellos, pero si usted está interesado, no dude en echar un vistazo al módulo que he creado en Github.

Ahora observe la otra función que he creado para enumerar todos los procedimientos almacenados en un servidor SQL.


function Get-SqlStoredProcedure
{
 [OutputType([Microsoft.SqlServer.Management.Smo.StoredProcedure])] 
 [CmdletBinding()]
  param
   (
  [Parameter(Mandatory)] 
  [ValidateNotNullOrEmpty()] 
  [string]$ServerName,
 
  [Parameter(Mandatory)] 
  [ValidateNotNullOrEmpty()] 
  [string]$Database,
 
  [Parameter(Mandatory)] 
  [ValidateNotNullOrEmpty()]
   [pscredential]$Credential
 )
 begin
 {
 $ErrorActionPreference = 'Stop'
 }
 process
 {
 try
 {
 
 [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

  $connectionString = New-SqlConnectionString -ServerName $ServerName -Database $Database -Credential $Credential
  $sqlConnection = New-SqlConnection -ConnectionString $connectionString
  
  $serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $sqlConnection
 
  $serverInstance.Databases[$Database].StoredProcedures
  }
 catch
 {
   $PSCmdlet.ThrowTerminatingError($_)
 }
 }
}

Observe aquí también puedo referirme a estas funciones compartidas ya que hacer esa conexión inicial es un atributo común de compartir. Esta es una buena práctica al construir una herramienta como esta. Es importante primero pensar mentalmente en lo que vas a lograr antes de empezar. En nuestro caso, estaba invocando un procedimiento almacenado y enumerándolos en un servidor. Luego, a medida que comience a construir su código de aviso de la herramienta que podría tener en común y romper los que en otras funciones.

Para la prueba final, vamos a tomar nuestra herramienta para una prueba de ejecución. Tengo una base de datos SQL en Azure para probar esto. En primer lugar, intentaré consultar todos los procedimientos almacenados en mi base de datos myazuredatabase en ese servidor.


Get-SqlStoredProcedure -ServerName adbsql.database.windows.net -Database myazuredatabase –Credential (Get-Credential)

Después de proporcionar mi nombre de usuario y contraseña de mySQL, deberías ver algo como esto:


Esto comienza a enumerar cada procedimiento almacenado y mostrar las propiedades de cada procedimiento almacenado.

Sé que tengo un procedimiento almacenado llamado uspLogError en esta base de datos. Vamos a ejecutar Invoke-SqlStoredProcedure y ver si eso funciona también.



Invoke-SqlStoredProcedure -ServerName adbsql.database.windows.net -Database myazuredatabase -Name dbo.uspLogError -Credential (Get-Credential)


¡Estupendo! Después de proporcionar mi nombre de usuario y contraseña de nuevo, puede ver que devuelve lo que el procedimiento almacenado está diseñado para. En este caso, era simplemente 0.

Usted puede ver que construir una herramienta en PowerShell puede ahorrarle una tonelada de tiempo. Al usar esto en la consola para realizar consultas ad hoc o incorporarla a un proceso de orquestación más grande, ahorrará mucho tiempo para volver a hacer cosas más importantes.


lunes, 17 de octubre de 2016

Tutorial de SQL para principiantes con ejemplos - Parte 4

La cláusula Where SQL se utiliza cuando necesitamos obtener una fila o conjunto de filas de una tabla en particular. Esta cláusula se define la condición y sólo las filas (s) sale como resultado que satisfaga la condición definida en la cláusula WHERE de la consulta SQL.

Sintaxis:

SELECT Column_nameOne, Column_nameTwo, .... 
FROM Table_Name
WHERE Codi_tion;

Ejemplo

Digamos que este es el contenido de la tabla empleados:

+------+-----------------+--------------+-------------------+
|SNN   | EML_NAME | EML_AGE |EML_SALARY|
+------+-----------------+--------------+-------------------+
|  101 | Ste                   |  23              |  9000.00            |
|  223 | Pet                   |  24              |  2550.00            |
|  388 | Shu                  |  19              |  2444.00            |
|  499 | Chai                 |  29              |  6588.00            |
|  589 | Apo                 |  21              |  1400.00             |
|  689 | Raj                  |  24              |  8900.00             |
|  700 | Aje                  |  20              | 18300.00            |
+-----+------------------+--------------+--------------------+

Ahora bien, si tengo que buscar el nombre de los empleados que están teniendo la edad superior a 23 entonces yo estaría escribiendo la consulta SELECT como esto:

SELECT EML_NAME 
FROM EMPLOYEES
WHERE EML_AGE > 23;

Salida:

+----------------+
| EML_NAME | 
+----------------+
| Pet                 | 
| Chai               |  
| Raj                 | 
+----------------+

Digamos que quiero averiguar el SNN de Aje. Puedo hacerlo de esta manera:

SELECT SNN, EML_NAME
FROM EMPLOYEES
WHERE EML_NAME = 'Aje';

Salida:

+------+------------------+
|SNN   | EML_NAME | 
+------+------------------+
|  700 | Aje                    | 
+------+------------------+

Todos los detalles de los empleados que tienen sueldo mayor que 3000.

SELECT * 
FROM EMPLOYEES
WHERE EML_SALARY > 3000;

Salida:

+-------+-----------------+--------------+-------------------+
|SNN   | EML_NAME | EML_AGE |EML_SALARY|
+-------+-----------------+--------------+-------------------+
|  101   | Ste                  |  23              |  9000.00            |
|  499   | Chai                |  29              |  6588.00            |
|  689   | Raj                  |  24              |  8900.00            |
|  700   | Aje                  |  20              | 18300.00           |
+------+------------------+--------------+-------------------+



jueves, 6 de octubre de 2016

Tutorial de SQL para principiantes con ejemplos - Parte 3

El SELECT se utiliza para recuperar los datos de la tabla (s). Tenemos flexibilidad a buscar a unos pocos columnas, filas o tabla entera usando consulta de selección.

Sintaxis:

SELECT column_name_1, column_name_2, ... FROM table_name;

Para ir a buscar toda la tabla:

SELECT * FROM nombre_tabla;

Para ir a buscar ciertas columnas de tabla:

Digamos que queremos obtener column_a y column_x de tabla denominada "ABC". La consulta de este debe ser:

SELECT column_a, column_x from ABC;

Ejemplo:

Digamos que tenemos una tabla de "Empleados" que tiene debajo de los datos.

+ ------ + ---------- + --------- + ---------- +
| SSN | EMP_NAME | EMP_AGE | EMP_SALARY |
+ ------ + ---------- + --------- + ---------- +
| 101 | Paco | 23 | 9000.00 |
| 223 | Pedro | 24 | 2550.00 |
| 388 | shub | 19 | 2444.00 |
| 499 | Carlos | 29 | 6588.00 |
| 589 | Apo | 21 | 1400.00 |
| 689 | reja | 24 | 8900.00 |
| 700 | juan | 20 | 18300,00 |
+ ------ + ---------- + --------- + ---------- +

Con el fin de buscar el SSN y EMP_NAME, podemos escribir la consulta de selección como esta:

SELECT SSN, EMP_NAME FROM EMPLEADOS;

La consulta produciría el resultado a continuación.

+ ------ + ---------- +
| SSN | EMP_NAME |
+ ------ + ---------- +
| 101 | Pedro |
| 223 | Pablo |
| 388 | shub |
| 499 | Carlos |
| 589 | Apo |
| 689 | raja |
| 700 | Juan |
+ ------ + ---------- +

Del mismo modo se puede recuperar cualquier columna o grupo de columnas mediante la consulta SELECT en SQL.

Se ha podido recuperar toda la tabla EMPLEADOS:

SELECT * FROM EMPLOYEES;

Resultado:

+ ------ + ---------- + --------- + ---------- +
| SSN | EMP_NAME | EMP_AGE | EMP_SALARY |
+ ------ + ---------- + --------- + ---------- +
| 101 | Pedro | 23 | 9000.00 |
| 223 | Pable | 24 | 2550.00 |
| 388 | shub | 19 | 2444.00 |
| 499 | Carlos | 29 | 6588.00 |
| 589 | Apo | 21 | 1400.00 |
| 689 | raja | 24 | 8900.00 |
| 700 | Juan | 20 | 18300,00 |
+ ------ + ---------- + --------- + ---------- +


miércoles, 28 de septiembre de 2016

Tutorial de SQL para principiantes con ejemplos - Parte 2



CREATE TABLE se utiliza para crear las tablas de una base de datos.

Las tablas se organizan en filas y columnas.

Donde las columnas son los atributos y las filas son conocidos como registros.


Sintaxis:


CREATE TABLE table
(
column_1 data_type,
column_2 data_type,
column_3 data_type,
column_4 data_type,
....
PRIMARY KEY (Column(s))
);


Ejemplo de CREATE TABLE

SQL> CREATE TABLE EMPLEADOS(
SSN CHAR(10) NOT NULL,
EMP_NOMB VARCHAR(35) NOT NULL,
EMP_EDA INT NOT NULL,
EMP_DIR VARCHAR(40) ,
PRIMARY KEY (SSN)
);

La declaración anterior crearía una tabla denominada "empleados" en la base de datos que tiene la clave principal como "SSN".

Nota: Desde el SSN es una clave principal no puede duplicar los valores como se esta columna se utiliza para identificar el registro único (fila) de la tabla.


SQL> DESC CLIENTES;
+---------+---------------+------+-----+---------+
| Field | Type | Null | Key | Default |
+---------+---------------+------+-----+---------+
| SSN | int(11) | NO | PRI | |
| EMP_NOMB| varchar(20) | NO | | |
| EMP_EDA | int(11) | NO | | |
| EMP_DIR | char(25) | YES | | NULL |
+---------+---------------+------+-----+---------+
5 rows in set (0.00 sec)

Una vez creada la tabla se pueden realizar las otras operaciones como insertar, eliminar, truncar etc.

CREATE TABLE de una tabla existente

Sintaxis:


CREATE TABLE TablaNombre AS
SELECT (columna_1, columna_2...)
FROM AnteriorTablaNombre
WHERE Clause

Ejemplo:

Digamos que tiene un estudiante que tiene debajo de la tabla de entradas:


+---------+---------------+------+
| RollNo | Name | Age |
+---------+---------------+------+
| 1234 | Abel | 23 |
| 256 | Jet | 21 |
| 22 | Juan | 22 |
| 890 | Anujo | 23 |
| 123 | Raul | 18 |
+---------+---------------+------+

Ahora quiero crear una tabla denominada "EDAD" de la tabla anterior. Esta es la forma en que debería estar haciendo es:


SQL> CREATE TABLE EDAD AS
SELECT RolNo, Edad
FROM ESTUDIANTE;

La nueva tabla "EDAD" sería tener los siguientes registros:


+---------+------+
| RolNo | Edad |
+---------+------+
| 1234 | 23 |
| 256 | 21 |
| 22 | 22 |
| 890 | 23 |
| 123 | 18 |
+---------+------+


sábado, 24 de septiembre de 2016

Tutorial de SQL para principiantes con ejemplos - Parte 1

SQL significa Lenguaje de Consulta Estructurado. Se utiliza para la recogida, el almacenamiento y la modificación de los datos en la base de datos relacional. A continuación se presentan los enlaces tutorial, comenzar a aprender SQL en el orden dado.

Las sentencias de bases de datos


  • Sentencia para crear base de datos
  • Sentencia para eliminar base de datos
  • Sentencia para seleccionar base de datos


1-.Sentencia CREATE DATABASE:

Sintaxis:

Utilizamos CREATE DATABASE con el fin de crear una base de datos. Esta es la forma en que se utiliza:

CREATE DATABASE DBName;
Aquí DBName puede ser cualquier cadena que represente el nombre de base de datos.

Ejemplo - La siguiente declaración crearía una base de datos llamada empleado

SQL> CREATE DATABASE Empleado;
Con el fin de obtener la lista de todas las bases de datos, puede utilizar comando SHOW DATABASES.
Ejemplo -

SQL> SHOW DATABASES;

+ -------------------- +
| Base de datos |
+ -------------------- +
| AbcTem |
| empleado |
| clientes |
| estudiante |
| Facultad |
| MyTester |
| Demos |
+ -------------------- +
7 rows in set (0.00 sec)

Como se puede ver esta declaración una lista de las bases de datos. También se puede encontrar la base de datos "Empleado" en la lista anterior que hemos creado anteriormente utilizando la sentencia CREATE DATABASE.


2-.Seleccionar base de datos (Use)

En general, tenemos más de uno en bases de datos DBMS (sistema de gestión de base de datos). Para seleccionar una base de datos de las bases de datos disponibles en esquema de SQL, utilizamos sentencia USE.

Sintaxis:

USE DBName;
Ejemplo sentencia USE -

SQL> SHOW DATABASES;
+ -------------------- +
| Base de datos |
+ -------------------- +
| AbcTester |
| prueba |
| Demo2 |
| DB2 |
+ -------------------- +
4 rows in set (0.00 sec)

Digamos que tenemos por encima de cuatro bases de datos en nuestro sistema de gestión de base de datos. Para utilizar el "DB2" Base de datos podemos utilizar la sentencia use la siguiente manera:

USE DB2;

Después de esta declaración sea cual sea la operación se llevará a cabo como en crear una tabla, eliminar mesa, etc. se llevaría a cabo en la base de datos "DB2". Digamos que después de hacer la modificación, es posible que desee trabajar con otra base de datos "Demo2", entonces puede simplemente cambiar la base de datos de la siguiente manera:

USE Demo2;

3-.Eliminar base de datos (DROP DATABASE)

La declaración DROP DATABASE se utiliza para eliminar una base de datos y todas sus tablas por completo.

Sintaxis:

DROP DATABASE DBName;
Aquí DBName es el nombre de la base de datos que desea eliminar.

Ejemplo - La siguiente declaración sería eliminar la base de datos denominada "Estudiante".

SQL> DROP DATABASE Estudiante;

Nota: Al eliminar una base de datos que elimine todas sus tablas de forma implícita. Por ejemplo, la declaración anterior sería eliminar todas las tablas que se almacenan dentro de la base de datos "Estudiante", junto con la base de datos.

Después de dejar a una base de datos se puede comprobar la lista de bases de datos para cruzar verificar que la base de datos se ha caído o no con éxito. Esta es la forma en que puede hacerlo.

Antes de eliminar bases de datos "Estudiante":

SQL> SHOW DATABASE;
+ -------------------- +
| Base de datos |
+ -------------------- +
| Abcde |
| wxyz |
| estudiante |
| Demo2 |
| prueba2 |
+ -------------------- +
5 rows in set (0.00 sec)

Después de eliminar bases de datos "Estudiante":

SQL> DROP DATABASE Estudiante;

Enumerar las bases de datos:

SQL> SHOW DATABASE;
+ -------------------- +
| Base de datos |
+ -------------------- +
| Abcde |
| wxyz |
| Demo2 |
| prueba2 |
+ -------------------- +
4 rows in set (0.00 sec)