2014-05-21 52 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和数据库设计