2010-05-01 135 views

回答

7

的圖形工具僅僅是圍繞着實際執行腳本,如Scripter類SMO類的包裝。有腳本在MSDN與SMO數據庫中所有表的一個例子: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); 
     } 
     } 
    } 
} 

還有更多的例子來說明如何使用各種其他網站。

2

你可以使用powershell來做到這一點。這裏是一個腳本表的例子。 http://www.simple-talk.com/sql/sql-tools/using-powershell-to-generate-table-creation-scripts/我猜測應該可以擴展爲其他類型的數據庫對象。

編輯只注意到標題說數據以及架構。我不知道有什麼免費的,從命令行執行此操作。如果您購買了正確的版本,或者您可以編寫應用程序/電源外殼腳本來執行此操作,那麼Redgate SQL Compare Suite可以從命令行自動生成。

+1

圖形實用程序可以轉儲數據 – 2010-05-01 17:53:23

2

對於數據,你可以使用一個叫做bcp一個批量出口工具,它允許您從SQL Server表中的數據轉儲到文件中,例如CSV文件或製表符分隔的文件。

我不知道任何SQL Server提供的實用程序會像SQL Server Management Studio一樣使用INSERT語句創建SQL腳本。

1

您可以編寫腳本架構和使用SQL Server發佈嚮導數據。這可以通過命令行完成。版本1.4是您希望它與Visual Studio 2008版本以及SQL Server 2008捆綁在一起的版本。您可以在Program Files/Microsoft SQL server/90/Tools/Publishing/1.4/SqlPubWiz中找到它,我相信它也是一個項目在CodePlex上。

類型SQlPubWiz /?看到命令行選項

1

我寫了一個名爲SchemaZen一個開源的命令行工具,做到這一點。它比來自management studio的腳本要快得多,它的輸出對版本控制更友好。它支持模式和數據的腳本。

若要生成腳本運行:

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

然後重新創建數據庫從腳本運行:

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

有準備在http://exportsqlscript.codeplex.com/使用免費的開源命令行模式導出工具。

命令行驅動實用程序將MS SQL對象導出到適合數據庫創建和修訂控制的腳本文件。 使用與SQL Server 2000,SQL Server 2005,SQL Server 2008和SQL Server 2008 R2兼容的2008R2服務器管理對象(SMO)。

必須安裝Windows Installer 4.5.NET Framework 3.5和共享管理與系統CLR類型對象從SQL Server 2008 R2 Feature Pack,使其工作。對於SQL Server 2005

工作export命令例如:

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

另一個在http://www.nigelrivett.net/DMOScriptAllDatabases.html使用SMO的TSQL示例。 – Vadzim 2014-01-31 19:09:05

0

,你可以下載PowerShell腳本

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

PowerShell腳本將腳本出來分貝,分貝對象,數據庫權限, sql登錄,sql權限,sql作業,sql鏈接服務器,sql郵件, 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

上週微軟發佈了一款名爲mssql-scripter的新工具。它是SSMS中'生成腳本'嚮導的命令行版本。該工具是一個基於Python的開源命令行工具,你可以找到官方公告here。從本質上講,腳本允許您爲數據庫/數據庫對象生成T-SQL腳本(DDL和DML)作爲.sql文件。下面是一個簡單的使用例子,讓你開始:

$ 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 

更多使用的例子是我們的GitHub頁面上的位置: https://github.com/Microsoft/sql-xplat-cli/blob/dev/doc/usage_guide.md

相關問題