2012-09-27 68 views
0

以下是我們的某個SQL表中用於任何插入/更新操作的觸發器。 99/100倍這個觸發但是每一個現在工作得很好,然後我們收到此錯誤信息:嘗試使用觸發器插入數據時出錯T-SQL

無法將NULL值插入列「TransactionDate」,表 「AgentResourcesU01.dbo.TransactionLog」;列不允許有空值。
INSERT失敗。該語句已終止。

你可以從INSERT語句看到,在我們的事務日誌表中的列TransactionDate, Operator, TableName, Action, TableStringUserId。我在開始的SELECT語句中設置變量@transDate,因此對我而言,應該沒有辦法讓NULL進入那裏,除非它是壞數據進來。

任何想法?

BEGIN 
     SELECT @symetraNumber = SymetraNumber, @lastChangeOperator = LastChangeOperator, @transDate = LastChangeDate, @entityType = EntityType, 
     @firstName = FirstName, @lastName = LastName, @suffix = NameSuffix, @corpName = CorporateName, @controlId = ControlId 
     FROM inserted 

     IF @firstName IS NULL SET @firstName = 'NULL' 
     IF @lastName IS NULL SET @lastName = 'NULL' 
     IF @suffix IS NULL SET @suffix = 'NULL' 
     IF @corpName IS NULL SET @corpName = 'NULL' 
     IF @controlId IS NULL SET @controlId = 'NULL' 

     SET @tableString = 'SymNum:' + @symetraNumber + ' EntType:' + @entityType + ' Fname:' + @firstName + ' Lname:' + @lastname + ' Suff:' + @suffix + 
      ' CorpName:' + @corpName + ' ctrlId:' + @controlId 

     INSERT INTO TransactionLog (TransactionDate, Operator, TableName, Action, TableString, UserId) 
     VALUES (@transDate, 'Op', @tableName, @action, @tableString, @lastChangeOperator) 
    END 
+0

您是否確認'LastChangeDate'不爲null? – Taryn

+0

是的,我們只是做到了。 – NealR

+0

結果是什麼? – Taryn

回答

1

爲了證明馬克的時候,你可以在基於集合的方式做到這一點,沒有所有這些討厭的變數,而且如果檢查:

INSERT dbo.TransactionLog 
(
    TransactionDate, 
    Operator, 
    TableName, 
    Action, 
    TableString, 
    UserId 
) 
SELECT 
    LastChangeDate, 
    'Op', 
    @TableName, 
    @action, 
    'SymNum:'  + COALESCE(SymetraNumber, 'NULL') 
    + ' EntType:' + COALESCE(EntityType, 'NULL') 
    + ' Fname:' + COALESCE(FirstName,  'NULL') 
    + ' Lname:' + COALESCE(LastName,  'NULL') 
    + ' Suff:'  + COALESCE(NameSuffix, 'NULL') 
    + ' CorpName:' + COALESCE(CorporateName, 'NULL') 
    + ' ctrlId:' + COALESCE(ControlId,  'NULL'), 
    LastChangeOperator 
FROM inserted; 

如果LastChangeDate在基礎表是空的,要麼大關它作爲NOT NULL,解決了插入NULL的問題,或兩者。觸發器不應該知道這個約束,但是你可以通過做這樣的事情(如果該值爲NULL,將其設置爲現在)解決它:

... 
    UserId 
) 
SELECT 
    COALESCE(LastChangeDate, CURRENT_TIMESTAMP), 
    'Op', 
... 
0

[1]我認爲你有一個INSERT/UPDATE/DELETE觸發器,當有人試圖從基表中刪除行時,觸發器中的inserted表將有零行。請看下面的例子:

CREATE TABLE MyTableWithTrigger (
    MyID INT IDENTITY PRIMARY KEY, 
    LastUpdateDate DATETIME NOT NULL 
); 
GO 

CREATE TABLE TransactionLog (
    TransactionLogID INT IDENTITY PRIMARY KEY, 
    CreateDate DATETIME NOT NULL DEFAULT GETDATE(), 
    LastUpdateDate DATETIME NOT NULL, 
    MyID INT NOT NULL 
); 
GO 

CREATE TRIGGER trIUD_MyTableWithTrigger_Audit 
ON MyTableWithTrigger 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    DECLARE @LastUpdateDate DATETIME, @MyID INT; 
    SELECT @LastUpdateDate=i.LastUpdateDate, @MyID=i.MyID 
    FROM inserted i; 

    INSERT TransactionLog (LastUpdateDate, MyID) 
    VALUES (@LastUpdateDate, @MyID) 
END; 
GO 

PRINT 'Test 1' 
INSERT MyTableWithTrigger (LastUpdateDate) 
VALUES ('2011-01-01'); 
DELETE MyTableWithTrigger; 
SELECT * FROM MyTableWithTrigger; 
SELECT * FROM TransactionLog; 

輸出:

Msg 515, Level 16, State 2, Procedure trIUD_MyTableWithTrigger_Audit, Line 10 
Cannot insert the value NULL into column 'LastUpdateDate', table 'Test.dbo.TransactionLog'; column does not allow nulls. INSERT fails. 
The statement has been terminated. 

[2]要更正您的觸發器(見Marc的評論),請閱讀192頁 - 亞歷克斯·庫茲涅佐夫的書(防守數據庫編程與SQL Server 199 :Amazon,Red Gate - PDF)。

相關問題