2012-06-06 17 views
5

Chcę utworzyć kopię zapasową bazy danych SQL Server z wszystkimi obiektami wraz z danymi, ale dane we wszystkich tabelach powinny być ograniczone, tj. 100 wierszy dla każdej tabeli. Mogę to zrobić w mysql bardzo łatwo, ale w SQL Server nie wiem jak to zrobić?Jak wykonać kopię zapasową bazy danych za pomocą 100 wierszy w każdej tabeli?

Proszę mi pomóc.

Dzięki

Nitesh Kumar

+3

To nie jest kopia zapasowa, to eksport danych. Podstawowym celem kopii zapasowej jest odtwarzanie po awarii, nie ma sensu ograniczanie liczby rekordów. Co próbujesz osiągnąć? Z jakich poleceń/narzędzi korzystałeś w MySQL? –

+1

Chociaż możesz to technicznie zrobić, jak zamierzasz użyć 100 wierszy z każdej tabeli? Czy absolutnie nie ma żadnej integralności referencyjnej? (Podejrzewam, że nie można pobrać 100 klientów i 100 zamówień bez naruszania integralności lub pisania bardzo złożonych instrukcji.) –

+1

Ma sens, jeśli masz bazę danych o pojemności 10 TB i potrzebujesz prostej wersji do pracy nad nią. I o ile znalazłem, nie ma łatwego rozwiązania dla SQL Server – Salim

Odpowiedz

0

SQL Server chciałbym użyć funkcji "BCP"

To wymaga trochę kodowania mimo: generując 100 najlepszych select dla każdej tabeli i stworzenie plik wsadowy

3

Do tej pory nie można użyć jawnego BACKUP DATABASE. Możesz jednak zrobić coś takiego - pamiętaj jednak, że - jak w moim komentarzu - dane te będą ograniczone, jeśli polegasz na jakiejkolwiek integralności danych, ponieważ zamówienie będzie względnie arbitralne i jeśli wszystko będzie 1: 1 i zdarzy ci się dostać magicznie dogodnym sortowania na wszystkich zapytań będzie to po prostu ogromny Hodge podge danych:

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; 

Kiedy skończysz ten można backup copy_of_original - ale należy pamiętać, że nie będzie miał którykolwiek z indeksów lub ograniczeń obecnych w oryginalnej bazie danych, i że TOP wybierze dowolny zestaw 100 wierszy z każdej tabeli (lub całej tabeli, dla małych tabel z mniej niż 100 wierszy).

0

Może spróbuj tego rozwiązania

  1. należy utworzyć kopię bazy danych

  2. Wykonaj poniższy kod w kopii DB usunąć wiersze z tabeli posiadające więcej niż 100 wierszy.

    sp_msforeachtable
    "ALTER TABLE? NOCHECK CONSTRAINT ALL ; WITH [DUMMYTABLE] AS (WYBIERZ RN = ROW_NUMBER() OVER (ORDER BY NEWID()), * FROM?) USUŃ Z [DUMMYTABLE] GDZIE RN> 100 ALTER TABLE? Sprawdź CONSTRAINT ALL '

  3. Utwórz kopię zapasową nowej bazy danych.

Ograniczenie:Problem w integralność danych z kopii zapasowej bazy danych, jak wyłączyć ograniczenia i usuwanie wierszy z bazy danych.

+0

Kolejne ograniczenie: "ORDER BY NEWID()" potencjalnie będzie dość kosztowne na większych tabelach.Nie sugerowałbym tego, chyba że istnieje wyraźny wymóg dla * losowych * wierszy. Ponadto kopiowanie wszystkich danych tylko w celu usunięcia 90 +% z nich nie wydaje się być wydajną ścieżką (nie chciałbym widzieć dziennika transakcji dla nowej bazy danych po zakończeniu tej operacji). –

Powiązane problemy