2017-10-17 10 views
0

多分基本的な質問があります。どうか、何らかの保護を作成する方法をアドバイスできますか?2回実行すると複数の行が作成されるSQL保護

ご覧のとおり、

これを2回実行すると、2行の作成を防止する必要があります。 重複を避ける必要があります。私はこれを宿題として手に入れましたが、これを解決する力はありません。私はこれがいくつかの難しい作業ではないと思うが、私はそれをGoogleにしても解決策を見つけることができなかった。

ご協力いただきありがとうございます。

ここにコードがあります。

DECLARE @TEST BIT 
DECLARE @Environment VARCHAR(4) 
DECLARE @TargetDB VARCHAR(4) 
DECLARE @lMailboxID INT 
DECLARE @lMailboxAddress VARCHAR(128) 
DECLARE @lMailServer INT 
DECLARE @lStorageFolder INT 
DECLARE @lPollingTime INT 
DECLARE @lActiveFlag INT 
DECLARE @lCustomer VARCHAR(3) 
DECLARE @lDomain VARCHAR(32) 
DECLARE @lUsername VARCHAR(64) 
DECLARE @lPassword VARCHAR(64) 
DECLARE @lOperatingMode VARCHAR(15) 
DECLARE @lARECode VARCHAR(4) 
DECLARE @lOrgID VARCHAR(8) 
DECLARE @lProcessFlag VARCHAR(1) 
DECLARE @lSetReadFlag VARCHAR(1) 
DECLARE @lSenderCheck INT 
DECLARE @lDomainCheck VARCHAR(128) 
DECLARE @lPDFCheck INT 
DECLARE @lARECheck INT 
DECLARE @lDocPriority INT 
DECLARE @lOrgIDCheck INT 
DECLARE @lSingleInvoice INT 
DECLARE @lMailSourceFolder VARCHAR(32) 
DECLARE @lMailMoveToFolder VARCHAR(32) 
DECLARE @lFileExt VARCHAR(64) 
DECLARE @lPrimaryDocType VARCHAR(6) 
DECLARE @lSenderAddress VARCHAR(128) 
DECLARE @lCockpitDocType VARCHAR(2) 
DECLARE @lConfirmTemplate INT 
DECLARE @lConfirmAddressCC VARCHAR(128) 
DECLARE @lVerifRejectTemplate INT 
DECLARE @lVerifRejectAddressCC VARCHAR(128) 
DECLARE @lTechRejectTemplate INT 
DECLARE @lTechRejectAddressCC VARCHAR(128) 
DECLARE @lReducedValidation VARCHAR(1) 
DECLARE @lLanguageForReply VARCHAR(2) 
DECLARE @lRedirectNoReply VARCHAR(128) 
DECLARE @lMailReplyTo VARCHAR(128) 
DECLARE @lServiceName VARCHAR(100) 
DECLARE @lAttachmentRule INT 
DECLARE @DocRejectTemplate varchar(128) 
DECLARE @DocRejectAddressCC varchar(128) 
DEClARE @ConvertToPDFA bit 
DECLARE @AdditionalCustomers varchar(128) 
DECLARE @DeleteValidEmail int 
DECLARE @DeleteInvalidEmail int 
DECLARE @MessageClass varchar(64) 
DECLARE @VerifRescanTemplate varchar(128) 
DECLARE @VerifRescanAddressCC VARCHAR(128) 
DECLARE @RejectionLetterAddress VARCHAR(128) 



DECLARE @RECORDCHANGES TABLE (Action VARCHAR(255), Change_what VARCHAR(255),    Change_to VARCHAR(255)) 

/******************************************************** 
*    STEP PREPARING VARIABLES     * 
*********************************************************/ 
SET @TargetDB = CASE @@SERVERNAME 
    WHEN 'xyz/xyz' 
     THEN 'DEV' 
    WHEN 'xyz/xyz' 
     THEN 'PROD' 
    ELSE 'QA' 
    END 


IF @Environment <> @TargetDB 
BEGIN 
PRINT 'PATCH is not applying in right environment' 


RETURN 
END 


/******************************************************** 
*    STEP CHECK        * 
*********************************************************/ 

<<Here I want that code>> 

/******************************************************** 
*    STEP CHANGING       * 
*********************************************************/ 
BEGIN TRANSACTION 


SELECT @lMailboxID = MailboxID 
FROM BW_EC_MAILBOX 
WHERE EmailAddress = @lMailboxAddress 
AND SourceFolder = @lMailSourceFolder 


IF @@ROWCOUNT = 0 
BEGIN 
INSERT INTO BW_EC_MAILBOX (ServerID, EmailAddress, DomainName, UserName, [Password]) 
VALUES (@lMailServer, @lMailboxAddress, @lDomain, @lUsername, @lPassword) 


SET @lMailboxID = @@IDENTITY 
END 


UPDATE BW_EC_MAILBOX 
SET ServerID = @lMailServer 
    ,DomainName = @lDomain 
    ,UserName = @lUsername 
    ,[Password] = @lPassword 
    ,SourceFolder = @lMailSourceFolder 
    ,MoveToFolder = @lMailMoveToFolder 
    ,ProcessFlag = @lProcessFlag 
    ,SetReadFlag = @lSetReadFlag 
    ,StorageFolder = @lStorageFolder 
    ,OperatingMode = @lOperatingMode 
    ,FileExt = @lFileExt 
    ,PollingTime = @lPollingTime 
    ,CheckMailboxAt = getdate() 
    ,EnforceOrgIDCheck = @lOrgIDCheck 
    ,EnforceARECheck = @lARECheck 
    ,SingleInvoicePerEmail = @lSingleInvoice 
    ,PrimaryDocType = @lPrimaryDocType 
    ,DocPriority = @lDocPriority 
    ,CockpitDocType = @lCockpitDocType 
    ,Customer = @lCustomer 
    ,ARECode = @lARECode 
    ,OrgID = @lOrgID 
    ,EnforceSenderCheck = @lSenderCheck 
    ,EnforcePDFCheck = @lPDFCheck 
    ,ConfirmTemplate = @lConfirmTemplate 
    ,ConfirmAddressCC = @lConfirmAddressCC 
    ,VerifRejectTemplate = @lVerifRejectTemplate 
    ,VerifRejectAddressCC = @lVerifRejectAddressCC 
    ,TechRejectTemplate = @lTechRejectTemplate 
    ,TechRejectAddressCC = @lTechRejectAddressCC 
    ,ReducedValidation = @lReducedValidation 
    ,LanguageForReply = @lLanguageForReply 
    ,RedirectNoReply = @lRedirectNoReply 
    ,MailReplyTo = @lMailReplyTo 
    ,ServiceName = @lServiceName 
    ,AttachmentRule = @lAttachmentRule 
    ,DomainCheck = @lDomainCheck 
    ,ActiveFlag = @lActiveFlag 
    ,DocRejectTemplate = @DocRejectTemplate 
    ,DocRejectAddressCC = @DocRejectAddressCC 
    ,ConvertToPDFA = @ConvertToPDFA 
    ,AdditionalCustomers = @AdditionalCustomers 
    ,DeleteValidEmail = @DeleteValidEmail 
    ,DeleteInvalidEmail = @DeleteInvalidEmail 
    ,MessageClass = @MessageClass 
    ,VerifRescanTemplate = @VerifRescanTemplate 
    ,VerifRescanAddressCC = @VerifRescanAddressCC 
    ,RejectionLetterAddress = @RejectionLetterAddress 
WHERE EmailAddress = @lMailboxAddress 

SELECT * 
FROM @RECORDCHANGES 


/******************************************************** 
*    STEP COMMIT OR ROLLBACK     * 
*********************************************************/ 
IF @TEST = 1 
BEGIN 
ROLLBACK TRANSACTION 


PRINT 'ROLLBACK' 
END 
ELSE 
BEGIN 
COMMIT TRANSACTION 


PRINT 'COMMIT' 
END 

誰かが私に助けてくれたら非常に感謝します。重複した挿入を防止するために

+1

一意の制約を列または列のセットに追加すると、重複した挿入が失敗します。 –

+0

これは宿題なので、あなたのためにやるだけでは不安なので、IF EXISTSを使用して、挿入しようとしているデータがすでに存在するかどうかを確認してください。 – Leonidas199x

+0

ありがとう、皆さん。いくつかの情報源に対して、あなたはSQLについてお勧めするとアドバイスできますか? –

答えて

1

、あなたはこれらの用語に何かを試すことができます。

IF @@ROWCOUNT = 0 
BEGIN 
    IF NOT EXISTS (SELECT * FROM BW_EC_MAILBOX 
      WHERE ServerID = @lMailServer 
      EmailAddress = @lMailboxAddress 
      DomainName = @lDomain 
      UserName = @lUsername 
      [Password] = @lPassword) 
    BEGIN 
     INSERT INTO BW_EC_MAILBOX (ServerID, EmailAddress, DomainName, UserName, [Password]) 
     VALUES (@lMailServer, @lMailboxAddress, @lDomain, @lUsername, @lPassword) 
    END 
SET @lMailboxID = @@IDENTITY 

END 

更新の重複は何の意味も持たないので、あなただけの挿入の世話をする必要があります。

+0

私はおそらくそれを正しく表現していませんでした。私はちょうどあなたが "実行する準備ができていない"場合は、印刷のようないくつかの保護を "あなたはすでに実行しています" –

+0

私は参照してください。 'IF NOT EXISTS'ではなく' IF EXISTS'を使い、BEGINの中には単純に '' print''を実行しました。これは理にかなっていますか? –

+1

ありがとう –

0

ユニークなインデックス/制約を使用します。これは、データベースがデータの完全性を保証するため、重複を防止するためのアプローチです()。特に、同時に起こっている2つのインサートは、重複を挿入することができません。

私はあなたが重複になりたいのかわからないんだけど、何かのように:

create unique index unq_bw_ec_mailbox_emailaddress on BW_EC_MAILBOX(EmailAddress); 

これはEmailAddressが一意であることを前提としています。索引には、他の列(サーバー名やユーザー名など)を含めることもできます。

関連する問題