サポートが必要な非常に古いアプリケーションがあります。私はそれを置き換えるために(ハード)を押しているが、あなたはどのような管理が可能であるかを知っている。フロントエンドはAccess 97にあり、SQL Server 2008 R2のデータストア用のテーブルをリンクしています。SQL Server:トリガーを有効にすると、レコードが作成されません。
これは長年にわたってスムーズに動作しており、通常は変更を拒否しています。
新しいレコードが特定のテーブルに作成されるたびに自動メールを送信するように要求されました。過去にSQL Serverエージェントジョブから電子メールを送信していたので、レコードが作成されたときにトリガーから電子メールを送信するのが難しくないと考えて、Access97のフロントエンドを変更する必要はありませんでした。
多くのログを組み込んだファイルを作成してトリガーを作成しました。そのため、トリガーが途中で失敗したかどうかを判断できます。
私は、クライアント上で取得していますエラーメッセージが
「ODBCは - 『dbo_Quote』は失敗したリンクテーブルに挿入します。」であります
これは、挿入されているテーブルと、トリガーが付いたテーブルです。
誰かが本当に見たいと思ったらここにトリガーコードを投稿しますが、問題はそこにあるとは思わないでしょう。それは私のすべてのデバッグコードで少し長いです。それは私がこの
set @MASuburb = (select Rtrim(MASuburb) from inserted)
などのすべての行をコメントアウトするだけで直接実行したときにコードが動作するそれらを宣言した後、手動で変数を設定して働くことを証明する
。
テストの変更を削除した後、トリガを無効にしてアプリケーションを実行し、SQL Server Profilerを使用して実行されたクエリを取得し、挿入に成功しました。
私は作成したレコードを削除し、再びトリガーを有効にしました。
キャプチャしたクエリをManagement Studioに貼り付け、最後まで実行して電子メールを送信しました。この問題は、クエリがAccessから直接取得された場合にのみ発生します。
トリガが有効な場合、SQL ServerがAccessに障害メッセージを戻す理由を理解できません。
私はより良いエラーメッセージを探していましたが、何も記録されていないようです。
どのように問題を見つけることができますか?
は(うんうん、私はアクセスを取り除く知っている)ここでは、事前に デビッド
UPDATE を
感謝をトリガコードです。私はデバッグロギングの多くを削除しました。ただ、それが明確であることを確認する
Apr 7 2017 5:15PM: ======= Trigger NewManagementQuotation Trigger Executed ======= (Quote Database, Quote Table)
を期待通りに
USE [Quote]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[NewManagementQuotationEmail]
ON [Quote].[dbo].[Quote]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Declare Fields Used
Declare @DateEntered datetime
set @DateEntered = ''
Declare @ContactName nvarchar(50)
set @ContactName = ''
Declare @PreparedFor nvarchar(50)
set @PreparedFor = ''
Declare @MailAddress1 nvarchar(50)
set @MailAddress1 = ''
Declare @MailAddress2 nvarchar(50)
set @MailAddress2 = ''
Declare @MASuburb nvarchar(50)
set @MASuburb = ''
Declare @MAState nvarchar(3)
set @MAState = ''
Declare @MAPcode nvarchar(10)
set @MAPcode = ''
Declare @SPNumber nvarchar(10)
set @SPNumber = ''
Declare @SPAddress1 nvarchar(50)
set @SPAddress1 = ''
Declare @SPAddress2 nvarchar(50)
set @SPAddress2 = ''
Declare @SPSuburb nvarchar(50)
set @SPSuburb = ''
Declare @SPState nvarchar(3)
set @SPState = ''
Declare @SPPcode nvarchar(10)
set @SPPcode = ''
Declare @NumberOfUnits int
set @NumberOfUnits = ''
Declare @PricePerUnit money
set @PricePerUnit = ''
Declare @TotalAnnualFee money
set @TotalAnnualFee = ''
Declare @Stationary money
set @Stationary = ''
Declare @ContactPhoneW nvarchar(15)
set @ContactPhoneW = ''
Declare @ContactPhoneH nvarchar(15)
set @ContactPhoneH = ''
Declare @ContactPhoneM nvarchar(15)
set @ContactPhoneM = ''
Declare @Fax nvarchar(15)
set @Fax = ''
Declare @Email nvarchar(50)
set @Email = ''
Declare @WhyChooseUs nvarchar(50)
set @WhyChooseUs = ''
Declare @CurrentlyManagedBy nvarchar(50)
set @CurrentlyManagedBy = ''
Declare @DateSent datetime
set @DateSent = ''
Declare @CallBackDate datetime
set @CallBackDate =''
Declare @EnteredBy nvarchar(15)
set @EnteredBy = ''
-- Setup Debug Logging
Declare @Debug int
-- 0=OFF >=1 ON --
Set @Debug = 2
if @Debug > 0
Begin
DECLARE @cmd varchar(255)
DECLARE @var varchar(255)
DECLARE @logfile char(50)
SET @logfile = '>> C:\temp\NewManagementQuotationEmailLog.txt'
SET @var = cast(GetDate()as varchar)+ ': ' + '======= Trigger NewManagementQuotation Trigger Executed ======= (Quote Database, Quote Table)'
SET @cmd = 'echo ' + @var + @logfile
EXEC master..xp_cmdshell @cmd
End
Return
--=======================================================================================
-- Declare the variable to send the email
Declare @VAR_EmailAddress varchar(100)
Declare @VAR_Subject varchar(100)
Declare @VAR_Body varchar(4000)
--Declare @VAR_FileName varchar(50)
Declare @NewLine varchar(10)
Set @NewLine = CHAR(13)+CHAR(10)
set @VAR_EmailAddress = '<My Email Goes here>'
set @DateEntered = (select DateEntered from inserted)
set @ContactName = (select Rtrim(ContactName) from inserted)
set @PreparedFor = (select Rtrim(PreparedFor) from inserted)
set @MailAddress1 = (select Rtrim(MailAddress1) from inserted)
set @MailAddress2 = (select Rtrim(MailAddress2) from inserted)
set @MASuburb = (select Rtrim(MASuburb) from inserted)
set @MAState = (select Rtrim(MAState) from inserted)
set @MAPcode = (select Rtrim(MAPcode) from inserted)
set @SPNumber = (select Rtrim(SPNumber) from inserted)
set @SPAddress1 = (select Rtrim(SPAddress1) from inserted)
set @SPAddress2 = (select Rtrim(SPAddress2) from inserted)
set @SPSuburb = (select Rtrim(SPSuburb) from inserted)
set @SPState = (select Rtrim(SPState) from inserted)
set @SPPcode = (select Rtrim(SPPcode) from inserted)
set @NumberOfUnits = (select NumberOfUnits from inserted)
set @PricePerUnit = (select PricePerUnit from inserted)
set @TotalAnnualFee = (select TotalAnnualFee from inserted)
set @Stationary = (select Stationary from inserted)
set @ContactPhoneW = (select Rtrim(ContactPhoneW) from inserted)
set @ContactPhoneH = (select Rtrim(ContactPhoneH) from inserted)
set @ContactPhoneM = (select Rtrim(ContactPhoneM) from inserted)
set @Fax = (select Rtrim(Fax) from inserted)
set @Email = (select Rtrim(Email) from inserted)
set @WhyChooseUs = (select Rtrim(WhyChooseUs) from inserted)
set @CurrentlyManagedBy = (select Rtrim(CurrentlyManagedBy) from inserted)
set @DateSent = (select DateSent from inserted)
set @CallBackDate = (select CallBackDate from inserted)
set @EnteredBy = (select Rtrim(EnteredBy) from inserted)
--================================================================================================
if @Debug > 0
Begin
SET @var = cast(GetDate()as varchar)+ ' 2) Generate Email to Trello started'
SET @cmd = 'echo ' + @var + @logfile
EXEC master..xp_cmdshell @cmd
End
if @Debug > 0
Begin
SET @var = cast(GetDate()as varchar)+ ' 3.0) Query Text String Begin'
SET @cmd = 'echo ' + @var + @logfile
EXEC master..xp_cmdshell @cmd
End
Set @VAR_Subject = @SPNumber
set @VAR_Body = 'Date Entered= ' + cast(@DateEntered as varchar(12)) + CHAR(13)+ CHAR(10) +
'Contact Name= ' + @ContactName + CHAR(13)+ CHAR(10) +
'Prepared for= ' + @PreparedFor + CHAR(13)+ CHAR(10) +
'Mail Address 1= ' + @MailAddress1 + CHAR(13)+ CHAR(10) +
'Mail Address 2= ' + @MailAddress2 + CHAR(13)+ CHAR(10) +
'Mail Address Suburb= ' + @MASuburb + CHAR(13)+ CHAR(10) +
'SP Address 1= ' + @SPAddress1 + CHAR(13)+ CHAR(10) +
'SP Address 2= ' + @SPAddress2 + CHAR(13)+ CHAR(10) +
'SP State= ' + @SPState + CHAR(13)+ CHAR(10) +
'SP Suburb=' + @SPSuburb + CHAR(13)+ CHAR(10) +
'SP Post Code= ' + @SPPcode + CHAR(13)+ CHAR(10) +
'Number of Units= ' + cast(@NumberOfUnits as varchar(5)) + CHAR(13)+ CHAR(10) +
'Price Per Unit= ' + cast(@PricePerUnit as varchar(10)) + CHAR(13)+ CHAR(10) +
'Total Annual Fee= ' + cast(@TotalAnnualFee as varchar(10)) + CHAR(13)+ CHAR(10) +
'Stationary= ' + cast(@Stationary as varchar(10)) + CHAR(13)+ CHAR(10) +
'Contact Phone W= ' + @ContactPhoneW + CHAR(13)+ CHAR(10) +
'Contact Phone H= ' + @ContactPhoneH + CHAR(13)+ CHAR(10) +
'Contact Phone M= ' + @ContactPhoneM + CHAR(13)+ CHAR(10) +
'Fax= ' + @Fax + CHAR(13)+ CHAR(10) +
'Email= ' + @Email + CHAR(13)+ CHAR(10) +
'Why Choose Us= ' + @WhyChooseUs + CHAR(13)+ CHAR(10) +
'Currently Managed by= ' + @CurrentlyManagedBy + CHAR(13)+ CHAR(10) +
'Date Sent= ' + cast(@DateSent as varchar(12)) + CHAR(13)+ CHAR(10) +
'Call Back Date= ' + cast(@CallBackDate as varchar(12)) + CHAR(13)+ CHAR(10) +
'Entered By= ' + @EnteredBy
if @Debug > 0
Begin
SET @var = cast(GetDate()as varchar)+ ' 3.9) Query Text String Complete'
SET @cmd = 'echo ' + @var + @logfile
EXEC master..xp_cmdshell @cmd
End
EXEC msdb.dbo.sp_send_dbmail
@recipients = @VAR_EmailAddress,
@subject = @VAR_Subject,
@profile_name = 'SQL Email Profile',
@body= @VAR_Body
if @Debug > 0
Begin
SET @var = cast(GetDate()as varchar)+ ' 4) Generate Email to Trello complete'
SET @cmd = 'echo ' + @var + @logfile
EXEC master..xp_cmdshell @cmd
End
--================================================================================================
if @Debug > 0
Begin
SET @var = cast(GetDate()as varchar)+ '======= Trigger NewManagementQuotation Trigger Complete ======='
SET @cmd = 'echo ' + @var + @logfile
EXEC master..xp_cmdshell @cmd
End
End
アップデートは2 キーワード「戻る」を追加した後のエラーメッセージの変更なし マイトリガー・ログには、一つだけの行が含まれています。私は、トリガを無効にしてAccessによって生成されたSQLをキャプチャし、トリガを有効にしてMicrosoft Management Studioで直接再実行することができます。だから、私のように思えるのは、AccessがSQL Serverからの戻りコードを誤解して、トリガーが有効になっているときにSQL Serverが間違ったコードを返す方法があるようです。それは私が把握する必要があるものです。
更新3 これは私が
exec sp_executesql N'INSERT INTO "dbo"."Quote"
(
"DateEntered",
"ContactName",
"PreparedFor",
"MailAddress1",
"MASuburb",
"MAState",
"MAPcode",
"SPNumber",
"SPAddress1",
"SPSuburb",
"SPState",
"SPPcode",
"NumberOfUnits",
"PricePerUnit",
"Stationary",
"ContactPhoneW",
"ContactPhoneH",
"ContactPhoneM",
"Email",
"WhyChooseUs",
"CurrentlyManagedBy",
"DateSent",
"CallBackDate",
"StatusId",
"EnteredBy"
)
VALUES (@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8,@P9,@P10,@P11,@P12,@P13,@P14,@P15,@P16,@P17,@P18,@P19,@P20,@P21,@P22,@P23,@P24,@P25)',N'
@P1 datetime,
@P2 char(50),
@P3 char(50),
@P4 char(50),
@P5 char(50),
@P6 char(3),
@P7 char(10),
@P8 char(10),
@P9 char(50),
@P10 char(50),
@P11 char(3),
@P12 char(10),
@P13 int,
@P14 decimal(19,4),
@P15 decimal(19,4),
@P16 char(15),
@P17 char(15),
@P18 char(15),
@P19 char(50),
@P20 char(50),
@P21 char(50),
@P22 datetime,
@P23 datetime,
@P24 int,
@P25 char(15)',
'2017-04-07 00:00:00',
'Farley Bainsworth ',
'Bob Johnson ',
'15 Boburgal Ave ',
'Kirrawee ',
'NSW','2232 ',
'101010 ',
'100 Armdale Rd ',
'The Land ',
'NSW','2460 ',
100,
50.0000,
500.0000,
'02 66493300 ',
'02 66493693 ',
'0418256742 ',
'[email protected] ',
'Why Not ',
'Bob the Builder ',
'2017-04-07 00:00:00',
'2017-08-07 00:00:00',1,
'bpollard '
go
"ODBC - リンクテーブル 'dbo_Quote'に挿入できませんでした。 - ssms * + *のトリガを有効にして*クエリを実行すると、追加のエラー情報が表示されますか? – niksofteng
いいえ、SSMSで成功します。正常に電子メールを作成し、エラーなしでレコードを挿入します。 –
(おそらく)現在の問題とは関係ありませんが、トリガーがひどく壊れています。 'inserted'は0,1、または**複数の**行を含むことができます。スカラー変数に選択されたものはすべて、後者の状況が発生するとひどく壊れます。 –