Usar "SELECT INTO" con Azure SQL para copyr datos de otra database

Estoy tratando de automatizar la initialization de una database SQL en Azure. Para algunas tablas (de búsqueda), los datos deben copyrse desde un DB de origen en el nuevo DB cada vez que se inicializa.

Para hacer esto, ejecuto una consulta que contiene

SELECT * INTO [target_db_name]..[my_table_name] FROM [source_db_name].dbo.[my_table_name] 

En este punto se lanza una exception diciéndome que

La reference a la database y / o al nombre del server en 'source_db_name.dbo.my_table_name' no es compatible con esta versión de SQL Server.

Después de analizar esto, descubrí que ahora es posible hacer reference a otro SQL DB de Azure siempre que se haya configurado como un origen de datos externo. [ aquí y aquí ]

Entonces, en mi DB objective, he ejecutado la siguiente statement:

 CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'; CREATE DATABASE SCOPED CREDENTIAL cnetworking WITH IDENTITY = '<username>', SECRET = '<password>'; CREATE EXTERNAL DATA SOURCE [source_db_name] WITH ( TYPE=RDBMS, LOCATION='my_location.database.windows.net', DATABASE_NAME='source_db_name', CREDENTIAL= cnetworking ); CREATE EXTERNAL TABLE [dbo].[my_table_name]( [my_column_name] BIGINT NOT NULL ) WITH ( DATA_SOURCE = [source_db_name], SCHEMA_NAME = 'dbo', OBJECT_NAME = 'my_table_name' ) 

Pero la SELECT INTO sigue produciendo la misma exception.

Además, un simple SELECT * FROM [source_db_name].[my_table_name] arroja la exception "Nombre de object inválido 'source_db_name.my_table_name'".

¿Qué me estoy perdiendo?

ACTUALIZAR
He encontrado el problema: CREATE EXTERNAL TABLE crea lo que parece ser una tabla en el DB de destino. Para consultar esto, el nombre de la database fuente no debe ser utilizado. Entonces, donde estaba fallando:

 SELECT * FROM [source_db_name].[my_table_name] 

Veo que realmente debería estar consultando

 SELECT * FROM [my_table_name] 

Parece que podría necesitar definir esa tabla externa, de acuerdo con lo que parece ser la syntax correcta :

 CREATE EXTERNAL TABLE [dbo].[source_table]( ... ) WITH ( DATA_SOURCE = source_db_name ); 

El enfoque del nombre de tres partes no es compatible, excepto a través de la consulta de database elástica.

Ahora, como está creando una tabla externa, la consulta puede simular que la tabla externa es un object nativo de [target_db]; esto le permite escribir la consulta SELECT * FROM [my_table_name] , tal como averiguó de sus ediciones. A partir de la documentation, es importante tener en count que "Esto permite la consulta de solo lectura de las bases de datos remotas". Por lo tanto, este object de tabla no se puede escribir, pero su pregunta solo mencionó leer de él para llenar una nueva tabla.

Como prometí, así es como manejo las implementaciones de bases de datos para SQL Server. Utilizo el mismo método para la database SQL premier, Windows Azure o SQL en una VM en Azure. Me tomó mucho dolor, testing y error.

Todo comienza con las herramientas de datos de SQL Server, SSDT. Si aún no está utilizando SSDT para administrar su database como un proyecto separado de sus aplicaciones, debe hacerlo. Toma una copy aquí . Si ya está ejecutando una versión de Visual Studio en su máquina, puede get una versión de SSDT específica para esa versión de Visual Studio. Si aún no está ejecutando VS, entonces simplemente puede tomar SSDT e instalará los componentes mínimos de Visual Studio para que funcione.

¡Configurar su primer proyecto de database es fácil! Comience un nuevo proyecto de database. nuevo diálogo del proyecto

Luego, haga clic derecho en su proyecto de database y select Importar -> Base de datos. Importación de una base de datos existente

Ahora, puede señalar su copy de desarrollo actual de su database e importar su esquema en su proyecto. Este process extraerá todas las tablas, vistas, procedimientos almacenados, funciones, etc. de la database fuente. Cuando hayas terminado, verás algo como la siguiente image. su nuevo proyecto de base de datos

Hay una carpeta para cada esquema importado, así como una carpeta de security para definir los esquemas en su database. Explore estas carpetas y mire a través de los files creados.

Encontrará que todos los scripts creados son los scripts CREATE. Esto es importante de recordar para administrar el proyecto. Ahora puede save su nueva solución y luego verificarla en su sistema de control de fuente actual. Este es tu compromiso inicial.

Aquí está el nuevo process de pensamiento para administrar su proyecto de database. A medida que necesite realizar cambios en el esquema, ingresará en este proyecto para realizar cambios en estas instrucciones de creación para definir el estado en el que desea que esté el object. Siempre estás creando instrucciones CREATE, nunca las declaraciones ALTER en tu esquema. Mira el ejemplo a continuación.

Actualizar una tabla Digamos que hemos decidido comenzar a rastrear cambios en nuestra tabla dbo.ETLProcess. Necesitaremos columnas para rastrear CreatedDateTime, CreatedByID, LastUpdatedDateTime y LastUpdatedByID. Abra el file dbo.ETLProcess en la carpeta dbo \ Tables y verá que la versión actual de la tabla se ve así:

 CREATE TABLE [dbo].[ETLProcess] ( [ETLProcessID] INT IDENTITY (1, 1) NOT NULL , [TenantID] INT NOT NULL , [Name] NVARCHAR (255) NULL , [Description] NVARCHAR (1000) NULL , [Enabled] BIT DEFAULT ((1)) NOT NULL , CONSTRAINT [PK_ETLProcess__ETLProcessID_TenantID] PRIMARY KEY CLUSTERED ([ETLProcessID], [TenantID]) , CONSTRAINT [FK_ETLProcess_Tenant__TenantID] FOREIGN KEY ([TenantID]) REFERENCES [dbo].[Tenant] ([TenantID]) ); 

Para registrar el cambio que queremos hacer, simplemente agreguemos las columnas en la tabla de la siguiente manera:

 CREATE TABLE [dbo].[ETLProcess] ( [ETLProcessID] INT IDENTITY (1, 1) NOT NULL , [TenantID] INT NOT NULL , [Name] NVARCHAR (255) NULL , [Description] NVARCHAR (1000) NULL , [Enabled] BIT DEFAULT ((1)) NOT NULL , [CreatedDateTime] DATETIME DEFAULT(GETUTCDATE()) , [CreatedByID] INT , [LastUpdatedDateTime] DATETIME DEFAULT(GETUTCDATE()) , [LastUpdatedByID] INT , CONSTRAINT [PK_ETLProcess__ETLProcessID_TenantID] PRIMARY KEY CLUSTERED ([ETLProcessID], [TenantID]) , CONSTRAINT [FK_ETLProcess_Tenant__TenantID] FOREIGN KEY ([TenantID]) REFERENCES [dbo].[Tenant] ([TenantID]) ); 

No agregué ninguna key foránea a la definición, pero si desea crearlos, los agregará debajo de la key externa al inquilino. Una vez que haya realizado los cambios en el file, guárdelo.

Lo siguiente que querrá es acostumbrarse es verificar su database para asegurarse de que sea válida. En el mundo de la progtwigción, ejecutarías una compilation de testing para asegurarte de que comstack. Aquí, hacemos algo muy similar. Desde el menu principal, pulse Construir -> Crear database1 (el nombre de nuestro proyecto de database).

La window de salida se abrirá y le dirá si hay algún problema con su proyecto. Aquí es donde verá cosas como foreign keys que hacen reference a tablas que aún no existen, mala syntax en sus instrucciones de creación de objects, etc. Querrá limpiarlas antes de verificar su actualización en el control de código fuente. Tendrá que solucionarlos antes de que pueda implementar los cambios en su entorno de desarrollo.

Una vez que su proyecto de database se haya comstackdo correctamente y esté registrado en el control de origen, estará listo para el siguiente cambio de process.

Implementación de cambios anteriores Les dije que era importante recordar que todas las declaraciones de esquema son instrucciones CREATE. Este es el motivo: SSDT le ofrece dos forms de implementar sus cambios en una instancia de destino. Ambos usan estas declaraciones de creación para comparar su proyecto con el objective. Al comparar dos declaraciones de creación, puede generar sentencias ALTER necesarias para actualizar una instancia de destino con su proyecto.

Las dos opciones para implementar estos cambios son un script de cambio de T-SQL o dacpac. Según la publicación original, parece que el script de cambio será más familiar.

Haga clic derecho en su proyecto de database y elija Comparación de esquema. Esquema Comparar

Por defecto, su proyecto de database será la fuente de la izquierda. Haga clic en Seleccionar destino a la derecha y select la instancia de database que desea "actualizar". Luego click Comparar en la esquina superior izquierda, y SSDT comparará el estado de su proyecto con la database de destino.

A continuación, obtendrá una list de todos los objects en su database de destino que no están en el proyecto (en la sección DROP), una list de todos los objects que son diferentes entre el proyecto y la database de destino (en la sección ALTER) y list de objects que están en su proyecto y que aún no están en su database de destino (en la sección ADD).

A veces verá cambios enumerados que no desea realizar (cambios en la cubierta de los nombres de sus objects, o el número de paréntesis alnetworkingedor de sus declaraciones pnetworkingeterminadas. Puede anular la selección de cambios como ese. Otras veces no estará listo para implemente esos cambios en la implementación objective, también puede deseleccionarlos. Todos los elementos marcados se cambiarán en la database de destino, si elige actualizar (recuadro rojo a continuación) o se agrega a su secuencia de commands de cambio (recuadro verde a continuación), si presione el ícono "Generar secuencia de commands". Implementar opciones de cambio

Manejo de los datos de búsqueda en su proyecto de database Ahora, finalmente, llegamos a su pregunta original, ¿cómo deployment los datos de búsqueda en una database de destino? En su proyecto de database, puede hacer clic con el button derecho en el proyecto en el Explorador de soluciones y seleccionar Agregar -> Nuevo elemento. Obtendrá un cuadro de dialog. A la izquierda, click Scripts de usuario, luego a la derecha, elija Script postdeployment. Paso posterior a la implementación

Al agregar un script de este tipo, SSDT sabe que desea ejecutar este paso después de que cualquier esquema cambie. Aquí es donde ingresará sus valores de búsqueda, ¡como resultado están incluidos en el control de la fuente!

Ahora aquí hay una nota muy importante acerca de estos scripts de implementación posterior. Debe asegurarse de que cualquier T-SQL que agregue aquí funcione si llama al script en una nueva database, en una database existente, o si lo llamó 100 veces seguidas. Como resultado de este requisito, he decidido include todos mis valores de búsqueda en las declaraciones de fusión. De esa manera puedo manejar inserciones, actualizaciones y eliminaciones.

Antes de asignar este file al control de origen, pruébelo en los tres escenarios anteriores para asegurarse de que no fallará.

Envolver todo Pasar de realizar cambios directamente en sus entornos objective a usar SSDT y controlar sus cambios en la fuente es un gran paso en la maduración de su ciclo de vida de desarrollo de software. La buena noticia es que te hace pensar en tu database como parte del process de implementación de una manera que sea compatible con los methods de continuous integration / implementación continua.

Una vez que se acostumbre al nuevo process, podrá aprender a agregar un dacpac generado a partir de SSDT en sus scripts de implementación y hacer que los cambios se realicen en el momento correcto de su implementación.

También lo libera de su problema SELECCIONADO, su problema original.