Jak mogę zautomatyzować zadanie „generowania skryptów” w SQL Server Management Studio 2008?

98

Chciałbym zautomatyzować generowanie skryptów w SQL Server Management Studio 2008.

W tej chwili robię:

  • Kliknij prawym przyciskiem myszy moją bazę danych, Zadania, „Generuj skrypty ...”
  • ręcznie wybierz wszystkie potrzebne opcje eksportu i kliknij wybierz wszystko na karcie „wybierz obiekt”
  • Wybierz folder eksportu
  • Ostatecznie naciśnij przycisk „Zakończ”

Czy istnieje sposób na zautomatyzowanie tego zadania?

Edycja: Chcę generować skrypty do tworzenia , a nie zmieniać skryptów.

Brann
źródło
znalazłeś odpowiedź? Też chcę to zrobić, użyłem Publishing, zapisałem na twardo, nie wiem gdzie i tam nie mam wszystkich opcji jakie są przy generowaniu skryptu: -?
Alexa Adrian
1
Jak wspomniano w kilku odpowiedziach, użyj SMO, jeśli jesteś programistą
Jay Jay Jay

Odpowiedzi:

31

To, o czym Brann wspomina z pakietu Visual Studio 2008 SP1 Team Suite, to wersja 1.4 Kreatora publikacji bazy danych. Jest instalowany z serwerem sql 2008 (może tylko profesjonalnym?) Do \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. Wywołanie VS z eksploratora serwera po prostu to wywołuje. Możesz osiągnąć tę samą funkcjonalność za pomocą wiersza poleceń, na przykład:

sqlpubwiz help script

Nie wiem, czy wersja 1.4 ma te same problemy co wersja 1.1 (użytkownicy są konwertowani na role, ograniczenia nie są tworzone w odpowiedniej kolejności), ale nie jest to dla mnie rozwiązanie, ponieważ nie obsługuje skryptów obiektów do różnych plików, takich jak opcja Zadania-> Generuj skrypty w programie SSMS. Obecnie używam zmodyfikowanej wersji Scriptio (używa interfejsu MS SMO API), aby działać jako ulepszony zamiennik kreatora publikacji bazy danych (sqlpubwiz.exe). Obecnie nie można go obsługiwać skryptami z wiersza poleceń, mogę dodać ten wkład w przyszłości.

Scriptio został pierwotnie opublikowany na blogu Billa Graziano, ale później został udostępniony CodePlex przez Billa i zaktualizowany przez innych. Przeczytaj dyskusję, aby zobaczyć, jak skompilować do użytku z SQL Server 2008.

http://scriptio.codeplex.com/

EDYCJA: Od tego czasu zacząłem używać produktu RedGate SQL Compare, aby to zrobić. Jest to bardzo fajny zamiennik dla wszystkiego, co powinien być kreator publikacji sql. Jako źródło wybierasz bazę danych, kopię zapasową lub migawkę, a jako lokalizację wyjściową folder, a wszystko ładnie zrzuca do struktury folderów. Jest to ten sam format, którego używa ich inny produkt, kontrola źródła SQL.

noobish
źródło
Czy jest odpowiednik w 2012 roku? Byłbym szczęśliwy, gdyby kreator zapamiętał moje ustawienia, takie jak „Indeksy skryptów”.
PeterX
6
@PeterX SMSS> Narzędzia> Opcje> Eksplorator obiektów SQL Server> Skrypty
zanlok
1
Na rok 2012 postępuj zgodnie z tym przewodnikiem: simple-talk.com/sql/database-administration/…
Simon Hutchison
@zanlok bardzo przydatny komentarz. Niestety brakuje im opcji „Uwzględnij nieobsługiwane instrukcje” w SQL Server 2014.
jk7
42

SqlPubwiz ma bardzo ograniczone opcje w porównaniu do generowania skryptów w SSMS. Natomiast opcje dostępne w SMO prawie dokładnie odpowiadają opcjom SSMS, co sugeruje, że jest to prawdopodobnie ten sam kod. (Mam nadzieję, że firma MS nie napisała tego dwa razy!) Istnieje kilka przykładów w witrynie MSDN, takich jak ten, które pokazują tabele skryptów jako pojedyncze obiekty. Jeśli jednak chcesz, aby wszystko działało poprawnie z „pełnym” schematem, który zawiera obiekty „DRI” (deklaratywna integralność odniesienia), takie jak klucze obce, to tabele skryptów indywidualnie nie działają poprawnie na zależności. Okazało się, że konieczne jest zebranie wszystkich numerów URN i przekazanie ich skrypterowi w postaci tablicy. Ten kod, zmodyfikowany z przykładu,

    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Sdk.Sfc;
    // etc...

    // Connect to the local, default instance of SQL Server. 
    Server srv = new Server();

    // Reference the database.  
    Database db = srv.Databases["YOURDBHERE"];

    Scripter scrp = new Scripter(srv);
    scrp.Options.ScriptDrops = false;
    scrp.Options.WithDependencies = true;
    scrp.Options.Indexes = true;   // To include indexes
    scrp.Options.DriAllConstraints = true;   // to include referential constraints in the script
    scrp.Options.Triggers = true;
    scrp.Options.FullTextIndexes = true;
    scrp.Options.NoCollation = false;
    scrp.Options.Bindings = true;
    scrp.Options.IncludeIfNotExists = false;
    scrp.Options.ScriptBatchTerminator = true;
    scrp.Options.ExtendedProperties = true;

    scrp.PrefetchObjects = true; // some sources suggest this may speed things up

    var urns = new List<Urn>();

    // Iterate through the tables in database and script each one   
    foreach (Table tb in db.Tables)
    {
        // check if the table is not a system table
        if (tb.IsSystemObject == false)
        {
            urns.Add(tb.Urn);
        }
    }

    // Iterate through the views in database and script each one. Display the script.   
    foreach (View view in db.Views)
    {
        // check if the view is not a system object
        if (view.IsSystemObject == false)
        {
            urns.Add(view.Urn);
        }
    }

    // Iterate through the stored procedures in database and script each one. Display the script.   
    foreach (StoredProcedure sp in db.StoredProcedures)
    {
        // check if the procedure is not a system object
        if (sp.IsSystemObject == false)
        {
            urns.Add(sp.Urn);
        }
    }

    StringBuilder builder = new StringBuilder();
    System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
    foreach (string st in sc)
    {
        // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
        // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
        builder.AppendLine(st);
        builder.AppendLine("GO");
    }

    return builder.ToString();
OlduwanSteve
źródło
9
Możesz spojrzeć na klasę Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizardz zestawu C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll. Właśnie tego używa SSMS. (Alternatywnie możesz spojrzeć na klasę Microsoft.SqlServer.Management.UI.GenerateScriptz zestawu C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll.)
cubetwo1729
Przykładowy kod i linki tutaj były świetnym początkiem i powinny być najbardziej kompletną odpowiedzią na OP (co było również moim dokładnym pytaniem).
zanlok
1
Zhakowałem razem aplikację C #, która umożliwia generowanie skryptów serwera SQL z wiersza poleceń w systemie Linux. Wszystko czego potrzebujesz to .Net Core 2 w wersji zapoznawczej
mkurz
20

Napisałem narzędzie wiersza poleceń open source o nazwie SchemaZen, które to robi. Jest znacznie szybszy niż pisanie skryptów ze studia zarządzania, a jego wyjście jest bardziej przyjazne dla kontroli wersji. Obsługuje skrypty zarówno schematu, jak i danych.

Aby wygenerować skrypty, uruchom:

Skrypt schemazen.exe - serwer lokalny host - baza danych bazy danych - katalog skryptów c: \ katalog

Następnie, aby odtworzyć bazę danych ze skryptów, uruchom:

schemazen.exe create --server localhost - Database db --scriptDir c: \ katalog
Seth Reno
źródło
Właśnie wypróbowałem SchemaZen i jestem pod wrażeniem. Pracował pierwszy raz. Dzięki Seth!
Simon Hughes,
@ Tak więc czego używasz do tworzenia skryptów obiektów? Nie widziałem ani jednego odniesienia do żadnego Microsoft.SqlServer (cóż, była jedna nieużywana instrukcja using).
Jan
@John - Schema Zen zawiera własną bibliotekę do tworzenia skryptów. Wczytuje schemat do modelu, a następnie generuje skrypty na podstawie modelu. Prosty przykład można znaleźć na github.com/sethreno/schemazen/blob/master/model/Models/… .
Seth Reno
8

Jeśli jesteś programistą, zdecydowanie wybierz SMO. Oto link do klasy Scripter, która jest punktem wyjścia:

Klasa Scripter

Ryan Lundy
źródło
7

Nie widzę PowerShell z SQLPSX wspomnianego w żadnej z tych odpowiedzi ... Osobiście nie bawiłem się nim, ale wygląda pięknie, prosto w użyciu i idealnie nadaje się do tego typu zadań automatyzacji, takich jak:

Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter

(zob .: http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )

Strona projektu: http://sqlpsx.codeplex.com/

Główną zaletą tego podejścia jest to, że łączy w sobie konfigurowalność / możliwość dostosowania bezpośredniego korzystania z SMO z wygodą i łatwością utrzymania przy użyciu prostego istniejącego narzędzia, takiego jak Kreator publikacji bazy danych.

Tao
źródło
1
Spędziłem trochę czasu na wypróbowywaniu tego rozwiązania, ale w końcu przeszedłem do C # i używam SMO. Problem, którego nie mogłem łatwo znaleźć, polega na tym, że przykładowy kod skryptuje każdą tabelę z osobna. Gdy zaczniesz dodawać obiekty 'DRI' (Declarative Referential Integrity), takie jak klucze obce, zależności nie poprawią się i / lub będzie to bardzo powolne.
OlduwanSteve
4

W menu Narzędzia> Opcje> Projektanci> Projektanci tabel i baz danych dostępna jest opcja „Automatycznie generuj skrypty zmian”, która będzie generować jeden dla każdej zmiany wprowadzonej w momencie jej zapisywania.

John Sheehan
źródło
3
To nie jest dokładnie to, czego potrzebuję. Chciałbym zdobyć skrypty do tworzenia (moim ostatecznym celem jest automatyczne wpisywanie tych plików do mojego systemu kontroli źródła)
Brann
3

Możesz to zrobić za pomocą kodu T-SQL przy użyciu tabel INFORMATION_SCHEMA.

Istnieją również narzędzia innych firm - lubię Apex SQL Script do dokładnie tego zastosowania, o którym mówisz. Uruchamiam go całkowicie z wiersza poleceń.

Cade Roux
źródło
3

Wypróbuj nowe narzędzia wiersza poleceń programu SQL Server do generowania skryptów T-SQL i monitorowania dynamicznych widoków zarządzania.

Działało na mnie jak urok. Jest to nowe narzędzie firmy Microsoft oparte na języku Python, które działa z wiersza poleceń. Wszystko działa tak, jak opisano na stronie Microsoft (patrz link poniżej) Pracowałem dla mnie z serwerem SQL 2012.

Instalujesz go za pomocą pip:

$ pip zainstaluj mssql-scripter

Przegląd parametrów polecenia jak zwykle z h dla pomocy:

mssql-scripter -h

Wskazówka: Jeśli logujesz się do SQL-Server poprzez uwierzytelnianie Windows, po prostu zostaw nazwę użytkownika i hasło.

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management- wyświetlenia/

matthhias
źródło
2

Jeśli chcesz skorzystać z rozwiązania firmy Microsoft, możesz spróbować: Kreator publikacji bazy danych Microsoft SQL Server 1.1

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

Tworzy proces wsadowy, który można uruchomić w dowolnym momencie, gdy trzeba odbudować skrypty.

Glennular
źródło
1
Niestety, nie obsługuje SqlServer 2008
Brann
1
Wersja 1.2 mówi, że obsługuje 2000 i 2005, ale właśnie użyłem jej do skryptu bazy danych w 2008 z ponad 3800 tabelami i działało dobrze. Nie zawierał opcji kompresji, które zostały wprowadzone dopiero w 2008 roku. Właśnie przetestowałem również bazę danych z wersji 2008 R2 i dobrze ją obsługuje.
Jeremy
2

Używam DB Comparer - jest to darmowy i bezproblemowy skrypt w całej bazie danych i można go porównać z innym DB, a także stworzyć skrypt Diff. Doskonały do ​​skryptów zmian od programowania do produkcji. http://www.dbcomparer.com/

MartinC
źródło
1

Jest też to proste narzędzie wiersza poleceń, które buduję na moje potrzeby.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Może wyeksportować całą bazę danych i próbuje wyeksportować zaszyfrowane obiekty. Wszystko jest przechowywane w folderach i oddzielnych plikach sql, co ułatwia porównywanie plików.

Kod jest również dostępny na github.

George Kosmidis
źródło
0

Z programu Visual Studio 2008 SP1 TeamSuite:

Na karcie Eksplorator serwera / Połączenia danych znajduje się narzędzie publikowania dla dostawcy, które działa tak samo jak „Kreator publikowania bazy danych Microsoft SQL Server”, ale jest zgodne z MS Sql Server 2008.

Brann
źródło
W jaki sposób pomaga zautomatyzować zadanie?
Serge Wautier
0

Używam VS 2012 (dla baz danych na MSSQL Server 2008). Porównywanie bazy danych ma możliwość zapisania jej, porównania i opcji. Zasadniczo to są twoje ustawienia dostarczania. Następnie możesz zaktualizować lub wygenerować skrypt.

Po prostu uważam to za trochę niewygodne, aby załadować go z pliku później (przeciągnij i upuść z eksploratora Windows), ponieważ nie widzę pliku w eksploratorze rozwiązań.

zhrist
źródło