2013-10-08 19 views
0

如何將包括(函數,觸發器,過程等)在內的所有數據庫對象導出到另一個新創建的空數據庫。我不想通過導出或導入或在SQL環境中生成腳本。我只是想通過SSIS包裝的方式來做BIDS環境中的我需要做的是什麼?....建議我最好的方法如何通過SSIS導出整個數據庫模式包

回答

0

這裏是你的開始。這是我目前的一個項目。以下腳本用於複製,然後爲意外丟棄的任何表格恢復架構信息。此查詢將觸發器,約束,索引(包括跨多列的索引)和權限複製到可執行代碼的臨時表中。因此,它查看@fromTable的所有模式信息併爲@Totable編寫必要的SQL語句。底部有一個註釋掉的部分,用於執行存儲在臨時表中的所有查詢。

這裏缺少的唯一項目是當@fromtable發生源自另一個表的外鍵約束時。

從我們的項目的一個小方面的知識,你不能添加約束,觸發器,具有相同名稱的索引到同一個數據庫。你將不得不改變腳本。我還建議把查詢分解成更小的塊,這樣你就可以讓它們分離成SSIS腳本。

祝你好運! (我在這裏給你我最好的東西)

Declare @Fromtable Varchar(255), @ToTable Varchar(255),@indexcount int, @indexcolumnid int,@maxindexcount int 
set @Fromtable = 'tblname' 
set @ToTable = 'tblname' 

if object_id('tblTemp') is not null 
    Drop table tblTemp 

Create table tblTemp (ID int identity, queries varchar(max)) 

set @indexcount = (select min(si.index_ID) from sys.indexes si inner join sys.tables st 
     on st.object_id = si.object_id where st.name = @Fromtable 
     and si.name not like 'PK%') 
set @maxindexcount = (select max(si.index_ID) from sys.indexes si inner join sys.tables st 
     on st.object_id = si.object_id where st.name = @Fromtable 
     and si.name not like 'PK%') 

while (@indexcount <= @maxindexcount) 
BEGIN 
IF ((select count(si.index_ID) from sys.indexes si inner join sys.tables st 
     on st.object_id = si.object_id   inner join sys.columns col 
      on si.object_id = col.object_id 
     inner join sys.index_columns ic 
      on ic.object_id = si.object_id 
       and ic.index_id = si.index_id 
       and col.column_id = ic.column_id where st.name = @Fromtable 
     and si.name not like 'PK%' and si.index_id = @indexcount) = 0) 
BEGIN 
SET @indexcount += 1 

end 

else IF ((select count(si.index_ID) from sys.indexes si 
      inner join sys.tables st 
     on st.object_id = si.object_id 
        inner join sys.columns col 
      on si.object_id = col.object_id 
     inner join sys.index_columns ic 
      on ic.object_id = si.object_id 
       and ic.index_id = si.index_id 
       and col.column_id = ic.column_id  
     where st.name = @Fromtable 
      and si.name not like 'PK%' 
      and si.index_id = @indexcount 
      ) = 1) 
BEGIN 

    insert into tblTemp(queries) 
    select 'CREATE ' + si.type_desc + ' INDEX ' 
      + si.name + ' ON [Dbo].[' + @ToTable + '] ' 
      + '(' + col.name + ') '         
    from sys.indexes si 
     inner join sys.columns col 
      on si.object_id = col.object_id 
     inner join sys.index_columns ic 
      on ic.object_id = si.object_id 
       and ic.index_id = si.index_id 
       and col.column_id = ic.column_id 
     inner join sys.tables st 
      on st.object_id = si.object_id 
    where st.name = @Fromtable 
      and si.name not like 'PK%' 
      and si.index_id = @indexcount 
SET @indexcount += 1 

END 


else IF ((select count(si.index_ID) from sys.indexes si inner join sys.tables st 
     on st.object_id = si.object_id   inner join  sys.columns col 
      on si.object_id = col.object_id 
     inner join sys.index_columns ic 
      on ic.object_id = si.object_id 
       and ic.index_id = si.index_id 
       and col.column_id = ic.column_id where st.name = @Fromtable 
     and si.name not like 'PK%' and si.index_id = @indexcount) > 1) 
    Declare @innerloopcounter int, @BuiltString varchar(max) 
    set @innerloopcounter = 2 

BEGIN 
    SET @indexcolumnid = (SELECT max(ic.index_column_id) from sys.indexes si 
              inner join sys.columns col 
               on si.object_id = col.object_id 
              inner join sys.index_columns ic 
               on ic.object_id = si.object_id 
                and ic.index_id = si.index_id 
                and col.column_id = ic.column_id 
              inner join sys.tables st 
               on st.object_id = si.object_id 
             where st.name = @Fromtable 
               and si.name not like 'PK%' 
               and si.index_id = @indexcount) 
    set @BuiltString = (select 'CREATE ' + si.type_desc + ' INDEX ' 
              + si.name + ' ON [Dbo].[' + @ToTable + '] ' 
              + '(' + col.name         
            from sys.indexes si 
             inner join sys.columns col 
              on si.object_id = col.object_id 
             inner join sys.index_columns ic 
              on ic.object_id = si.object_id 
               and ic.index_id = si.index_id 
               and col.column_id = ic.column_id 
             inner join sys.tables st 
              on st.object_id = si.object_id 
            where st.name = @Fromtable 
              and si.name not like 'PK%' 
              and si.index_id = @indexcount 
              and ic.index_column_id = 1) 

    while (@innerloopcounter <= @indexcolumnid) 
    Begin 
     set @BuiltString = @BuiltString + ', ' + (select col.name        
                from sys.indexes si 
                 inner join sys.columns col 
                  on si.object_id = col.object_id 
                 inner join sys.index_columns ic 
                  on ic.object_id = si.object_id 
                   and ic.index_id = si.index_id 
                   and col.column_id = ic.column_id 
                 inner join sys.tables st 
                  on st.object_id = si.object_id 
                where st.name = @Fromtable 
                  and si.name not like 'PK%' 
                  and si.index_id = @indexcount 
                  and ic.index_column_id = @innerloopcounter) 


     set @innerloopcounter += 1 
    End 
    set @BuiltString = @BuiltString + ')' 

    insert into tblTemp(queries) 
     select @BuiltString 

    SET @indexcount += 1 
end 
end 
----------------End indexes, start triggers------------------------------- 
Declare @name int, @count int, @max int, @query Varchar(max) 

Create table tempTriggers(ID int identity , trigger_ID int) 

Insert into tempTriggers (trigger_ID) 
select tr.object_id 
FROM sys.triggers AS tr 
    INNER JOIN sys.tables AS o ON tr.parent_id = o.object_id 
where o.object_id = @name 

set @count = 1 
set @max = (Select max(ID) from tempTriggers) 
set @query = (Select definition from sys.sql_modules where object_id = (select  trigger_ID from tempTriggers where ID = @count)) 

while(@count <= @max) 
begin 
set @query = replace (@query, @FromTable, @ToTable) 
insert into tblTemp(Queries) 
values (@query) 

set @count = @count + 1 
set @query = (Select definition from sys.sql_modules where object_id = (select trigger_ID from tempTriggers where ID = @count)) 
end 

drop table tempTriggers 
-------------------------end triggers, start permissions----------------------------- 

Insert into tblTemp(Queries) 

select 'GRANT ' + dp.permission_name collate latin1_general_cs_as 
+ ' ON ' + s.name + '.' + @ToTable + ' TO ' + '[' + dpr.name + ']' 
FROM sys.database_permissions AS dp 
INNER JOIN sys.objects AS o ON dp.major_id=o.object_id 
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id 
INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id 
WHERE dpr.name NOT IN ('public','guest') 
    and o.name = @FromTable 

------------------------end permissions, start constraints---------------------------------- 


Insert into tblTemp(queries) 

select 'Alter Table [dbo].[' + @ToTable +'] ADD CONSTRAINT ' 
    + kc.name +' primary KEY (' 
    + col.name +')' 

from sys.key_constraints kc 
inner join sys.columns col 
    on kc.parent_object_id = col.object_id 
inner join sys.tables st 
    on kc.parent_object_id = st.object_id 
where 
st.name = @FromTable 
and kc.unique_index_id = col.column_id 


Insert into tblTemp(queries) 

select 'Alter Table [dbo].[' + @ToTable +'] ' 
    + 'Add CONSTRAINT [' + dc.name + ']' 
    + ' DEFAULT ' + dc.definition + ' ' 
    + 'FOR [' + col.name + ']' 
from sys.default_constraints dc 
inner join sys.columns col 
    on dc.parent_object_id = col.object_id 
inner join sys.tables st 
    on dc.parent_object_id = st.object_id 
where 
st.name = @FromTable 
and col.column_id = dc.parent_column_id 


Insert into tblTemp(queries) 

select 'Alter Table [dbo].[' + @ToTable + '] WITH NOCHECK ' 
    + 'Add CONSTRAINT [' + chk.name + ']' 
    + ' CHECK (' + chk.definition + ') ' 

from sys.check_constraints chk 
inner join sys.columns col 
    on chk.parent_object_id = col.object_id 
inner join sys.tables st 
    on chk.parent_object_id = st.object_id 
where 
st.name = @FromTable 
and col.column_id = chk.parent_column_id 

Insert into tblTemp(queries) 


select distinct 'Alter Table [dbo].[' + @ToTable + '] ' 
+ 'ADD FOREIGN KEY ('+ col.name + ') ' 
+ 'REFERENCES ' + ft.name + ' ('+ fkcol.name + ')' 

from sys.foreign_key_columns fkc 
inner join sys.tables st 
    on fkc.parent_object_id = st.object_id 
inner join sys.columns col 
    on fkc.parent_object_id = col.object_id 
inner join sys.tables ft 
    on fkc.referenced_object_id = ft.object_id 
inner join sys.columns fkcol 
    on ft.object_id = fkcol.object_id 

where 
st.name = @FromTable 
and col.column_id = fkc.parent_column_id 
and fkc.referenced_column_id = fkcol.column_id 

select * from tblTemp 

--end of script--execution phase-------------------------------------------------------------------------- 
/* 
declare @count int, @max int, @query Varchar(max) 
set @count = 186 
set @max = (Select max(ID) from tblTemp) 
set @query = (select queries from tblTemp where ID = @count) 

while(@count <= @max) 
begin 

exec(@query) 
set @count += 1 
set @query = (select queries from tblTempwhere ID = @count) 
end 

select * from tblTemp 

drop table tblTemp 
*/ 
相關問題