sábado, 15 de julio de 2017

Listas simplemente enlazadas (Linked List)

Concepto de lista enlazada


Una lista simplemente enlazada pertenece a las estructuras de datos fundamentales. Suele utilizarse para implementar otras estructuras de datos. 
Está estructurada en una secuencia de nodos, en los que se guardan los datos  y un puntero que apunta (contiene la dirección de la ubicación) al siguiente nodo. 
La principal utilidad de la lista enlazada es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento físico en memoria. De este modo se permite que el orden de lectura de la lista sea diferente al orden de almacenamiento físico. Al contrario de un array, el acceso a cada elemento no se hace a través de un índice sino mediante un puntero. Otra diferencia con los arrays es que estos pueden ser accedidos de forma aleatoria mientras que la lista se recorre de forma ordenada.
La lista también permite añadir o eliminar nodos en cualquier lugar aunque no permite un acceso aleatorio. Cuando es necesario hacer varias operaciones de inserción y eliminación de elementos en un conjunto resulta conveniente utilizar listas enlazadas. El puntero del último nodo contiene un valor vacío Null.

Listas simplemente enlazadas

sábado, 8 de julio de 2017

Acciones sobre muchos archivos en Photoshop

En Photoshop se pueden crear procesos por lotes para actuar en un sólo paso sobre muchas imágenes sin tener que hacerlo una a una. 

Se pueden automatizar muchas funciones. Para ello, primero es necesario crear una Acción (lo que se desea hacer con cada imagen) y luego procesar los archivos por lotes (para ejecutar esa misma acción con todas las imágenes de una carpeta).

Acciones sobre muchos archivos en Photoshop

sábado, 1 de julio de 2017

Curso de C#: Control de flujo, estructuras condicionales


Instrucción IF...ELSE IF...ELSE


Si esta condición se evalúa a true (verdadero) se ejecutan las líneas del bloque, y si se evalúa a false (falso) no se ejecutan. en C#:

if (num==10)
{
    Console.WriteLine("El número es igual a 10");
}

En este pequeño ejemplo, se evalúa como verdadero o falso lo que está dentro de los paréntesis, es decir, num==10. Por lo tanto, el operador == retornará true siempre que num valga 10, y false si vale otra cosa. No confundir el operador de comparación == con el de asignación =. 

La instrucción if ejecuta el código de su bloque siempre que la expresión que se evalúa retorne true. Sin embargo, no es necesario abrir el bloque en el caso de que solamente haya que ejecutar una sentencia. Así, podríamos haber escrito el ejemplo de esta otra forma:

if (num==10)
    Console.WriteLine("El número es igual a 10");

O bien:

if (num==10) Console.WriteLine("El número es igual a 10");

Curso de C#: Control de flujo, estructuras condicionales

sábado, 24 de junio de 2017

Fotos en tres dimensiones con Photoshop

Hacer una foto en tres dimensiones es muy sencillo, y se puede realizar con cualquier cámara, incluso con la del móvil.
Para hacer una foto en tres dimensiones lo primero que hay que tener en cuenta es que en realidad necesitamos dos fotos normales y corrientes tomadas cada una de ellas como vistas por cada ojo diferente. Es decir para tomar una foto en tres dimensiones necesitamos tomar una foto y luego desplazar la cámara ligeramente (unos centímetros) y tomas una segunda foto intentando que el encuadre sea similar. Hecho esto, una vez disponemos de nuestras dos fotos normales y corrientes, con el mismo encuadre pero ligeramente desplazadas (tal y como veríamos la misma escena con el ojo izquierdo y con el derecho) tenemos varias formas de verla en tres dimensiones. Voy a explicar dos de ellas.

fotos en tres dimensiones con photoshop

sábado, 17 de junio de 2017

Curso de C#: campos y propiedades

Campos


Ambas cosas (campos y propiedades) representan a los datos de una clase, aunque cada uno de ellos lo hace de un modo diferente. Los campos de una clase se construyen a base de variables. 

class Circunferencia
    {

        public double Radio;
        public double Perimetro;
        public double Area;
        public const double PI=3.1415926;
    }
  
Los modificadores de acceso de los que se habló al comienzo de este curso  (private, protected, internal y public) son aplicables a las variables y constantes solamente cuando estas representan los campos de una clase, y para ello deben estar declaradas como miembros de la misma dentro de su bloque. Sin embargo, una variable que esté declarada en otro bloque distinto (dentro de un método, por ejemplo) no podrá ser un campo de la clase, pues será siempre privada para el código que esté dentro de ese bloque, de modo que no se podrá acceder a ella desde fuera del mismo. 

Curso de C#: campos y propiedades

sábado, 10 de junio de 2017

Cómo hacer una panorámica con Photoshop

Para hacer una panorámica con photoshop, primero es preciso disponer de al menos dos fotos lo suficientemente contiguas y encuadradas como para que photoshop pueda unirlas automáticamente. Si no son contiguas, photoshop producirá un error y no las podrá unir, y si no están bien encuadradas, photoshop generará un panorama distorsionado por los bordes.

Una vez disponemos de las fotos adecuadas, basta con abrirlas en photoshop con la opción archivo -> abrir.

Panorama con Photoshop

sábado, 3 de junio de 2017

Curso de C# : constructores y destructores

Constructores


El constructor de una clase es un método que se encarga de ejecutar las primeras acciones de un objeto cuando este se crea al instanciar la clase. Estas acciones pueden ser: inicializar variables, abrir archivos, asignar valores por defecto a las propiedades. Un par de reglas:

1º. El constructor ha de llamarse exactamente igual que la clase.
2º. El constructor nunca puede retornar un valor.

Lo primero que se ejecuta al crear un objeto es el constructor de la clase a la que dicho objeto pertenece (el compilador no exige que exista). 

    class Objeto
    {
        public Objeto()
        {
            Console.WriteLine("objeto instanciado");
        }
    }

    class ConstructoresApp
    {
        static void Main()
        {
            Objeto o = new Objeto();
            string a=Console.ReadLine();
        }
    }

En este ejemplo, la clase Objeto tiene un constructor (en negrita). Se declara igual que un método, con la salvedad de que no se pone ningún tipo de retorno Al ejecutar este programa, la salida en la consola sería esta:

Curso de C# : constructores y destructores


sábado, 27 de mayo de 2017

Excepciones en Visual Basic.NET

Vamos a utilizar los eventos para cosas que esperamos que le suceda al objeto. A veces suceden cosas que no se esperan. En .NET, las situaciones excepcionales son tratadas con el uso de excepciones, una implementación para el manejo de las condiciones de error. Dicho programa consiste en "manejar la excepción" cuando se pueden producir errores. Se puede escribir código para "atrapar" la excepción, con lo que la ejecución del programa no se detiene por completo. Por otra parte, se pueden crear excepciones personalizadas para la aplicación, para facilitar información específica al  programa y el usuario acerca de qué ha ido mal.

 Generar una excepción


Esta pequeña aplicación enseña cómo se captura una excepción.

Sobre el evento Click de un botón del formulario ponemos:

Private Sub Boton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Boton.Click

        Dim numbers() As Integer = {1, 2, 3, 4, 5}
        MessageBox.Show(numbers(9))
End Sub


Al ejecutar el programa saltará una excepción, pues intenta leer el índice 9 de un array que tiene 5 elementos, y dice que el array está fuera de rango. Se puede prevenir este error capturando la excepción.

Excepciones en Visual Basic.NET

sábado, 20 de mayo de 2017

Curso de C#: métodos

Métodos


Los métodos son bloques de código manejan los datos de la clase. Cómo se define un método en C#:

acceso tipo NombreMetodo(TipoArg1 argumento1, TipoArg2 argumento2 ...)
{
    // Aquí se codifica lo que tiene que hacer el método
}

acceso es el modificador de acceso del método, que puede ser private, protected, internal o public (como las variables). Posteriormente el tipo de retorno, es decir, el tipo de dato que devolverá el método (que puede ser cualquier tipo). Luego el nombre del método (sin espacios en blanco). Después, entre paréntesis y separados unos de otros por comas, la lista de argumentos que aceptará el método: cada uno de ellos se especificará poniendo primero el tipo y después el nombre del mismo. Por fin, la llave de apertura de bloque seguida del código del método y, para terminarlo, la llave de cierre del bloque.


Curso de C#: métodos


sábado, 13 de mayo de 2017

Principios SOLID de la programación orientada a objetos

Solid es un acrónimo para establecer los cinco principios básicos de la programación orientada a objetos y diseño. El objetivo de tener un buen diseño de programación es llegar a la fase de mantenimiento de una forma más legible y sencilla así como conseguir crear nuevas funcionalidades sin tener que modificar en gran medida código antiguo. Los costes de mantenimiento pueden abarcar el 80% de un proyecto de software por lo que hay que valorar un buen diseño.
Las reglas SOLID son un conjunto de principios que, aplicados correctamente,  ayudan a escribir software de calidad en cualquier lenguaje de programación orientado a objetos. El código será más fácil de leer, testear y mantener.

Los procesos de refactorización serán mucho más sencillos si se cumplen estas reglas.

Los principios en los que se basa SOLID son los siguientes:
Principio de Responsabilidad Única
Principio Open/Closed
Principio de Sustitución de Liskov
Principio de Segregación de Interfaces
Principio de Inversión de Dependencias


Principios SOLID de la programación orientada a objetos





sábado, 6 de mayo de 2017

Curso de C#: operadores

Los operadores sirven, para efectuar operaciones con uno o más parámetros (sumar, restar, comparar...) y retornar un resultado. Aquí se muestra una tabla con los operadores de C#.

Operadores de C#
Tomado de el Guille

sábado, 29 de abril de 2017

Interfaces predefinidos en .NET

Interfaces genéricas de .NET


. NET define varias interfaces genéricas de uso común de entre las que podemos elegir para implementar nuestras clases. Estas interfaces nos permiten obtener funcionalidad adicional para nuestro objeto. Algunas interfaces se describen en la tabla siguiente:



Interfaz


Descripción

IComparable

Define el ordenamiento de instancias de la clase. Es útil si queremos utilizar la clase como un valor clave en SortedList o vamos a usar el método Sort del ArrayList.


IEnumerable e IEnumerator


Estas dos interfaces trabajan juntas dando soporte a los For…Each de nuestra clase


IFormattable


Permite definir formateos de cadena definidos por el usuario


IList


Permite a la clase servir como fuente de datos Para controles tales como ListBox y DataGrid. La implementación de la base es List.


ICloneable


Permite definir exactamente como será copiado nuestro objeto.


IComponent


Provee soporte como componente a nuestra clase en tiempo de diseño. La base de esta implementación es Component.


IDataErrorInfo


Permite añadir a la clase información sobre errores.  El soporte de esta interface nos permite usar el control Dataerror en un formulario de Windows.



A continuación, vamos a crear una clase simple que representa un punto. Vamos a usar esta clase como una base para la aplicación de los interfaces IComparable, IEnumerator IEnumerable, y de IFormattable. Estas interfaces de usuario hacen que la clase sea más fácil de usar para otros desarrolladores.

Interfaces predefinidos en .NET

sábado, 22 de abril de 2017

Curso de C#: introducción, variables y constantes

Introducción


La sintaxis de C# es muy parecida a la de C, C++ y, sobre todo, Java. Así, por ejemplo, declarar una variable o un puntero en C# se escribe igual que en C:

int a;
int* pA;

Aunque el código sea sintácticamente idéntico, semánticamente puede ser muy distinto, es decir: mientras en C la una variable de tipo int es eso y nada más, en C# una variable de tipo int es en realidad un objeto de la clase System.Int32. Las diferencias más importantes entre C y C# no suelen ser sintácticas sino sobre todo semánticas.

En C# todas las instrucciones y declaraciones deben terminar con ; (punto y coma), salvo que haya que abrir un bloque de código.  Al contrario que en Visual Basic, aquí se puede poner una instrucción que sea muy larga en varias líneas sin poner ningún tipo de signo especial al final de cada una.

CURSO DE C#: introducción, variables y constantes

sábado, 15 de abril de 2017

Interfaces

Introducción


Un interfaz proporciona una lista de propiedades y métodos que posteriormente serán codificados en una o varias clases. Es decir, su naturaleza es declarativa, no contiene código de los miembros que expresa. En. NET, las interfaces se utilizan comúnmente para prestación de servicios para una clase. La interfaz  apoya algo que puede hacer el objeto de la clase, pero el servicio no está incluido en la relación es-un de la herencia.

Cuando utilizamos la herencia para hacer  nuevas clases diferentes de las clases existentes, si las clases están relacionadas por la herencia, se puede hacer referencia a una instancia derivada a través de una referencia a un valor de la clase base. Este comportamiento polimórfico no se limita a las clases derivadas. Visual Basic. NET ofrece otra construcción: la interfaz, que también se comporta de forma polimórfica

Interfaces con visual basic.NET

sábado, 8 de abril de 2017

Programación en C#. Cómo hacer un “Hola Mundo” y añadirle propiedades

Vamos a realizar un primer programa en C# y luego lo iremos ampliando con una de las características básicas de un programa de programación orientada a objetos: las propiedades.
Para comenzar este programa abrimos Visual Studio y pulsamos en nuevo -> proyecto.

Programación en C sharp. Cómo hacer un “Hola Mundo” y añadirle propiedades

sábado, 25 de marzo de 2017

Utilidades de SQL SERVER y Visual Basic.NET

A continuación se presentan algunas utilidades que no merecen un artículo por si mismas pero que conviene tener en cuenta.

Utilidades de SQL Server


Ver quien está utilizando la base de datos

Con las nuevas versiones no hay manera de ver quien está conectado a la base de datos.
Pero existe un procedimiento almacenado llamado  sp_who  que muestra quien está utilizando la bbdd.

Utilidades de SQL SERVER y Visual Basic.NET


sábado, 18 de marzo de 2017

Creación de un inicio de sesión en SQL Server 2008

Un inicio de sesión, es una entidad de seguridad que puede ser autenticada por un sistema seguro. Se pueden conceder permisos a los inicios de sesión. El ámbito de un inicio de sesión es todo el motor de base de datos. Un inicio de sesión debe estar asignado a un usuario de la base de datos. Los permisos dentro de la base de datos se conceden y deniegan al usuario de la base de datos, no al inicio de sesión. 

Para crear un inicio de sesión 


Abrimos el administrador corporativo de SQL Server 2008 y en la ventana del Explorador de objetos, sobre la carpeta de la instancia de servidor en la que se desea crear el nuevo inicio de sesión se hace clic con el botón derecho del ratón sobre la carpeta Seguridad, y se selecciona Nuevo y, después,  Inicio de sesión….

Creación de un inicio de sesión en SQL Server 2008

sábado, 11 de marzo de 2017

Subconsultas en SQL

Son aquellas sentencias SELECT que se encuentran anidadas en una cláusula WHERE o HAVING de otra sentencia de orden superior. Cada una de las subconsultas debe incluir al menos una cláusula SELECT y otra FROM y se escriben entre paréntesis para que el gestor de la base de datos la realice en primer lugar.

Las subconsultas pueden ser correlacionadas o no correlacionadas. Una consulta es correlacionada si su resultado depende de la SELECT externa de la que depende. Cualquier otra subconsulta es denominada no correlacionada.

Subconsultas en SQL

sábado, 4 de marzo de 2017

SQL Server: Interpretar planes de ejecución gráficos para consultas básicas

Vamos a tratar de explicar cómo interpretar planes de ejecución gráficos básicos, es decir, planes de ejecución para sentencias del tipo SELECT, UPDATE, INSERT Y DELETE, con sólo unos pocos JOINS y si no hay funciones avanzadas o indirectas. 

Los planes gráficos están basados en iconos, y el número de iconos a aprender es mínimo. Cada icono representa un operador específico dentro de la ejecución del plan. Se va a utilizar el término "icono" y "operador" de forma intercambiable.

Hay 78 operadores disponibles. Afortunadamente, no es necesario memorizar todos antes de que podamos leer un plan de ejecución gráfico. La mayoría de las consultas utilizan sólo un pequeño subconjunto de operadores, y nos centraremos en los principales. Si vemos un icono desconocido, se puede encontrar más información al respecto en los libros en pantalla. .

Un plan de ejecución gráfico muestra cuatro tipos distintos de operadores:

• Los operadores lógicos y físicos, también llamados iteradores, aparecen como iconos azules y representan la ejecución de consultas u operaciones DML.

• Operadores de paralelismo físico son también iconos azules y representan operaciones de paralelismo. Son un subconjunto de los operadores lógicos y físicos, pero conllevan un nivel completamente diferente de análisis en el plan de ejecución.

• Operadores de cursor, tienen iconos de color amarillo y representan operaciones de cursor de SQL.

• Elementos del lenguaje son iconos verdes y representan elementos del lenguaje SQL, como ASSIGN, DECLARE, IF, SELECT (RESULT), WHILE.

Nos centraremos principalmente en los operadores lógicos y físicos, incluyendo algunos operadores de paralelismo físico. Algunos textos enumeran en orden alfabético todos los operadores, pero esta no es la forma más fácil de aprenderlos, aquí nos centraremos en los iconos más comunes.

Podemos aprender mucho de cómo trabajan los operadores observando la forma en que operan dentro de los planes de ejecución. La clave, es aprender a utilizar las propiedades de cada uno de los operadores y profundizar en ellas. Cada operador, tiene un conjunto diferente de características. Algunos operadores, principalmente Sort, Hash Match (Aggregate) y Hash Join requieren una cantidad variable de memoria para ejecutarse. Una consulta con uno de estos operadores puede tener un tiempo de retardo antes de su ejecución, pudiendo afectar negativamente al rendimiento. A continuación, se muestra una lista de los operadores.

SQL Server: Interpretar planes de ejecución gráficos para consultas básicas

sábado, 18 de febrero de 2017

Roles de SQL Server

Trabajando con roles de servidor

SQL Server provee roles de servidor para ayudar a administrar permisos en un servidor. Estos roles son perfiles de seguridad que agrupan  otros perfiles.
Las roles fijos  de servidor se proporcionan para mayor comodidad y compatibilidad con versiones anteriores.  Es mejor asignar permisos más específicos siempre que sea posible.

Roles de SQL Server

sábado, 11 de febrero de 2017

Interfaz de búsqueda de Enterprise Vault para Microsoft® Exchange Server™

Acerca de la búsqueda de Enterprise Vault

La nueva interfaz de búsqueda de Enterprise Vault proporciona un rápido y fácil acceso al contenido de los archivos de almacenamiento de nuestro correo de Microsoft Exchange Server. En ella es posible hacer lo siguiente:

Buscar.
Examinar.
Ver previamente los elementos y sus archivos adjuntos.
Guardar las carpetas y las consultas de búsqueda frecuentemente usadas en una lista de favoritos para obtener acceso con un solo clic.
Descargar elementos del archivo de almacenamiento como archivos .msg.
Exportar los elementos archivados a un archivo .zip.

Interfaz de búsqueda de Enterprise Vault para Microsoft® Exchange Server™

sábado, 4 de febrero de 2017

Bases de datos parcialmente contenidas II


Administración de una base de datos parcialmente contenida

Mantener la configuración de la base de datos en la propia base de datos en lugar de en la master, permite que cada propietario tenga más control sobre su base de datos, sin necesidad de conceder permisos al administrador de la base de datos sysadmin.

Limitaciones

Las bases de datos parcialmente contenidas no permiten las siguientes características:
Utilizar la replicación, cambiar la captura de datos ni cambiar el seguimiento.
Procedimientos numerados.
Objetos vinculados al esquema que dependen de funciones integradas con cambios de intercalación
Cambio de enlace resultante de cambios de intercalación, incluidas referencias a objetos, columnas, símbolos o tipos.
Replicación, cambio de captura de datos y seguimiento de cambios.

Advertencia. Los procedimientos almacenados temporales están permitidos. Pero dado que los procedimientos almacenados temporales infringen el confinamiento, no se espera que sean compatibles con versiones futuras de la base de datos contenida.

Bases de datos parcialmente contenidas II


Identificación de contención de la base de datos

Hay dos formas de identificar el estado de contención de la base de datos. Sys.dm_db_uncontained_entities  es una vista que muestra todas las entidades potencialmente no contenidas en la base de datos. El evento database_uncontained_usage se produce cuando se identifica cualquier entidad no contenida real en tiempo de ejecución.

sys.dm_db_uncontained_entities  

Esta vista muestra todas las entidades de la base de datos que tienen el potencial de no estar contenidas, como las que cruzan el límite de la base de datos. Esto incluye aquellas entidades de usuario que pueden utilizar objetos fuera del modelo de base de datos. Sin embargo, debido a que la contención de algunas entidades (por ejemplo, aquellas que utilizan SQL dinámico) no se puede determinar hasta el tiempo de ejecución, la vista puede mostrar algunas entidades que estén contenidas. 

El evento XEvent de database_uncontained_usage 

Este evento (XEvent) se dispara siempre que se identifica en tiempo de ejecución una entidad no contenida. Esto incluye entidades originadas en código de cliente. Este evento ocurrirá sólo para las entidades no contenidas reales. Sin embargo, el evento sólo se producirá en tiempo de ejecución. Por tanto, cualquier entidad de usuario no contenida que no se haya ejecutado no será identificada por este evento.


Buenas prácticas de seguridad con Bases de Datos contenidas

Las bases de datos contenidas están expuestas a algunas amenazas únicas que deben ser tenidas en cuenta  y mitigadas. La mayoría de las amenazas están relacionadas con el proceso de autenticación USER WITH PASSWORD, que mueve el límite de autenticación desde el nivel del motor de base de datos hasta el nivel de base de datos.


Amenazas relacionadas con los usuarios

Los usuarios de una base de datos contenida con permisos ALTER ANY USER, como miembros de las funciones de base de datos db_owner y db_securityadmin, pueden conceder acceso a la base de datos sin el conocimiento o el permiso o el administrador de SQL Server. Conceder a los usuarios acceso a una base de datos contenida incrementa riesgo de ataque potencial contra la instancia de SQL Server. Los administradores deben tener en cuenta esta delegación de control de acceso y tener mucho cuidado al conceder a los usuarios de la base de datos contenida el permiso ALTER ANY USER. Todos los propietarios de bases de datos tienen el permiso ALTER ANY USUARIO. Los administradores de SQL Server deben auditar periódicamente a los usuarios de una base de datos contenida.


Acceso a otras bases de datos con la cuenta de invitado

Los propietarios y usuarios de bases de datos con permiso ALTER ANY USER pueden crear usuarios de bases de datos contenidas. Una vez un usuario se conecta a una base de datos contenida, puede acceder a otras bases de datos en el motor de base de datos, si las otras bases de datos tienen habilitada una cuenta de invitado Guest.

Creación de un usuario duplicado en otra base de datos

Algunas aplicaciones pueden requerir que un usuario tenga acceso a más de una base de datos. Para ello se pueden crear usuarios de bases de datos idénticos en cada base de datos contenida. Se puede utilizar la opción SID para crear un segundo usuario con contraseña. El siguiente ejemplo crea dos usuarios idénticos en dos bases de datos.

USE DB1;  
GO  
CREATE USER Pepe WITH PASSWORD = '<strong password>';   
-- Return the SID of the user  
SELECT SID FROM sys.database_principals WHERE name = 'Pepe';  
  
-- Change to the second database  
USE DB2;  
GO  
CREATE USER Pepe WITH PASSWORD = '<same password>', SID = <SID from DB1>;  
GO  

Para ejecutar una consulta entre bases de datos, es necesario marcar la opción TRUSTWORTHY en la base de datos de llamadas. Por ejemplo si el usuario (Pepe) definido anteriormente está en DB1, para ejecutar SELECT * FROM db2.dbo.Table1; Entonces debe estar activada para la base de datos DB1 la configuración TRUSTWORTHY. Es necesario ejecutar el siguiente código para activar la configuración de confianza TRUSTWORTHY.
ALTER BASE DE DATOS DB1 SET TRUSTWORTHY ON;

Creación de un usuario que duplica un inicio de sesión

Si se crea un usuario de una base de datos contenida con contraseña con el mismo nombre que un inicio de sesión de SQL Server y si el inicio de sesión de SQL Server se conecta especificando la base de datos contenida como el catálogo inicial, el inicio de sesión de SQL Server no podrá conectarse. La conexión se evaluará como el usuario de base de datos contenida con la contraseña principal de la base de datos contenida en vez de como un usuario basado en el inicio de sesión de SQL Server. Esto podría causar una denegación de servicio intencional o accidental para el inicio de sesión de SQL Server.

Como práctica recomendada, los miembros de la función fija de servidor sysadmin deben considerar la posibilidad de conectarse siempre sin utilizar la opción de catálogo inicial. Esto conecta el inicio de sesión a la base de datos master y evita cualquier intento de inicio de sesión no autorizado de un propietario de la base de datos. A continuación, el administrador puede cambiar a la base de datos contenida mediante la instrucción USE <base de datos>. También se puede establecer un inicio de sesión predeterminado de la base de datos contenida, que complete el inicio de sesión de master y, a continuación, transferir el inicio de sesión a la base de datos contenida.
Como práctica sugerida, no se deben crear usuarios de base de datos contenidas con contraseñas que tengan el mismo nombre que los inicios de sesión de SQL Server. Si existe una conexión duplicada, es mejor conectarse a la base de datos master sin especificar un catálogo inicial y, a continuación, ejecutar el comando USE para cambiar a la base de datos contenida.
Cuando hay bases de datos contenidas, los usuarios de bases de datos no contenidas deben conectarse al motor de base de datos sin utilizar un catálogo inicial o especificando el nombre de base de datos de una base de datos no contenida como el catálogo inicial. Esto evita la conexión a la base de datos contenida que está bajo control menos directo por los administradores del motor de base de datos.

Aumentar el acceso cambiando el estado de contención de una base de datos

Los inicios de sesión que tienen el permiso ALTER ANY DATABASE, tal como los miembros de la función de servidor fijo de dbcreator y los usuarios de una base de datos no contenida que tienen el permiso CONTROL DATABASE, como miembros del rol de base de datos fijo db_owner, pueden cambiar la configuración de una base de datos contenida. En el caso de que se cambie de NONE a PARTIAL o FULL, se puede conceder acceso de usuario creando usuarios de base de datos con contraseña. Esto puede proporcionar acceso sin el conocimiento o  consentimiento del administrador. Para evitar que las bases de datos contengan las conexiones de los usuarios con contraseñas es necesario utilizar triggers de inicio de sesión para cancelar los intentos de inicio de sesión.

Adjuntar una base de datos contenida

Para adjuntar una base de datos contenida, un administrador debe dar a los usuarios no deseados acceso a la instancia del motor de base de datos. Un administrador preocupado por este riesgo puede poner la base de datos en modo RESTRICTED_USER, lo que impide la autenticación de usuarios con contraseña. Sólo los usuarios autorizados a través de  inicios de sesión podrán acceder al motor de base de datos.
Los usuarios se crean utilizando los requisitos de contraseña en vigor en el momento de su creación y las contraseñas no se vuelven a verificar cuando se adjuntan a una base de datos. Al adjuntar una base de datos contenida a un sistema con una directiva de contraseñas más estricta, si la base de datos adjuntada contiene contraseñas débiles, el administrador podría permitir contraseñas que no cumplan la directiva de contraseñas actual en el motor de base de datos adjunto. Los administradores pueden evitar las contraseñas débiles obligando a  que todas las contraseñas se restablezcan para la base de datos adjunta.

Políticas de password

Las contraseñas de una base de datos deben ser contraseñas seguras, pero no es posible protegerlas mediante políticas de contraseña sólidas. Es mejor utilizar la autenticación de Windows siempre que sea posible para aprovechar las políticas de contraseña más extensas disponibles desde Windows.

Autentificación Kerberos

Las contraseñas de usuario de las bases de datos no pueden utilizar la autenticación Kerberos. Por tanto siempre que sea posible hay que utilizar la autenticación de Windows para aprovechar las características de Windows como Kerberos.

Acceso al diccionario fuera de línea

Los hashes de contraseñas de los usuarios de base de datos con contraseñas se almacenan en la base de datos contenida. Cualquier persona con acceso a los archivos de base de datos podría realizar un ataque de diccionario contra los usuarios de base de datos con contraseñas en un sistema no auditado. Para mitigar esta amenaza, hay que restringir el acceso a los archivos de base de datos o solo permitir conexiones a bases de datos contenidas mediante la autenticación de Windows.

Migrar a una base de datos parcialmente contenida

Preparación para migrar una base de datos

Revisar los siguientes elementos para considerar la migración de una base de datos al modelo de base de datos parcialmente contenido.

Es necesario comprender el modelo de base de datos parcialmente contenido. 

Es necesario comprender los riesgos exclusivos de las bases de datos parcialmente contenidas

Las bases de datos contenidas no admiten replicación, cambio de captura de datos o seguimiento de cambios. Es necesario confirmar que la base de datos no utiliza estas funciones.

Hay que revisar la lista de características que se modifican en la base de datos para convertirla en parcialmente contenidas.

Consultar sys.dm_db_uncontained_entities  para encontrar objetos o características no contenidas en la base de datos.

Supervisar el objeto XEvent de database_uncontained_usage para ver cuándo se utilizan las entidades no contenidas.

Habilitar bases de datos contenidas

Antes de poder crear bases de datos contenidas estas, deben estar habilitadas en la instancia del motor de base de datos de SQL Server, Para habilitar las bases de datos contenidas. El siguiente ejemplo habilita bases de datos contenidas en la instancia del motor de base de datos de SQL Server.

sp_configure 'contained database authentication', 1;  
GO  
RECONFIGURE ;  
GO  

Habilitación de bases de datos contenidas utilizando Management Studio

Para habilitar bases de datos contenidas utilizando management studio es necesario:

Sobre el explorador de objetos, hacer clic con el botón secundario del ratón en el nombre del servidor y, a continuación, clic en Propiedades.

En la página Avanzado, en la sección Contención, establecer la opción Habilitar bases de datos contenidas en Verdadero.
Hacer clic en Aceptar.

Convertir una base de datos en una parcialmente contenida

Una base de datos se convierte en una base de datos contenida al cambiar la opción CONTAINMENT con management studio o bien a través de comandos de SQL. 

El ejemplo siguiente convierte una base de datos denominada Contabilidad a una base de datos parcialmente contenida.

USE [master]  
GO  
ALTER DATABASE [Accounting] SET CONTAINMENT = PARTIAL  
GO  

Conversión de una base de datos parcialmente contenida mediante Management Studio
El ejemplo siguiente convierte una base de datos en una base de datos parcialmente contenida.
1. En Explorador de objetos, expanda Bases de datos, haga clic con el botón secundario en la base de datos para convertir y, a continuación, haga clic en Propiedades.
2. En la página Opciones, cambie la opción Tipo de contención a Parcial.
3. Haga clic en Aceptar.
Migración de usuarios a usuarios de bases de datos contenidas
El ejemplo siguiente migra a todos los usuarios que se basan en inicios de sesión de SQL Server a usuarios de bases de datos con contraseñas. El ejemplo excluye los inicios de sesión que no están habilitados. Debe ejecutarse sobre la base de datos contenida.

DECLARE @username sysname ;  
DECLARE user_cursor CURSOR  
    FOR   
        SELECT dp.name   
        FROM sys.database_principals AS dp  
        JOIN sys.server_principals AS sp   
        ON dp.sid = sp.sid  
        WHERE dp.authentication_type = 1 AND sp.is_disabled = 0;  
OPEN user_cursor  
FETCH NEXT FROM user_cursor INTO @username  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
        EXECUTE sp_migrate_user_to_contained   
        @username = @username,  
        @rename = N'keep_name',  
        @disablelogin = N'disable_login';  
    FETCH NEXT FROM user_cursor INTO @username  
    END  
CLOSE user_cursor ;  
DEALLOCATE user_cursor ;  

Related Posts Plugin for WordPress, Blogger...