XE2プロジェクトのリソースとして保存されている動的SQLを含む挿入トリガーがあります。また、Delphコードを実行してSQLを実行するときに置き換えられるデータベース名とテーブル名のプレースホルダーも含まれています。
元々、SqlExpressデータベースに対してDevArt SQL Serverドライバーを使用していましたが、LocalDBデータベースに対してODBCとSQLNativeClientドライバーを使用したいと考えています。
私が見つけたのは、元の作成トリガースクリプトが機能しなくなったことです。
TSQLQuery.ExecSQLを使用してSQLコマンドを実行しています。
CREATE TRIGGER [dbo].[#TableName#_INSERT_TRIGGER] ON [#DatabaseName#].[dbo].[#TableName#] FOR INSERT
を引き起こします
'[Microsoft] [SQL Server Native Client 11.0] [SQL Server]ターゲットが現在のデータベースにないため、'EvaluationCompany_COPYDB.dbo.COPY_PRODUCTS'でトリガーを作成できません。
私が使用するパーサークラスは、GOキーワードのSQLスクリプトを個別のステートメントに分割するため、createtriggerスクリプトを次のように修正しました。
USE [#DatabaseName#]
GO
CREATE TRIGGER [dbo].[#TableName#_INSERT_TRIGGER] ON [dbo].[#TableName#] FOR INSERT
これはSSMSで行うことですが、
'[Microsoft] [SQL Server Native Client 11.0] [SQLServer]オブジェクト'dbo.COPY_PRODUCTS'が存在しないか、この操作に対して無効です。
おそらく、CREATEの「現在のデータベース」は、忘れられているように見えるため、USEによって設定されたものではないためです。
SQLステートメントを1回の実行に文字列化する通常の方法を試してみました
USE [#DatabaseName#];
CREATE TRIGGER [dbo].[#TableName#_INSERT_TRIGGER] ON [dbo].[#TableName#] FOR INSERT
しかし、それは期待を投げます
'[Microsoft] [SQL Server Native Client 11.0] [SQL Server]' CREATE TRIGGER'は、クエリバッチの最初のステートメントである必要があります。
そこで、CREATE ...END全体をEXEC[#DatabaseName#]。[sys]。[sp_ExecuteSQL] N''でラップし、それを実行しようとしました。文字列変数の内容をSSMSに貼り付けると正常に実行されますが、ExecSQLに渡されると
'[Microsoft] [SQL Server Native Client 11.0] [SQLServer]プロシージャ'sp_executesql'はプロシージャオブジェクトであるため、プロシージャ'sp_executesql'の要求は失敗しました。
これは一種の無意味です。そのため、dbExpressとSQLServerネイティブクライアントを使用してテーブルにトリガーを作成する方法がわかりません。