Mostrando entradas con la etiqueta sqlServer. Mostrar todas las entradas
Mostrando entradas con la etiqueta sqlServer. Mostrar todas las entradas

21/2/18

Variables en SqlServer

En ocasiones es cómodo almacenar en una variable un valor si se van a hacer varias consultas. Siempre se puede repetir la consulta original pero a veces no tiene sentido.

Para hacer esto en SqlServer...

declare @idDeTrabajo int;
select @idDeTrabajo = (select id from nuestraTabla where claveAlternativa like 'ED820');--sin paréntesis falla

select * from Telefono where idTrabajo = @idDeTrabajo;
select * from DireccionPostal where idTrabajo = @idTrabajo;

Subtabla separada por comas.

Si queremos facilitar la visualización desde sqlpuro de una relación de uno a muchos, en ocasiones, es conveniente mostrar los datos de esa "subtabla" en un campo. Físicamente se almacena en una tabla separada pero, para visualizar la visualización, la mostramos como un campo.
Explico el ejemplo:
  • Tenemos una relación de muchos a muchos (Productos, Categorias)
  • La pasamos a una relación de uno (Productos) a muchos (Categorías unida con ProductosCategorias)
  • Mostramos la lista de productos con un campo que se extrae de la tabla de la parte muchos.
Con SqlServer se podría hacer como muestra el ejemplo:
SELECT Productos.Nombre, 
 STUFF(
    (SELECT ', '  + Categorias.Categoria
    FROM Categorias
    INNER JOIN ProductosCategorias ON ProductosCategorias.idCategoria = Categorias.idCategoria
    WHERE ProductosCategorias.idProducto = Productos.idProducto
    FOR XML PATH('')),
    1, 2, '') As Categorias
FROM Productos

28/9/17

SqlServer. Asociar usuarios de Directorio Activo a Base de Datos.

Hay que estar en la Base de Datos:

use DatabaseName;
Luego hay que crear el usuario para la base de datos:
create user [dominio\usuarioOGrupo];

Se me hace extraña la notación entre corchetes pero es así. Hay que poner el corchete, dominio, barra invertida, usuario o grupo AD y corchete.

Una vez que el usuario ya lo tiene en cuenta SqlServer, hay que decirle para qué lo vamos a usar. Se pueden dar todo tipo de permisos por tabla y/o columna pero lo típico será asignarlo a uno de los roles que tenga la Base de datos.

alter role [db_datareader,db_datawriter,...] add member [dominio\usuarioOGrupo];

En este caso los primeros corchetes no se ponen, son para definir que hay que elegir alguno de los roles. Por ejemplo:

alter role db_datawriter add member [empresa\vendedores];

Esto daría permiso de escritura en la Base de Datos activa a los pertenecientes al grupo vendedores en nuestro dominio (empresa)

Con esto, los pertenecientes a un grupo de Directorio Activo podrán, por ejemplo, escribir en una base de datos. Una vez que a ese usuario de dominio se le quita del grupo, ya no podrá hacerlo.

20/6/17

SqlServer. Lista de tablas y tablas relacionadas (Foreing key)

Lista de tablas
select * from sys.all_objects where type like 'U'

Tablas relacionadas con una dada.
SELECT   
   distinct OBJECT_NAME (f.referenced_object_id) AS referenced_object  
   FROM sys.foreign_keys AS f  
   WHERE f.parent_object_id = OBJECT_ID('[Nombre_tabla]');

3/2/17

Ordenar tablas de una base de datos para que las referenciadas estén antes de las que referencian

public void OrdenaTablas() {
    List listaOrdenada = new List();
    while (this.lTable.Count > 0) {//mientras haya elementos
        ColocaTablaEnOrden(this.lTable, this.lTable[0], listaOrdenada);
    }
    foreach (var item in listaOrdenada) {
        lTable.Add(item);
    }
}
private void ColocaTablaEnOrden(List listaOriginal, CTableM cTableM, List listaOrdenada) {
    listaOriginal.Remove(cTableM);
    foreach (CRelationM relacion in cTableM.lRelation) {
        string NombreTablaConLaQueSeRelaciona = relacion.tableDestination;
        CTableM tablaRelacionada = listaOriginal.Find(x => x.Name.Equals(NombreTablaConLaQueSeRelaciona));
        if (tablaRelacionada != null) {//Si la tabla relacionada aún está en la lista de tablas a ordenar
            //Meter antes en la lista de ordenadas
            ColocaTablaEnOrden(listaOriginal, tablaRelacionada, listaOrdenada);
        }
    }
    listaOrdenada.Add(cTableM);
}

20/4/16

Conectar Java con SqlServer.

  1. Abrir SqlServer para conexión por tcp/ip
  2. Para SqlServer 2008 sería:

    Ejecutar: Microsoft SQL Server 2008>Herramientas de configuración>Administración de Configuración de SQL Server

    Desplegar "Configuración de red de SQL Server", "Protocolos de " [Nombre instancia], y en TCP/IP dejar como habilitado

  3. Conseguir el jar adecuado.
  4. página de Microsoft sobre el tema

    Para la Java 1.7 corresponde el sqljdbc41.jar que habría que bajar de Internet

  5. La cadena de conexión
  6. Aquí está la madre del cordero.

    En mi caso "jdbc:sqlserver:" es siempre fijo.

    //nombre servidor:numero de puerto

    instanceName=nombre de instancia(si hay varias en el mismo equipo es fundamental ponerla)

    si se trabaja con autenticación de sqlServer (no Directorio Activo), user y password

    En resumen:

    "jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS2008;databaseName=nombreBD;user=sa;password=secreta";

Con esto funciono.

Añado código de ejemplo:(Sacado de uno de los ejemplos de Microsoft que vienen junto al .jar para conectarse)


import java.sql.*;


public class CrudSqlServer1 {

 public static void main(String[] args) {
  // Create a variable for the connection string.
  String connectionUrl = "jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS2008;databaseName=nombreBD;user=sa;password=secreta";

  // Declare the JDBC objects.
  Connection con = null;
  Statement stmt = null;
  ResultSet rs = null;
  
         try {
          // Establish the connection.
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
              con = DriverManager.getConnection(connectionUrl);
            
              // Create and execute an SQL statement that returns some data.
              String SQL = "SELECT * FROM Tabla1";
              stmt = con.createStatement();
              rs = stmt.executeQuery(SQL);
            
              // Iterate through the data in the result set and display it.
              while (rs.next()) {
               System.out.println(rs.getString(4) + " " + rs.getString(6));
              }
              System.out.println("FIN");
         }
        
  // Handle any errors that may have occurred.
  catch (Exception e) {
   e.printStackTrace();
  }

  finally {
   if (rs != null) try { rs.close(); } catch(Exception e) {}
       if (stmt != null) try { stmt.close(); } catch(Exception e) {}
       if (con != null) try { con.close(); } catch(Exception e) {}
  }

 }

}