SQL保护,防止在执行两次时创建多行
我有一个基本的问题。请问,你能建议如何建立某种保护吗 正如你在下面看到的 如果执行两次,则必须防止创建两行。 它应防止创建重复项。这是我的家庭作业,我没有能力解决这个问题。我认为这不是一项艰巨的任务,但即使在谷歌上搜索,我也找不到解决方案 谢谢你的帮助和理解 这是一个代码SQL保护,防止在执行两次时创建多行,sql,sql-server,Sql,Sql Server,我有一个基本的问题。请问,你能建议如何建立某种保护吗 正如你在下面看到的 如果执行两次,则必须防止创建两行。 它应防止创建重复项。这是我的家庭作业,我没有能力解决这个问题。我认为这不是一项艰巨的任务,但即使在谷歌上搜索,我也找不到解决方案 谢谢你的帮助和理解 这是一个代码 DECLARE @TEST BIT DECLARE @Environment VARCHAR(4) DECLARE @TargetDB VARCHAR(4) DECLARE @lMailboxID INT DECLARE @l
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
如果有人能帮助我,我将不胜感激。为了防止重复插入,您可以尝试以下条款:
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
更新重复项没有任何意义,因此您只需要处理插入项。您希望使用唯一的索引/约束。这是防止重复的正确方法,因为数据库将保证数据的完整性。特别是,同时进行的两次插入不能插入重复项 我不确定您希望复制什么,但类似于:
create unique index unq_bw_ec_mailbox_emailaddress on BW_EC_MAILBOX(EmailAddress);
这假定EmailAddress是唯一的。您可能还希望在索引中包含其他列,如服务器或用户名。您可以为一列或一组列添加唯一约束,之后重复插入将失败。因为这是家庭作业,我对仅为您这样做感到不安,因此,请阅读有关使用IF EXISTS检查您要插入的数据是否已经存在的内容。谢谢大家。你能推荐一些关于SQL的源代码吗?我可能表达得不对。我只是想要一些保护,比如打印,如果你还没有准备好执行,你已经执行了。然后使用IF EXISTS而不是IF NOT EXISTS,并在内部开始执行已执行的简单打印。希望这有意义?非常感谢