私は最初のSQL Serverトリガを作成しており、別のテーブルに挿入した後に「履歴」テーブルにINSERTすることを検討しています。私は、コードの大部分を書いていると思いますが、構文が完成したように見えません。現在の書式では、「HistoryColumnName」および「HistoryNewValue」が無効であることが示されています。変数テーブル@HistoryRecordにJOINしようとしましたが、独立しているので意味がありません。以下SQL Server:監査/履歴テーブルのトリガーを作成
コード:
CREATE TRIGGER CreateHardwareAssetHistoryRecord
ON HardwareAsset
AFTER INSERT AS
DECLARE
@HardwareAssetID UNIQUEIDENTIFIER,
@HardwareAssetTitle VARCHAR(256),
@HardwareAssetSerialNumber VARCHAR(256)
SET @HardwareAssetID = (SELECT HardwareAssetID FROM inserted)
SET @HardwareAssetTitle = (SELECT HardwareAssetTitle FROM inserted)
SET @HardwareAssetSerialNumber = (SELECT HardwareAssetSerialNumber FROM inserted)
DECLARE @HistoryRecord TABLE (HistoryColumnName VARCHAR(256) NOT NULL, HistoryNewValue VARCHAR(256) NOT NULL)
INSERT @HistoryRecord(HistoryColumnName,HistoryNewValue) VALUES('Asset Name', @HardwareAssetTitle)
INSERT @HistoryRecord(HistoryColumnName,HistoryNewValue) VALUES('Serial Number', @HardwareAssetSerialNumber)
BEGIN
WHILE EXISTS(SELECT HistoryColumnName,HistoryNewValue FROM @HistoryRecord)
INSERT INTO HardwareAssetHistory
(HardwareAssetHistoryChangeTypeID, HardwareAssetHistoryUpdatedByID, HardwareAssetHistoryColumnName, HardwareAssetHistoryOldValue, HardwareAssetHistoryNewValue, HardwareAssetHistoryHardwareAssetID)
SELECT '1', HardwareAssetCreatedByID, HistoryColumnName, '', HistoryNewValue, HardwareAssetID
FROM HardwareAsset
WHERE HardwareAssetID = @HardwareAssetID
END
GO
任意の提案やヘルプをいただければ幸いです。
注:
代わりに一時テーブルを使用できます。 https://www.google.com.au/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjKt5OGg8PSAhUJzbwKHQf5B_8QFggZMAA&url=https%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fdn935015。 aspx&usg = AFQjCNG2VZa8v6Y_rCW-rWB_2VTUW1-Idw&sig2 = fouMv9WhcDjahToxkDiWoQ&bvm = bv.148747831、d.dGc&cad = rja SQLを習得し始めたばかりの場合、トリガーは避けるべきです。実際には、実際には良いアイデアではありません。 –
最初に学ぶべきことは、最初のトリガーライターの間違いです。つまり、トリガーはバッチごとに1回呼び出され、1回に1回は呼び出されません。言い換えれば、 'SET @ HardwareAsetID =(SELECT HardwareAssetID FROMが挿入されました)'という文は、この場合エラーをスローします。 –
テーブル 'HardwareAsset'に' HistoryColumnName'?私はそうは思わない。それは間違いの直接の原因ですが、理解しておくべき他の概念があるという大きな問題の症状に過ぎません。 –