如何使用IF条件创建SQL触发器以及执行内部连接

时间:2013-01-15 05:28:02

标签: sql sql-server-2008 triggers

我有以下样本格式表结构:

CUSTOMER

CUSTID INT,//PRIMARY KEY
CUSTDATA VARCHAR

员工

EMPID INT,//PRIMARY KEY
EMPDATA VARCHAR

ITEM

ITEMID INT,//PRIMARY KEY
CUSTID INT,//REFERENCE KEY
ITEMTYPE INT //1 FOR CUSTOMER AND 2 FOR EMPLOYEE
EMPID INT

MERGEDATA

MERGEID INT,
CUSTDATA VARCHAR,
EMPDATA VARCHAR
ACTION VARCHAR

上面我有四个表(CUSTOMER, EMPLOYEE, ITEMMERGEDATA),现在我想在ITEM表上为INSERT/UPDATE/DELETE事件创建SQL Server触发器,所以每当有活动时在ITEM表上完成,它使用MERGEDATA表上的操作填充我的ITEM表。

因此,如果任何新行被插入ITEM表,则新条目将进入MERGEDATA表,具体取决于CUSTOMEREMPLOYEE条目,如果有来自客户的任何条目,它将在ITEM表格和CUSTOMER表格中添加一个条目,如下所示

CUSTOMER

123, TESTCUSTOMER

ITEM

1, 123, 1, 0

对于Employee表也是如此,但在ITEM表行中将与1, 456, 0, 2类似。

现在我想在Trigger中编写if条件,如果有来自CUSTOMER表的条目

IF (ITEMTYPE == 1)
//Entry in MERGEDATA will as below

MERGEDATA

1, 123, 0, ACTION (will depend on type of trigger event trigger if INSERT(ACTION = INS), for update (UPDATE = UPD) etc

所以简而言之,我正在寻找触发器中的东西:

  • 如何在触发器中编写IF条件
  • 如何从触发器
  • 中的其他表进行内部联接

请建议!!

由于

1 个答案:

答案 0 :(得分:0)

我的建议是:

创建三个单独的触发器 - 每个操作一个。这样可以更轻松地确定Action,还可以灵活地单独打开/关闭每个操作。此外,触发器代码将更小,更易于理解,更易于维护。

鉴于这种设计,你的触发器将很简单:

CREATE TRIGGER trg_Item_Insert 
ON dbo.Item FOR INSERT
AS 
   -- first insert customer-related data - if any
   INSERT INTO dbo.MergeTable(CUSTDATA, EMPDATA, ACTION)
      SELECT CustData, EmptyData, 'INSERT'
      FROM Inserted
      WHERE ITEMTYPE = 1

   -- then insert employee-related data - if any
   INSERT INTO dbo.MergeTable(CUSTDATA, EMPDATA, ACTION)
      SELECT CustData, EmptyData, 'INSERT'
      FROM Inserted
      WHERE ITEMTYPE = 2

当您创建三个单独的触发器时,只需将'INSERT'的{​​{1}}值替换为其他触发器中的Action'Update'

我遇到的问题是:

  • 应将'Delete'中的哪些列存储到Item
  • 中的哪一列
  • 您的MergeDataItem列中的列 - INT中的列MergeData - 您希望在此处应用哪种“转换”?

有关详细信息,请see the excellent SQL Server Books Online documentation (freely available!) on CREATE TRIGGER