2016-11-05 31 views
0

我創建瞭如下表:如何改進以下存儲過程以驗證電子郵件的語法?

CREATE TABLE TBL_EMAIL 
(
    ID INT IDENTITY PRIMARY KEY, 
    EMAIL VARCHAR(25) NOT NULL 
); 

我想創建一個存儲過程,以檢查是否有新郵件的語法是好的,我只是想掩蓋兩種可能性,如果此郵件還沒有一個「@ 「字符如下:

INSERT INTO TBL_EMAIL (EMAIL) 
VALUES ('email.com') 

並且如果該電子郵件還沒有相應的點:

INSERT INTO TBL_EMAIL (EMAIL) 
VALUES ('[email protected]') 

我只是想掩蓋這種情況下,CR eate一個存儲過程時,有一個插入到被激活或更新

CREATE TRIGGER Tr_Verify_Email 
ON TBL_EMAIL 
FOR INSERT,UPDATE 
AS 
BEGIN 

變量聲明的同時,還有一些標誌知道,如果「@」位於第一位置裏面算,

DECLARE @V_COUNT INT,@FLAG INT 
    DECLARE @V_EMAIL_INSERTED VARCHAR(25) 
    SET @V_COUNT = 1 
    SET @FLAG = 0 
    SELECT @V_EMAIL_INSERTED = EMAIL FROM INSERTED; 

    WHILE(@V_COUNT < LEN(@V_EMAIL_INSERTED)) BEGIN 
     IF(SUBSTRING(@V_EMAIL_INSERTED,@V_COUNT,1)='@' AND @V_COUNT > 4) BEGIN 
      SET @FLAG = @FLAG + 1 
     END 
     SET @V_COUNT = @V_COUNT + 1 
    END 

回滾事務時使用的電子郵件和「@」在第一位置,

IF(@FLAG <> 1) BEGIN 
     RAISERROR('Invalid Email',16,1) 
     ROLLBACK TRANSACTION 
    END  
END 

然而,這是我第一次的做法,但據我所知,有很多缺失的C Ases和無效的電子郵件,因此我想感謝提高我的邏輯的建議,只允許使用我認爲是[email protected]的撥款結構的電子郵件,感謝您的支持。

+0

。 。我修復了標籤。憑藉您的聲譽水平,您應該知道避免不兼容的數據庫標記,並將適當的軟件放在問題上。 –

+0

對不起,感謝修復,我非常感謝支持。 – neo33

回答

1

請勿使用觸發器。正確的方法是check約束:

alter table tbl_email 
    add constraint chk_email_email 
     check (email like '%@%.%'); 

這將確保數據的完整性都插入和更新

+0

感謝這是非常有用的,但我正在練習使用觸發器,我想欣賞使用觸發器,感謝您的支持。 – neo33

+0

對於您的觸發器練習,請確保您測試插入和更新和刪除方案。測試一次更新多行,並確保您有一些行不希望在測試中更新。也用空值進行測試。這會給你更好的觸發技巧。 –

+0

@SqlSurfer,感謝您的建議,此刻我正在分析DELETED和INSERTED表, – neo33