2010-05-01 3 views

risposta

7

Lo strumento grafico è solo un wrapper attorno alle classi SMO che implementano effettivamente lo scripting, come la classe Scripter. V'è un esempio di script tutte le tabelle di un database con SMO in MSDN: Scripting:

//Connect to the local, default instance of SQL Server. 
{ 
    Server srv = default(Server); 
    srv = new Server(); 
    //Reference the AdventureWorks database. 
    Database db = default(Database); 
    db = srv.Databases("AdventureWorks"); 
    //Define a Scripter object and set the required scripting options. 
    Scripter scrp = default(Scripter); 
    scrp = new Scripter(srv); 
    scrp.Options.ScriptDrops = false; 
    scrp.Options.WithDependencies = true; 
    //Iterate through the tables in database and script each one. Display the script. 
    //Note that the StringCollection type needs the System.Collections.Specialized namespace to be included. 
    Table tb = default(Table); 
    Urn[] smoObjects = new Urn[2]; 
    foreach (tb in db.Tables) { 
     smoObjects = new Urn[1]; 
     smoObjects(0) = tb.Urn; 
     if (tb.IsSystemObject == false) { 
     StringCollection sc = default(StringCollection); 
     sc = scrp.Script(smoObjects); 
     string st = null; 
     foreach (st in sc) { 
      Console.WriteLine(st); 
     } 
     } 
    } 
} 

Ci sono molti altri esempi come usarlo su vari altri siti.

2

È possibile utilizzare PowerShell per eseguire questa operazione. Un esempio qui per le tabelle di scripting. http://www.simple-talk.com/sql/sql-tools/using-powershell-to-generate-table-creation-scripts/ Suppongo che dovrebbe essere possibile estendere per altri tipi di oggetti di database.

Modifica Solo notato che il titolo dice dati e schema. Non sono a conoscenza di nulla di gratuito che funzioni dalla riga di comando. Redgate SQL Compare Suite è automatizzabile dalla riga di comando se si acquista la versione corretta o si può scrivere un'applicazione/power shell per farlo.

+1

può scaricare dati –

2

Per i dati, è possibile utilizzare un'utilità di esportazione di massa denominata bcp che consente di scaricare i dati dalle tabelle di SQL Server in file, ad es. un file CSV o un file delimitato da tabulazioni.

Non conosco alcuna utilità fornita da SQL Server che crei script SQL con istruzioni INSERT come fa lo stesso SQL Server Management Studio.

1

È possibile programmare lo schema e dati utilizzando la procedura guidata di pubblicazione di SQL Server. Questo può essere fatto dalla riga di comando. La versione 1.4 è quella che si desidera sia associata a Visual Studio dalla versione 2008 e anche a SQL Server 2008. È possibile trovarla in Programmi/Microsoft SQL server/90/Strumenti/Pubblicazione/1.4/SqlPubWiz. Credo che sia anche un progetto su CodePlex.

Tipo SQlPubWiz /? per visualizzare le opzioni della riga di comando

1

Ho scritto un programma di utilità della riga di comando open source denominato SchemaZen che esegue questa operazione. È molto più veloce dello scripting da parte di Management Studio e il suo output è più adatto al controllo della versione. Supporta lo scripting di schemi e dati.

Per generare script eseguiti:

schemazen.exe script --server localhost --database db --scriptDir c:\somedir

Poi, per ricreare il database da script eseguiti:

schemazen.exe create --server localhost --database db --scriptDir c:\somedir
0

C'è pronto per l'uso gratuito strumento schema riga export di comando open source a http://exportsqlscript.codeplex.com/.

Utilità a riga di comando per esportare oggetti MS SQL in file di script adatti alla creazione di database e al controllo di revisione. Utilizza 2008R2 Server Management Objects (SMO) compatibili con SQL Server 2000, SQL Server 2005, SQL Server 2008 e SQL Server 2008 R2.

dovuto installare Windows Installer 4.5, .NET Framework 3.5 e gestione Oggetti condivisi con i tipi di sistema CLR da SQL Server 2008 R2 Feature Pack per farlo funzionare.

comando Lavorare esempio di esportazione per SQL Server 2005:

ExportSQLScript.exe . dldb /ot:Tree /xt:UserDefinedTableTypes 
+0

C'è anche un altro esempio di TSQL che usa SMO a http://www.nigelrivett.net/DMOScriptAllDatabases.html. – Vadzim

0

è possibile scaricare lo script PowerShell

https://gallery.technet.microsoft.com/SCRIPTING-DB-DB-OBJECTS-DB-81bba072

lo script PowerShell script di fuori db, oggetti db, le autorizzazioni di db, accessi sql, permessi sql, processi sql, server sql collegato, posta sql, trigger sql server

$path = "E:\pruthvi\pruthvi\" 

$servername="SRVBLRDBATST98\MSSQLSERVER1" 
[email protected]" 
set nocount off 

IF OBJECT_ID(N'tempdb..##temp1') IS NOT NULL 
    DROP TABLE ##temp1 

create table ##temp1(query varchar(1000)) 

insert into ##temp1 
select 'use '+db_name() +';' 

insert into ##temp1 
select 'go' 

/*creating database roles*/ 
insert into ##temp1 
        select 'if DATABASE_PRINCIPAL_ID('''+name+''') is null exec sp_addrole '''+name+''';' from sysusers 
where issqlrole = 1 and (sid is not null and sid <> 0x0) 

/*creating application roles*/ 
insert into ##temp1 
        select 'if DATABASE_PRINCIPAL_ID('+char(39)+name+char(39)+') 
        is null CREATE APPLICATION ROLE ['+name+'] WITH DEFAULT_SCHEMA = ['+ 
        default_schema_name+'], Password='+char(39)+'Pass$w0rd123'+char(39)+' ;' 
from sys.database_principals 
where type_desc='APPLICATION_ROLE' 

insert into ##temp1 
        select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
                 then 
                   substring (state_desc,0,6)+' '+permission_name+' to '+'['+USER_NAME(grantee_principal_id)+']'+' WITH 
GRANT OPTION ;' 

                 else 
                    state_desc+' '+permission_name+' to '+'['+USER_NAME(grantee_principal_id)+']'+' ;' 
        END 
from sys.database_permissions 
where class=0 and USER_NAME(grantee_principal_id) not in ('dbo','guest','sys','information_schema') 

insert into ##temp1 
        select 
           case 
             when state_desc='GRANT_WITH_GRANT_OPTION' 
                then 
                  substring (state_desc,0,6)+' '+permission_name+' on '+OBJECT_SCHEMA_NAME(major_id)+'.'+OBJECT_NAME 
(major_id) 
                  +' to '+'['+USER_NAME(grantee_principal_id)+']'+' with grant option ;' 
                else 
                   state_desc+' '+permission_name+' on '+OBJECT_SCHEMA_NAME(major_id)+'.'+OBJECT_NAME(major_id) 
                   +' to '+'['+USER_NAME(grantee_principal_id)+']'+' ;' 
            end 
from sys.database_permissions where class=1 and USER_NAME(grantee_principal_id) not in ('public'); 

insert into ##temp1 
         select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
                then 
                   substring (state_desc,0,6)+' '+permission_name+' ON schema::['+sa.name+ 
                   '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
                 else 
                   state_desc+' '+permission_name+' ON schema::['+sa.name+ 
                   '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
             end 
from sys.database_permissions dp inner join sys.schemas sa on 
sa.schema_id = dp.major_id where dp.class=3 

insert into ##temp1 
        select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON APPLICATION ROLE::['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                 state_desc+' '+permission_name+' ON APPLICATION ROLE::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
         end 
from sys.database_permissions dp inner join sys.database_principals sa on 
sa.principal_id = dp.major_id where dp.class=4 and sa.type='A' 

insert into ##temp1 
         select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON ROLE::['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                state_desc+' '+permission_name+' ON ROLE::['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                COLLATE LATIN1_General_CI_AS 
              end 
from sys.database_permissions dp inner join 
sys.database_principals sa on sa.principal_id = dp.major_id 
where dp.class=4 and sa.type='R' 

insert into ##temp1 
         select 
            case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
                 then 
                   substring (state_desc,0,6)+' '+permission_name+' ON ASSEMBLY::['+sa.name+ 
                   '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
                 else 
                   state_desc+' '+permission_name+' ON ASSEMBLY::['+sa.name+ 
                   '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                   COLLATE LATIN1_General_CI_AS 
             end 
from sys.database_permissions dp inner join sys.assemblies sa on 
sa.assembly_id = dp.major_id 
where dp.class=5 

insert into ##temp1 
        select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON type::[' 
                +SCHEMA_NAME(schema_id)+'].['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                state_desc+' '+permission_name+' ON type::[' 
                +SCHEMA_NAME(schema_id)+'].['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                COLLATE LATIN1_General_CI_AS 
               end 
from sys.database_permissions dp inner join sys.types sa on 
sa.user_type_id = dp.major_id 
where dp.class=6 


insert into ##temp1 
         select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON XML SCHEMA COLLECTION::['+ 
                SCHEMA_NAME(SCHEMA_ID)+'].['+sa.name+'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                state_desc+' '+permission_name+' ON XML SCHEMA COLLECTION::['+ 
                SCHEMA_NAME(SCHEMA_ID)+'].['+sa.name+'] to ['+user_name(dp.grantee_principal_id)+'];' 
                COLLATE LATIN1_General_CI_AS 
            end 
from sys.database_permissions dp inner join sys.xml_schema_collections sa on 
sa.xml_collection_id = dp.major_id 
where dp.class=10 



insert into ##temp1 
        select 
           case 
             when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON message type::['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                state_desc+' '+permission_name+' ON message type::['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                COLLATE LATIN1_General_CI_AS 
              end 
from sys.database_permissions dp inner join sys.service_message_types sa on 
sa.message_type_id = dp.major_id 
where dp.class=15 


insert into ##temp1 
         select 
            case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
               then 
                 substring (state_desc,0,6)+' '+permission_name+' ON contract::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
               else 
                 state_desc+' '+permission_name+' ON contract::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
            end 
from sys.database_permissions dp inner join sys.service_contracts sa on 
sa.service_contract_id = dp.major_id 
where dp.class=16 



    insert into ##temp1 
         select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                 substring (state_desc,0,6)+' '+permission_name+' ON SERVICE::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
               else 
                 state_desc+' '+permission_name+' ON SERVICE::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
            end 
from sys.database_permissions dp inner join sys.services sa on 
sa.service_id = dp.major_id 
where dp.class=17 


insert into ##temp1 
         select 
            case 
               when state_desc='GRANT_WITH_GRANT_OPTION' 
               then 
                  substring (state_desc,0,6)+' '+permission_name+' ON REMOTE SERVICE BINDING::['+sa.name+ 
                  '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
               else 
                  state_desc+' '+permission_name+' ON REMOTE SERVICE BINDING::['+sa.name+ 
                  '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                  COLLATE LATIN1_General_CI_AS 
             end 
from sys.database_permissions dp inner join sys.remote_service_bindings sa on 
sa.remote_service_binding_id = dp.major_id 
where dp.class=18 

insert into ##temp1 
         select 
            case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
               then 
                 substring (state_desc,0,6)+' '+permission_name+' ON route::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
               else 
                  state_desc+' '+permission_name+' ON route::['+sa.name+ 
                  '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
             end 
from sys.database_permissions dp inner join sys.routes sa on 
sa.route_id = dp.major_id 
where dp.class=19 

insert into ##temp1 
         select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON FULLTEXT CATALOG::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                 state_desc+' '+permission_name+' ON FULLTEXT CATALOG::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
             end 
from sys.database_permissions dp inner join sys.fulltext_catalogs sa on 
sa.fulltext_catalog_id = dp.major_id 
where dp.class=23 

    insert into ##temp1 
         select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                 substring (state_desc,0,6)+' '+permission_name+' ON SYMMETRIC KEY::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                 state_desc+' '+permission_name+' ON SYMMETRIC KEY::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
              end 
from sys.database_permissions dp inner join sys.symmetric_keys sa on 
sa.symmetric_key_id = dp.major_id 
where dp.class=24 

insert into ##temp1 
         select 
            case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                 substring (state_desc,0,6)+' '+permission_name+' ON certificate::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
               else 
                  state_desc+' '+permission_name+' ON certificate::['+sa.name+ 
                  '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                  COLLATE LATIN1_General_CI_AS 
            end 
from sys.database_permissions dp inner join sys.certificates sa on 
sa.certificate_id = dp.major_id 
where dp.class=25 


insert into ##temp1 
        select 
           case 
              when state_desc='GRANT_WITH_GRANT_OPTION' 
              then 
                substring (state_desc,0,6)+' '+permission_name+' ON ASYMMETRIC KEY::['+sa.name+ 
                '] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;' 
              else 
                 state_desc+' '+permission_name+' ON ASYMMETRIC KEY::['+sa.name+ 
                 '] to ['+user_name(dp.grantee_principal_id)+'] ;' 
                 COLLATE LATIN1_General_CI_AS 
         end 
from sys.database_permissions dp inner join sys.asymmetric_keys sa on 
sa.asymmetric_key_id = dp.major_id 
where dp.class=26 

insert into ##temp1 
        select 'exec sp_addrolemember ''' +p.NAME+''','+'['+m.NAME+']'+' ;' 
FROM sys.database_role_members rm 
JOIN sys.database_principals p 
ON rm.role_principal_id = p.principal_id 
JOIN sys.database_principals m 
ON rm.member_principal_id = m.principal_id 
where m.name not like 'dbo'; 




select * from ##temp1 
"@ 


[email protected]" 
IF ((SELECT convert(int,substring(@@VERSION,21,5)))<2008) 

     begin 
      set nocount on 
      declare @table table (query varchar(max)) 
        insert into @table 
           select 'CREATE LOGIN '+QUOTENAME(name)+' FROM WINDOWS WITH          DEFAULT_DATABASE='+QUOTENAME(default_database_name)+' ;' 
           from sys.server_principals where type in('U','G') 

        insert into @table 
        select 'CREATE LOGIN ' + QUOTENAME(name)+ 
        ' WITH PASSWORD =' +CONVERT(varchar(max), LOGINPROPERTY(name, 'PasswordHash'),1)+' HASHED ,SID='+'0x' + CAST('' as XML).value('xs:hexBinary(sql:column("sid"))', 'varchar(MAX)')+', default_database=['+default_database_name+'],'+ 
        case when is_policy_checked=0 then 'CHECK_POLICY = OFF' when is_policy_checked=1 then 'CHECK_POLICY = ON ' end+ 
        case when is_expiration_checked=0 then ' , CHECK_EXPIRATION = OFF ' when is_policy_checked=1 then ', CHECK_EXPIRATION = ON' end+ 
        '; '+case when is_disabled=1 then 'ALTER LOGIN ['+name+ '] DISABLE;' when is_disabled=0 then ' ' end 
        from sys.sql_logins where name not like '%##%' and name not like '%sa%' 

       select * from @table 

    end 


    else 

     begin 
      set nocount on 
      declare @table1 table (query varchar(max)) 
        insert into @table1 
           select 'CREATE LOGIN '+QUOTENAME(name)+' FROM WINDOWS WITH DEFAULT_DATABASE='+QUOTENAME(default_database_name)+' ;' 
           from sys.server_principals where type in('U','G') 

        insert into @table1 
           select 'CREATE LOGIN ' + QUOTENAME(name)+ 
           ' WITH PASSWORD =' +CONVERT(varchar(max), LOGINPROPERTY(name, 'PasswordHash'),1)+' HASHED ,SID='+CONVERT(varchar(max), sid, 1)+', default_database=['+default_database_name+'],'+ 
           case when is_policy_checked=0 then 'CHECK_POLICY = OFF' when is_policy_checked=1 then 'CHECK_POLICY = ON ' end+ 
           case when is_expiration_checked=0 then ' , CHECK_EXPIRATION = OFF ' when is_policy_checked=1 then ', CHECK_EXPIRATION = ON' end+ 
           '; '+case when is_disabled=1 then 'ALTER LOGIN ['+name+ '] DISABLE;' when is_disabled=0 then ' ' end 
           from sys.sql_logins where name not like '%##%' and name not like '%sa%' 
       select * from @table1 
     end 
"@ 

[email protected]" 
set nocount on 

       IF OBJECT_ID(N'tempdb..##servrole') IS NOT NULL 
        DROP TABLE ##servrole 
      CREATE TABLE ##servrole (query varchar(1000)) 

         insert into ##servrole 
         select 'use master;' 
         insert into ##servrole 
         select ' exec sp_addsrvrolemember '''+m.name+''','+p.name+';' FROM sys.server_role_members rm 
           JOIN sys.server_principals p 
           ON rm.role_principal_id = p.principal_id 
           JOIN sys.server_principals m 
           ON rm.member_principal_id = m.principal_id 
           where m.name not in ('sa','dbo','entity owner','information_schema','sys','public'); 
         insert into ##servrole 
           select 
             case when sp.state_desc='GRANT_WITH_GRANT_OPTION' then 
             substring (state_desc,0,6)+' '+permission_name+' to ['+srp.name+'] with grant option ;' 
           else 
             state_desc+' '+permission_name+' to ['+srp.name+'] ;' 
            end 
            from sys.server_permissions sp 
            join sys.server_principals srp on sp.grantee_principal_id=srp.principal_id 
            where srp.name not like '%##%' and 
            srp.name not in ('sa','dbo','entity owner','information_schema','sys') 

            and sp.type not in ('COSQ','CO'); 
     select query as ' ' from ##servrole where query is not null; 
     go 
     drop table ##servrole 
      go 

"@ 



[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') 

$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') $servername 






$dbs=$s.Databases 

foreach ($db in $dbs) 

{ 

     $dbname = "$db".replace("[","").replace("]","") 

     $dbpath = "$path" 



     $db.script()| out-file $path$dbname.txt 

     foreach ($tables in $db.tables) 
     { 
      $tables.script() |out-file $path$dbname.txt -append 

       foreach ($index in $tables.Indexes) 
        { 
         $index.script() |out-file $path$dbname.txt -append 

        } 

     } 



     bcp "use $db ;select definition from sys.sql_modules " queryout $path$dbname"1".txt -c -t -T -S $servername 




     gc $path$dbname.txt,$path$dbname"1".txt | out-file $path$dbname"2".txt 



     $myTable=Invoke-Sqlcmd -Query $query -ServerInstance $servername -database $dbname 
     $myTable|Format-Table -AutoSize|Out-String -Width 8192 |out-file $path$dbname"2".txt -append 


     rm $path$dbname.txt,$path$dbname"1".txt 


} 


$srv=new-object "Microsoft.SqlServer.management.smo.server" $servername 
$srv.JobServer.Jobs|%{$_.script()}|out-file $path"agentjobs".txt 
$srv.LinkedServers|%{$_.script()}|out-file $path"linkedservers".txt 
$srv.backupdevices|%{$_.script()}|out-file $path"backupdevices".txt 
$srv.mail|%{$_.script()}|out-file $path"mail".txt 
$srv.triggers|%{$_.script()}|out-file $path"servertriggers".txt 

$myTable=Invoke-Sqlcmd -Query $loginscript -ServerInstance $servername -database master 
$myTable|Format-Table -AutoSize|Out-String -Width 8192 |out-file $path"serverlogins".txt -append 


$servperm=Invoke-Sqlcmd -Query $serverperm -ServerInstance $servername -database master 
$servperm|Format-Table -AutoSize|Out-String -Width 8192 |out-file $path"serverpermission".txt -append 
1

Microsoft ha rilasciato un nuovo strumento la scorsa settimana chiamato mssql-scripter. È la versione a riga di comando della procedura guidata "Genera script" in SSMS. Lo strumento è uno strumento da riga di comando open source basato su Python e puoi trovare l'annuncio ufficiale here. In sostanza, lo scripter consente di generare script T-SQL (DDL e DML) per il proprio oggetto database/database come file .sql. Ecco un esempio di utilizzo rapido per iniziare:

$ pip install mssql-scripter 
# script the database schema and data piped to a file. 
$ mssql-scripter -S localhost -d AdventureWorks -U sa --schema-and-data > ./adventureworks.sql 

Più esempi di utilizzo sono sulla nostra pagina GitHub qui: https://github.com/Microsoft/sql-xplat-cli/blob/dev/doc/usage_guide.md