2013-08-01 113 views
0

我想在數據庫之間自動傳輸數據。例如,在每一個小時內,第一個數據庫中的一個表中的數據將被複制到第二個數據庫中的一個表中。自動在數據庫之間傳輸數據

你推薦我做什麼? 通過使用工作也許?

在此先感謝。

+2

對我來說複製是更可取的。 – GriGrim

+1

ETL和作業調度程序將執行此操作。 – duffymo

回答

0

創建一個存儲過程並安排一個時間: -

Create procedure copydata 
AS 
INSERT INTO DB1.dbo.TempTable 
SELECT * FROM DB2.dbo.TempTable 
0

你有沒有考慮過使用Integration Services
您可以設置一個軟件包,執行您想要的操作,然後使用調度程序將其添加到作業中。

0

這裏是「窮人的方法」。

這個邏輯將消除每次都要截斷目標表的需要。

您可以安排一項作業每小時調用一次存儲過程。

OrganizationDB,這是我的db名稱。你的可能會有所不同。

如果源數據是不同的數據庫,使用該數據庫的名字....

USE [OrganizationDB] 
GO 

DROP TABLE [dbo].[EmployeeSource] 
GO 

DROP TABLE [dbo].[EmployeeDestination] 
GO 

CREATE TABLE [dbo].[EmployeeSource](
    [EmployeeUUID] [uniqueidentifier] NOT NULL, 
    [SSN] [char](9) NOT NULL, 
    [LastName] [varchar](40) NOT NULL, 
    [FirstName] [varchar](40) NOT NULL, 
    [HireDate] [smalldatetime] NOT NULL, 
CONSTRAINT [PK_EmployeeSource] PRIMARY KEY NONCLUSTERED 
(
    [EmployeeUUID] ASC 
), 
CONSTRAINT [CK_EmployeeSource_SSN_Unique] UNIQUE NONCLUSTERED 
(
    [SSN] ASC 
) 
) 
GO 

ALTER TABLE [dbo].[EmployeeSource] ADD DEFAULT (newsequentialid()) FOR [EmployeeUUID] 
GO 

ALTER TABLE [dbo].[EmployeeSource] ADD DEFAULT (getdate()) FOR [HireDate] 
GO 


CREATE TABLE [dbo].[EmployeeDestination](
    [EmployeeUUID] [uniqueidentifier] NOT NULL, 
    [SSN] [char](9) NOT NULL, 
    [LastName] [varchar](40) NOT NULL, 
    [FirstName] [varchar](40) NOT NULL, 
    [HireDate] [smalldatetime] NOT NULL, 
CONSTRAINT [PK_EmployeeDestination] PRIMARY KEY NONCLUSTERED 
(
    [EmployeeUUID] ASC 
), 
CONSTRAINT [CK_EmployeeDestination_SSN_Unique] UNIQUE NONCLUSTERED 
(
    [SSN] ASC 
) 
) 
GO 

ALTER TABLE [dbo].[EmployeeDestination] ADD DEFAULT (newsequentialid()) FOR [EmployeeUUID] 
GO 

ALTER TABLE [dbo].[EmployeeDestination] ADD DEFAULT (getdate()) FOR [HireDate] 
GO 




IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspPoorMansDataCopy]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[uspPoorMansDataCopy] 
Go 

/* 

exec [dbo].[uspPoorMansDataCopy] 

*/ 

CREATE PROCEDURE [dbo].[uspPoorMansDataCopy] 

AS 



SET NOCOUNT ON 


/* USE SURROGATE KEY */ 
INSERT INTO dbo.EmployeeDestination 
(
    [EmployeeUUID] 
    , [SSN] 
    , [LastName] 
    , [FirstName] 
    , [HireDate] 
) 
Select 
    [EmployeeUUID] 
    , [SSN] 
    , [LastName] 
    , [FirstName] 
    , [HireDate] 
From 
    OrganizationDB.dbo.EmployeeSource es 
where 
    not exists (select null from dbo.EmployeeDestination innerDestination where innerDestination.EmployeeUUID = es.EmployeeUUID) 


/* OR USE UNIQUE CONSTRAINT */ 
INSERT INTO dbo.EmployeeDestination 
(
    [EmployeeUUID] 
    , [SSN] 
    , [LastName] 
    , [FirstName] 
    , [HireDate] 
) 
Select 
    [EmployeeUUID] 
    , [SSN] 
    , [LastName] 
    , [FirstName] 
    , [HireDate] 
From 
    OrganizationDB.dbo.EmployeeSource es 
where 
    not exists (select null from dbo.EmployeeDestination innerDestination where UPPER(innerDestination.SSN) = upper(es.SSN)) 




SET NOCOUNT OFF 


GO 


GRANT EXECUTE ON [dbo].[uspPoorMansDataCopy] TO public 
GO 
0

如果這是從一個表只有數據,如果這兩個數據庫在同一臺服務器上,你也可以考慮在該表上創建INSERT觸發器,該觸發器將自動捕獲所有新數據並將其複製到輔助數據庫中。

雖然數據庫不在同一臺服務器上,並且服務器不在同一個物理位置,但可能會導致性能問題,我不會這樣做。