数据库之间的数据传输自动

时间:2013-08-01 11:49:28

标签: sql sql-server database sql-server-2008 tsql

我想自动在数据库之间传输数据。例如,在每隔一小时内,第一个数据库中一个表中的数据将被复制到第二个数据库中的表中。

你建议我做什么? 通过使用工作吗?

提前致谢。

5 个答案:

答案 0 :(得分:0)

如果您已经使用SQL Server 2008,则可以查看SQL Server Database Mirroring。无需额外的ETL工具。

答案 1 :(得分:0)

创建商店程序并安排一个小时: -

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

答案 2 :(得分:0)

您是否考虑过使用Integration Services? 您可以设置一个包,执行您想要的操作,然后使用调度程序将其添加到作业中。

答案 3 :(得分:0)

这是“穷人的方法”。

这个逻辑可以消除每次都截断目标表的需要。

您可以安排作业每小时调用一次存储过程。

OrganizationDB,这是我的数据库名称。你的可能会有所不同。

如果源数据位于其他数据库中,请使用该数据库的名称....

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

答案 4 :(得分:0)

如果这只是来自一个表的数据,并且两个数据库都在同一个服务器上,您还可以考虑在该表上创建INSERT触发器,该触发器将自动捕获所有新数据并将其复制到辅助数据库中。

如果数据库不在同一台服务器上且服务器不在同一物理位置,因为它可能会导致性能问题,我不会这样做。