0

データベース間でデータを自動的に転送したい。たとえば、1 時間ごとに、最初のデータベースの 1 つのテーブルのデータが 2 番目のデータベースのテーブルにコピーされます。

私に何をすすめますか?多分仕事を使って?

前もって感謝します。

4

5 に答える 5

0

これが「貧乏人の方法」です。

このロジックにより、宛先テーブルを毎回切り捨てる必要がなくなります。

1 時間ごとにストアド プロシージャを呼び出すジョブをスケジュールできます。

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
于 2013-08-01T13:23:06.717 に答える
0

これが 1 つのテーブルからのデータのみであり、両方のデータベースが同じサーバー上にある場合は、すべての新しいデータを自動的にキャッチしてセカンダリ データベースにコピーする INSERT トリガーをそのテーブルに作成することも検討できます。

ただし、データベースが同じサーバー上になく、サーバーが物理的に同じ場所にない場合は、パフォーマンスの問題が発生する可能性があるため、これは行いません。

于 2013-08-02T09:08:58.923 に答える
0

You can probably look at SQL Server Database Mirroring if you are already on SQL Server 2008. Avoids the need for an additional ETL tool.

于 2013-08-01T11:52:51.180 に答える