插入或更新表行时触发插入或更新字段

时间:2014-05-21 12:23:14

标签: tsql triggers

我正在使用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

非常感谢你。

1 个答案:

答案 0 :(得分: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和数据库设计