1

我的触发器有问题,我无法弄清楚。

假设我有两个表,Stu_Table2 和 Stu_log。Stu_table2 有一些列,其中之一是自动生成的主键 [stu_id]。两个表之间的链接是 [stu_name]=[user_id]

下面的代码适用于更新和删除(因为主键已经存在)。但是我卡在插入上-如果尚未生成,我如何将自动生成的主键从 stu_name 插入到日志表中?

Stu_name 列,[stu_id] [Stu_name] [Stu_class]

Stu_log 列,[user_id] [stu_name]

显然这不是一个真实世界的例子,只是测试概念证明。

    ALTER TRIGGER [dbo].[stu_testtrigger]
    ON [dbo].[Stu_Table2] FOR INSERT, UPDATE, DELETE
    AS 

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with caller queries SELECT statements.
    -- If an update/insert/delete occurs on the main table, the number of         records         affected
    -- should only be based on that table and not what records the triggers may/may not
    -- select.
    SET NOCOUNT ON;

    --
    -- Variables Needed for this Trigger
    -- 
    DECLARE @stu_ID int
    DECLARE @stu_name varchar(15)
    DECLARE @stu_class int

    --
    -- Determine if this is an INSERT,UPDATE, or DELETE Action
    -- 
    DECLARE @Action as char(1)
    DECLARE @Count as int
    SET @Action = 'I' -- Set Action to 'I'nsert by default.
    SELECT @Count = COUNT(*) FROM DELETED
    if @Count > 0
        BEGIN
            SET @Action = 'D' -- Set Action to 'D'eleted.
            SELECT @Count = COUNT(*) FROM INSERTED
            IF @Count > 0
                SET @Action = 'U' -- Set Action to 'U'pdated.
        END

    if @Action = 'D'
        -- This is a DELETE Record Action
        --
        BEGIN
            SELECT @Stu_id =[stu_id]
                        ,@Stu_name = [stu_name]
            FROM DELETED

            DELETE [dbo].[stu_log]
            WHERE [user_id]=@stu_id
        END
     Else
        BEGIN
                --
                -- Table INSERTED is common to both the INSERT, UPDATE trigger
                --
                SELECT @stu_id =[stu_id]
                    ,@stu_name = [stu_name]
                FROM INSERTED 

             if @Action = 'I'
                -- This is an Insert Record Action
                --

                --THIS IS WHERE I'm STUCK i think!!!
                BEGIN
                    INSERT INTO [stu_log]
                        ([user_id]
                        ,[description])
                    VALUES
                        (@stu_id
                        ,@stu_name)

                END
            else
                -- This is an Update Record Action
                --
                BEGIN
                    UPDATE [stu_log]
                        SET [user_id] = @stu_id
                              ,[description] = @Stu_name
                        WHERE [user_id]=@stu_id
                END
        END 

帮助!

4

1 回答 1

1

由于您似乎想要对插入、更新和删除执行截然不同的操作,我不确定您为什么要将所有操作都塞进一个触发器中。我只是有:

CREATE TRIGGER [dbo].[stu_testtrigger_I]
ON [dbo].[Stu_Table2] AFTER INSERT
AS
   INSERT INTO stu_log ([user_id],[description])
   SELECT stu_id,stu_name from inserted
GO
CREATE TRIGGER [dbo].[stu_testtrigger_D]
ON [dbo].[Stu_Table2] AFTER DELETE
AS
   DELETE FROM stu_log WHERE [user_id] IN (
   SELECT stu_id from deleted)
GO
CREATE TRIGGER [dbo].[stu_testtrigger_U]
ON [dbo].[Stu_Table2] AFTER UPDATE
AS
   UPDATE l SET user_name = i.user_name
   FROM
      stu_log l
         inner join
      inserted i
         on l.[user_id] = i.stu_id
GO

笔记:

  1. 这适用于您原来没有的多行插入、更新和删除
  2. 我说AFTER的不是FOR, 是为了让您更清楚地知道这些动作是在任何活动Stu_Table2已经发生之后发生的(例如,身份值已经生成,这似乎是您关心的问题)。
  3. 但是,您应该注意,AFTERandFOR是同义词。INSTEAD OF如果我们做一个触发器,你只会得到不同的行为。
  4. [user_id] = @stu_idUPDATE. 鉴于WHERE此更新的子句(或上面我的连接等效项),这两个必须已经相等。
于 2012-09-12T06:36:28.927 回答