Я полностью в тупике. У меня есть триггер, который должен отправить электронное письмо, если запись была вставлена в таблицу, но только если она не была вставлена за последние 20 минут или около того. Я сузил его до того, что он просто не похож на GETDATE() в запросе вставки.Проблема с триггером с использованием GETDATE
Если я обновляю хранимую процедуру, чтобы вставить статическую дату, например «2013-03-07 09: 53: 54.12», она выполнит триггер и построит тело электронной почты, чтобы оно могло быть отправлено. Если в хранимой процедуре используется GETDATE() или SYSDATETIME(), переменная body будет пустой после запуска команды select.
Я что-то упустил? Я не могу найти ничего, что было опубликовано ранее, но я извиняюсь, что сценарий уже опубликован и разрешен здесь.
Моя команда вставки в моем проекте MVC выглядит следующим образом:
SqlConnection conn = new SqlConnection();
conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["RegistrationEntriesConnectionString"].ToString();
SqlCommand command = new SqlCommand("RegisterCustomerDownload", conn);
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.AddWithValue("@Email", userEmail);
command.Parameters.AddWithValue("FileDownloaded", "Product Name Here");
try
{
//Open connection and try to execute the command
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
//do something
}
Моя хранимая процедура выглядит следующим образом:
SET NOCOUNT ON;
INSERT INTO TrialDownloads(Email, FileDownloaded, DownloadTime)
VALUES(@Email, @FileDownloaded, GETDATE());
Оттуда, у меня есть триггер (для вставки), чем посылает электронной почты, если последняя соответствующая запись была вставлена дольше, чем 20 минут назад:
SET NOCOUNT ON;
DECLARE @body NVARCHAR(MAX) = N'';
--For debugging purposes
INSERT INTO [DebugLog] (message) VALUES ('Entered SendTrialDownloadEmail');
SELECT @body += 'A trial has been downloaded:' +
CHAR(13) + CHAR(10)+ 'Email Address: ' + Email +
CHAR(13) + CHAR(10)+ 'Product Downloaded ' + FileDownloaded +
CHAR(13) + CHAR(10)+ 'Date Downloaded: ' + CONVERT(NVARCHAR, DownloadTime)
FROM [inserted] i
WHERE NOT EXISTS (SELECT * FROM [dbo].[TrialDownloads] o
WHERE 20 > DATEDIFF(minute, o.DownloadTime, GETDATE())
AND i.Email = o.Email
AND i.FileDownloaded = o.FileDownloaded);
--For debugging purposes
INSERT INTO [DebugLog] (message) VALUES ('Before IF block');
INSERT INTO [DebugLog] (message) VALUES (@body);
DECLARE @insertCount NVARCHAR(MAX);
SELECT @insertCount = CONVERT(nvarchar, COUNT(*)) FROM inserted
INSERT INTO DebugLog (message) VALUES (@insertCount);
IF NOT @body = N''
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name="NoReplyProfile",
@recipients="[email protected]",
@subject="A Trial has been downloaded",
@[email protected];
INSERT INTO [DebugLog] (message) VALUES ('Mail sent');
INSERT INTO [DebugLog] (message) VALUES (@body);
END
Во-первых, никогда не отправить по электронной почте в качестве триггера. Вы отправляете записи, чтобы отправлять электронные письма в папку, а затем запускать работу каждые 5 минут, чтобы отправить электронные письма. Вы не хотите разрывать вставки, если сервер электронной почты идет вниз. – HLGEM
@HLGEM Не так ли работает sp_send_dbmail в SQL Server 2008? – MojoFilter
Какой тип данных является столбцом DownloadTime? – HLGEM