简单的t-sql而不是触发器

时间:2013-03-12 21:44:04

标签: sql sql-server tsql

任何人都可以帮助解决简单的t-sql脚本问题吗?我使用非常简单的触发器将数据从一个表复制到另一个表(这些表之间没有关系)。当我尝试在触发器创建后第一次直接插入数据时(来自同一个脚本)我得到了所需的结果,但是所有下一次尝试都会在下一个提示符下失败:'The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.'我很困惑这是什么意思。看下面的触发器:

CREATE TRIGGER AuthorInsert ON Author
INSTEAD OF INSERT
AS
BEGIN -- //- 1 -//
--***************** if insert was correct ********************
    IF (SELECT COUNT(*) FROM INSERTED) > 0
    BEGIN --//- 2 -//
        DECLARE @id int, @roleId int;
        DECLARE @nameId int, @reestrCodeId int, @passportDataId int, @addressId int, @phoneId int;
        SET @nameId = (SELECT INSERTED.NameID FROM INSERTED);
        SET @reestrCodeId = (SELECT INSERTED.ReestrCodeID FROM INSERTED);
        SET @passportDataId = (SELECT INSERTED.PassportDataID FROM INSERTED);
        SET @addressId = (SELECT INSERTED.AddressID FROM INSERTED);
        SET @phoneId = (SELECT INSERTED.PhoneID FROM INSERTED);
        BEGIN TRY
            INSERT INTO Role(RoleName) VALUES('Author');
        END TRY
        BEGIN CATCH
        END CATCH
        SET @roleId = (SELECT Role.RoleID FROM Role WHERE Role.RoleName = 'Author');
        INSERT INTO Employee(NameID, ReestrCodeID, RoleID, PassportDataID, AddressID, PhoneID)VALUES
                            (@nameId, @reestrCodeId, @roleId, @passportDataId, @addressId, @phoneId);
        SET @id = (SELECT Employee.EmployeID FROM Employee WHERE Employee.EmployeID = @@IDENTITY) + 1;
        INSERT INTO Author VALUES(@id, @nameId, @reestrCodeId, @passportDataId, @addressId, @phoneId);
    END -- //- 2 -//
END -- //- 1 -//

没有理由发布表格的图表,因为它非常原始(因为我在上面提到的那些表格之间没有直接关系)很明显。我的剧本有什么不对,这个奇怪的错误意味着什么呢?

1 个答案:

答案 0 :(得分:3)

我不确定BEGIN TRY块的重点是什么。很明显,你想确保有一个名为Role的{​​{1}} - 但你真的需要每次都在触发器中检查这个吗?你不能现在填充它,而不必再检查一下吗?

Author