2013-11-14 6 views
0

방아쇠를 만드는 가장 좋은 방법을 찾으려고했지만 SQL Server 2008을 사용하여 벽돌 벽에 부딪 혔습니다. 모든 전화 번호 (번호)를 저장하는 중앙 테이블을 만들고 싶습니다. 고객 표의 모든 고객 번호 Numbers에는 숫자를 하나 이상의 고객과 연결하는 자식 테이블 numbercustomer가 있습니다. 내 테이블 :SQL 트리거 부모 자식

CREATE TABLE [Campaign].[Number](
    [NumberID] [int] IDENTITY(1,1) NOT NULL, 
    [Number] [varchar](15) NOT NULL, 
    [LastUpdated] [timestamp] NOT NULL, 
CONSTRAINT [Pk_Number] PRIMARY KEY CLUSTERED 
(
    [NumberID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [Campaign].[NumberCustomer](
    [CustomerNumberID] [int] IDENTITY(1,1) NOT NULL, 
    [NumberID] [int] NOT NULL, 
    [CustomerID] [int] NOT NULL, 
CONSTRAINT [PK_CustomerNumber] PRIMARY KEY CLUSTERED 
(
    [CustomerNumberID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [Crm].[Customer](
    [CustomerID] [int] IDENTITY(30000,1) NOT NULL, 
    [FirstName] [varchar](255) NULL, 
    [LastName] [varchar](255) NULL, 
    [MobileNumber] [varchar](11) NULL, 
    [LandlineNumber] [varchar](11) NULL, 
CONSTRAINT [PK__Customer__8CB286B91CF15040] PRIMARY KEY CLUSTERED 
(
    [CustomerID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

나는 숫자 표를 확인하고이없는 경우의 수를 삽입하는 트리거를하고 싶습니다. 방아쇠의 두 번째 부분은 고객에게 링크가 없는지 확인하고 삽입합니다. 다음과 같이 트리거를 사용하여 업데이트 할 번호 테이블을 얻을 수 있지만 성능에 대해 생각하고 있습니다.

CREATE TRIGGER [Crm].[Customer_Number_Updated] ON [Crm].[Customer] 
AFTER Update, INSERT 
NOT FOR REPLICATION AS 
SET NoCount On 

DECLARE 
    @AuditTime DATETIME, 
    @IsDirty BIT 
SET @AuditTime = GetDate() 

SET @IsDirty = 0 

    Begin Try 
    INSERT INTO 
     [Campaign].[Number]([Number]) 
    select 
     number 
    from 
    (
    Select 
     i.MobileNumber as number 
    From 
     inserted i 
    join 
     deleted d 
    on 
     i.CustomerID = d.CustomerID 
    and 
    isnull(i.MobileNumber ,'') <> isnull(d.MobileNumber,'') 
    UNION 
    Select 
     i.LandlineNumber as number 
    From 
     inserted i 
    join 
     deleted d 
    on 
     i.CustomerID = d.CustomerID 
    and 
    isnull(i.LandlineNumber ,'') <> isnull(d.LandlineNumber,'') 
    UNION 
    Select 
     i.AlternateContactNumber as number 
    From 
     inserted i 
    join 
     deleted d 
    on 
     i.CustomerID = d.CustomerID 
    and 
    isnull(i.AlternateContactNumber ,'') <> isnull(d.AlternateContactNumber,'') 
    ) as nums 
    WHERE NOT EXISTS 
     (
      SELECT 
       * 
      FROM 
       [Campaign].[Number] cn 
      WHERE 
       cn.Number = nums.number 
     ) 
End try 
Begin Catch 
IF ERROR_NUMBER() <> 2627 
    DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT; 
    SET @ErrorMessage = ERROR_MESSAGE(); 
    SET @ErrorSeverity = ERROR_SEVERITY(); 
    SET @ErrorState = ERROR_STATE(); 
    RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState) with log; 
End Catch 

GO 

어떤 도움을 주시면 감사하겠습니다.

+0

** 숫자 하나 또는 그 이상의 고객에게 번호를 연결하는 자식 테이블 numbercustomer이 있습니다를 확인하기 위해 삽입으로 내부 조인 않습니다. ** 그게 이상한 것 같다. 번호가 여러 고객에게 공유됩니까? 그 반대편에 있지 않은 것이 확실합니까, e.i. 고객은 여러 개의 번호를 가질 수 있습니까? – wvdz

+0

고객은 하나 이상의 숫자를 가질 수 있으며 아마도 우리가보고를 위해이 코드를 사용하려고한다고 말했을 것입니다.이 경우 많은 코드가 실제로 많이 사용됩니다. –

+0

코드가 제대로 작동하는지 정확히 이해합니까? 최적화? 아마도이 경우 귀하의 질문에 더 명확하게해야합니다. – wvdz

답변

0

트리거는 UPDATE에 대한 아니라 INSERT 작동 : 당신이 삭제 합류 삽입하고 새 레코드를 삽입 할 때 삭제에 아무것도 없다. 트리거에서 INSERT 및 UPDATE를 수행하거나 MERGE를 수행해야합니다. 여기

없이 동등 삽입과 코드와 갱신 (try 블록의 코드 만)

삽입이 왼쪽을 삭제하여 가입 및 안티 반 가입 (아이디가 null인지 확인한다 texists).

업데이트

는 업데이트 기록 만

Begin Try 

    -- insert new records 
    INSERT INTO 
     [Campaign].[Number]([Number]) 
    select 
     i.MobileNumber 
    from inserted i 
    left join deleted d on i.customerid = d.customerid 
    where d.customerid is null -- new records (no deleted record) 
    and not exists(select Number from [Campaign].[Number] c where c.number = i.MobileNumber) 
    -- union the same for LAndLineNumber 
    -- union the same for AlternateNumber 

    -- update existing number 
    update [Campaign].[Number] 
     set Number = i.MobileNumber 
     -- set LandLineNumber too 
     -- and AlternateNumber 
    from [Campaign].[Number] n 
     left join deleted d on d.MobileNumber = n.Number 
     inner join inserted i on i.CustomerId = d.CustomerId 

End try 
관련 문제