2014-05-21 84 views
1

我正在使用SQL Server 2008.我創建了以下表格架構。在插入或更新表格行時插入或更新字段的觸發器

CREATE TABLE DIVISION_DETAILS 
(
    DIVISION_CODE NVARCHAR(36), 
    DIVISION_ID NVARCHAR(20), 
    DIVISION_NAME NVARCHAR(100), 
    CREATED_BY NVARCHAR(100), 
    CREATED_DATE DATETIME, 
    UPDATED_BY NVARCHAR(100), 
    UPDATED_DATE DATETIME, 
    ROW_VERSION TIMESTAMP, 
    CONSTRAINT PK_DIV_CODE PRIMARY KEY(DIVISION_CODE) 
); 

現在我需要創建一個觸發器插入或自動更新某些字段時,其他行被應用插入。到目前爲止,我已經創建了以下觸發器,但它不起作用。你能在這方面幫助我嗎?

CREATE TRIGGER TRG_DIVSION_DETAILS_INS_UPD 
ON DIVISION_DETAILS 
AFTER INSERT, UPDATE 
AS BEGIN 

IF DIVISION_CODE IS NULL 
    THEN DIVISION_CODE=NEW GUID() 
END IF 

IF ROW_VERSION IS NULL 
    THEN ROW_VERSION=NEW DATE() 
END IF 
END 

非常感謝。

回答

0

瞭解Using the inserted and deleted tables

  1. 更新和插入可能影響到多行,所以你的觸發器代碼 不應該假定只有一個去努力。
  2. 使用 的一個例子inserteddeleted表可以是:

    IF EXISTS (SELECT 1 FROM INSERTED) 
        UPDATE DIVISION_DETAILS 
         SET UpdatedDate = GETDATE() 
         FROM DIVISION_DETAILS DD 
    INNER JOIN INSERTED i ON DD.Division_Code = i.Division_Code 
    
  3. 主鍵不能爲空,所以你不應該檢查Division_Code被空。

  4. 如果您希望將guid作爲主鍵(不推薦),請將列類型設置爲uniqueidentifier
  5. 您在觸發代碼中顯示的內容不需要觸發器。它可以通過使列NOT NULL,給它們預設的限制,將填補他們將默認值時,在插入時提供NULL來完成:

    CREATE TABLE DIVISION_DETAILS 
    (
        Division_Code uniqueidentifier NOT NULL PRIMARY KEY DEFAULT(NEWID()), 
        /*...*/ 
        Created_Date datetime NOT NULL DEFAULT(GETDATE()), 
        Updated_Date datetime NOT NULL DEFAULT(GETDATE()), 
        Row_Version timestamp NOT NULL 
    ) 
    
  6. 一個timestamp列自動生成其值

  7. 你做如果它們包含的字符串不包含擴展的Unicode字符,則不需要使用nvarchar類型。
  8. 找到一個good beginning tutorial on Sql Server和數據庫設計