2017-04-07 10 views
1

サポートが必要な非常に古いアプリケーションがあります。私はそれを置き換えるために(ハード)を押しているが、あなたはどのような管理が可能であるかを知っている。フロントエンドは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 
+0

"ODBC - リンクテーブル 'dbo_Quote'に挿入できませんでした。 - ssms * + *のトリガを有効にして*クエリを実行すると、追加のエラー情報が表示されますか? – niksofteng

+0

いいえ、SSMSで成功します。正常に電子メールを作成し、エラーなしでレコードを挿入します。 –

+0

(おそらく)現在の問題とは関係ありませんが、トリガーがひどく壊れています。 'inserted'は0,1、または**複数の**行を含むことができます。スカラー変数に選択されたものはすべて、後者の状況が発生するとひどく壊れます。 –

答えて

0

本当に答えはありますが、結論はもっとありません。

私はAccessをあきらめて、Visual Studioでアプリケーションを再開発するように私の上司に話しました。

これは新たな問題の全体の多くを作成したが、それはあなたの意見や提案のための半分以上:)

おかげである前に、少なくとも我々は現在の世紀でソフトウェアを使用することになります。

0

がテーブルdbo_quoteに挿入した後(仮定)トリガが持つ別のテーブルの上にいくつかの挿入が含まれていないSQLプロファイラでキャプチャアクセスによって生成されたSQLであります引き金?その場合は、変数が使用されている挿入コードを確認してください。

+0

はい挿入後トリガーです。データベースは非常に単純で、テーブルは4つしかありません。他にトリガはありません。最初は、ある種の制約問題かもしれないと思っていましたが、制約はありません。 ステータステーブル内のレコードを指し示すステータスIDを保持する1つの外部キーがあります。 –

+0

私の疑いは、引用符テーブルの挿入後トリガーで正確に起こっていることです。私は挿入操作をしているのですか? – Coder1991

+0

質問にトリガクエリを追加します。それは長くてもそうです:) –

関連する問題