SQL Server 2005 トランザクション パブリケーションで奇妙な問題が発生しました。問題は次のとおりです。パブリケーションに create index ステートメントを含むストアド プロシージャであるアーティクルが含まれている場合、ストアド プロシージャのスキーマをサブスクライバーにレプリケートしようとすると、エラーがスローされます。
create index ステートメントがコメントアウトされていても例外が発生し、完全に削除された場合にのみ機能するため、動作は非常に奇妙です。
返される正確なエラーは次のとおりです。
コマンド試行: GRANT EXECUTE ON [dbo].[usp_Test] TO [CompanyDatabase_access]
(トランザクション通番:0x00000170000008B9000500000000、コマンドID:5)
エラー メッセージ: オブジェクト 'usp_Test' が見つかりません。オブジェクトが存在しないか、権限がないためです。(ソース: MSSQLServer、エラー番号: 15151) ヘルプを参照してください: http://help/15151 オブジェクト 'usp_Test' が見つかりません。オブジェクトが存在しないか、権限がないためです。(ソース: MSSQLServer、エラー番号: 15151) ヘルプ: http://help/15151
サブスクライバーを確認すると、ストアド プロシージャが期待どおりに作成されていないため、エラーは正確です...しかし、それが公開の目的でした...
さらに、サブスクライバーでストアド プロシージャを手動で作成できますが、スナップショットを生成すると既存のストアド プロシージャが削除され、引き続きこのエラー メッセージが返されます。
そして、これがこの問題を引き起こすサンプル パブリケーションです。
ストアド プロシージャ:
USE [CompanyDatabase]
GO
CREATE PROCEDURE [dbo].[usp_Test]
AS
CREATE TABLE #TempTable(ID INT)
CREATE NONCLUSTERED INDEX [IX_TempTable] ON [dbo].[#TempTable](ID)
SELECT 'Test'
GO
GRANT EXECUTE ON [dbo].[usp_Test] TO [CompanyDatabase_access]
GO
パブリケーション スクリプト:
-- Adding the transactional publication
use [CompanyDatabase]
exec sp_addpublication
@publication = N'Replication Test',
@description = N'Publication of database ''CompanyDatabase''.',
@sync_method = N'concurrent',
@retention = 0,
@allow_push = N'true',
@allow_pull = N'true',
@allow_anonymous = N'false',
@enabled_for_internet = N'false',
@snapshot_in_defaultfolder = N'true',
@compress_snapshot = N'false',
@ftp_port = 21,
@ftp_login = N'anonymous',
@allow_subscription_copy = N'false',
@add_to_active_directory = N'false',
@repl_freq = N'continuous',
@status = N'active', @independent_agent = N'true',
@immediate_sync = N'false',
@allow_sync_tran = N'false',
@autogen_sync_procs = N'false',
@allow_queued_tran = N'false',
@allow_dts = N'false',
@replicate_ddl = 1,
@allow_initialize_from_backup = N'false',
@enabled_for_p2p = N'false',
@enabled_for_het_sub = N'false'
GO
-- Adding the transactional articles
use [CompanyDatabase]
exec sp_addarticle
@publication = N'Replication Test',
@article = N'usp_Test',
@source_owner = N'dbo',
@source_object = N'usp_Test',
@type = N'proc schema only',
@description = N'',
@creation_script = N'',
@pre_creation_cmd = N'drop',
@schema_option = 0x0000000048000001,
@destination_table = N'usp_Test',
@destination_owner = N'dbo',
@status = 16
GO
-- Adding the transactional subscriptions
use [CompanyDatabase]
exec sp_addsubscription
@publication = N'Replication Test',
@subscriber = N'OtherDatabaseServer',
@destination_db = N'CompanyDatabase',
@subscription_type = N'Pull',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0
GO
サブスクリプション スクリプト:
/****** Begin: Script to be run at Subscriber ******/
use [CompanyDatabase]
exec sp_addpullsubscription
@publisher = N'DatabaseServer',
@publication = N'Replication Test',
@publisher_db = N'CompanyDatabase',
@independent_agent = N'True',
@subscription_type = N'pull',
@description = N'',
@update_mode = N'read only',
@immediate_sync = 0
exec sp_addpullsubscription_agent
@publisher = N'DatabaseServer',
@publisher_db = N'CompanyDatabase',
@publication = N'Replication Test',
@distributor = N'DatabaseServer',
@distributor_security_mode = 1,
@distributor_login = N'',
@distributor_password = N'',
@enabled_for_syncmgr = N'False',
@frequency_type = 64,
@frequency_interval = 0,
@frequency_relative_interval = 0,
@frequency_recurrence_factor = 0,
@frequency_subday = 0,
@frequency_subday_interval = 0,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 0,
@active_end_date = 0,
@alt_snapshot_folder = N'',
@working_directory = N'',
@use_ftp = N'False',
@job_login = null,
@job_password = null,
@publication_type = 0
GO
/****** End: Script to be run at Subscriber ******/
繰り返しますが、奇妙なことに、create index ステートメントがコメント アウトされている場合でもパブリケーションに同じエラーが含まれますが、それを完全に削除すると機能します。
今のところ、これらの create index ステートメントを含むすべてのストアド プロシージャをパブリケーションから削除しましたが、これらをサブスクライバにレプリケートして、プロシージャに対する DDL の更新がサブスクライバに自動的に反映されるようにしたいと考えています。
- 編集 -
スナップショット ディレクトリを見ると、usp_Test の .sch ファイルには、ストアド プロシージャについて以前に投稿したものとまったく同じコード ブロックが含まれています。返されたエラーに基づいて、スナップショット エージェントは、作成インデックスが含まれていますが、続行して GRANT EXECUTE コマンドを実行しようとすると、エラーが発生します。
また、SQL Server の正確なバージョンは次のとおりです。
Microsoft SQL Server 2005 - 9.00.5254.00 (2005 + SP4 累積更新プログラム 1)
-- 編集終了 --
私の質問は、なぜこれが起こっているのですか?パブリケーションまたはサブスクリプションの構成に問題はありますか? 他の誰かがこのようなことを経験したように? この問題のトラブルシューティングはどこから始めればよいですか?
- アップデート -
私は technet で Hilary Cotter と話をしていますが、まだうまくいきません。プロシージャの GRANT EXECUTE 権限を削除すると、CREATE INDEX で正常に作成されます。そのため、GRANT EXECUTE OR CREATE INDEX では機能しますが、両方では機能しません。ヒラリーは、スナップショットにこれらの両方のキーワードが含まれている場合、スナップショットが正しく転送されないのは、ドメイン内のある種のスパム アプライアンスである可能性があると示唆しましたが、手動で .sch ファイルをサブスクライバーにコピーし、期待される内容が含まれていることを検証すると、コマンドを実行しても、同じ問題が発生します。