2012-06-06 18 views
5

Quiero hacer una copia de seguridad de una base de datos de SQL Server con todos los objetos junto con los datos, pero los datos en todas las tablas deben ser limitados, es decir, 100 filas para cada tabla. Puedo hacer esto en MySQL muy fácilmente, pero en SQL Server no sé cómo hacerlo?¿Cómo hacer una copia de seguridad de la base de datos con 100 filas en cada tabla?

Por favor, ayúdenme.

Gracias

Nitesh Kumar

+3

Eso no es copia de seguridad, eso es exportar los datos. El propósito principal de la copia de seguridad es la recuperación de desastres, no tiene sentido limitar la cantidad de registros. ¿Qué está tratando de lograr? ¿Qué comandos/herramientas usaste con MySQL? –

+1

Si bien técnicamente puedes hacer esto, ¿cómo vas a utilizar 100 filas de cada tabla? ¿No hay absolutamente ninguna integridad referencial en absoluto? (Sospecho que no podría obtener 100 clientes y 100 pedidos sin violar la integridad ni redactar declaraciones muy complejas.) –

+1

Tiene sentido si tiene una base de datos de 10 TB y solo necesita una versión simple para trabajar en ella. Y por lo que he encontrado, no hay una solución fácil para SQL Server – Salim

Respuesta

0

Con SQL Server Me gustaría utilizar la función "BCP"

Esto requiere un poco de codificación sin embargo: la generación de la 100 instrucción de selección superior para cada mesa y la creación de una archivo por lotes

3

No se puede usar realmente un BACKUP DATABASE explícito para esto. Sin embargo, podría hacer algo como esto, pero tenga en cuenta que, como en mi comentario, estos datos serán de uso limitado si confía en cualquier tipo de integridad de datos, ya que el orden será relativamente arbitrario y, a menos que todo sea 1: 1 y usted sucede conseguir la clasificación mágicamente conveniente en todas las consultas que sólo será una mezcolanza masiva de datos:

CREATE DATABASE copy_of_original; 
GO 

USE original_db; 
GO 

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N''; 

-- this assumes all tables are in `dbo` schema: 
SELECT @sql = @sql + CHAR(13) + CHAR(10) 
    + 'SELECT TOP (100) * INTO copy_of_original.dbo.' 
    + QUOTENAME(name) + ' FROM dbo.' + QUOTENAME(name) + ';' 
FROM sys.tables 
WHERE schema_id = 1; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

una vez que haya terminado esto, se puede copia de seguridad copy_of_original - pero tenga en cuenta que no tendrá cualquiera de los índices o restricciones presentes en la base de datos original, y que TOP habrá elegido un conjunto arbitrario de 100 filas de cada tabla (o la tabla completa, para tablas pequeñas con menos de 100 filas).

0

Es posible que intente esta solución

  1. Por favor crea una copia de su base de datos

  2. Ejecutar el siguiente código en su copia de base de datos para borrar registros de la tabla que tienen más de 100 filas.

    sp_msforeachtable
    'ALTER TABLE? NOCHECK CONSTREÑIMIENTO TODO ; CON [DUMMYTABLE] AS (? SELECCIONAR RN = ROW_NUMBER() OVER (ORDER BY NEWID()), * FROM) CANCELACIÓN de [DUMMYTABLE] DONDE RN> 100 ALTER TABLE? CHECK CONSTRAINT ALL '

  3. Haga una copia de seguridad de su nueva base de datos.

Limitación:Emisión de integridad de los datos de la base de datos copia de seguridad, ya que deshabilita las limitaciones y borrar registros de la base de datos.

+0

Otra limitación: 'ORDER BY NEWID()' será potencialmente costoso en tablas más grandes.No lo recomendaría a menos que exista un requisito explícito para las filas * aleatorias. Además, copiar todos los datos solo para eliminar el 90% o más no parece una ruta eficiente (no me gustaría ver el registro de transacciones de la nueva base de datos cuando termine esta operación). –

Cuestiones relacionadas