방아쇠를 만드는 가장 좋은 방법을 찾으려고했지만 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
어떤 도움을 주시면 감사하겠습니다.
롭
** 숫자 하나 또는 그 이상의 고객에게 번호를 연결하는 자식 테이블 numbercustomer이 있습니다를 확인하기 위해 삽입으로 내부 조인 않습니다. ** 그게 이상한 것 같다. 번호가 여러 고객에게 공유됩니까? 그 반대편에 있지 않은 것이 확실합니까, e.i. 고객은 여러 개의 번호를 가질 수 있습니까? – wvdz
고객은 하나 이상의 숫자를 가질 수 있으며 아마도 우리가보고를 위해이 코드를 사용하려고한다고 말했을 것입니다.이 경우 많은 코드가 실제로 많이 사용됩니다. –
코드가 제대로 작동하는지 정확히 이해합니까? 최적화? 아마도이 경우 귀하의 질문에 더 명확하게해야합니다. – wvdz