0

私はSQL Server 2012とその中でトランザクションレプリケーションを使用しています。アクセス許可に特定のデータベース ロールが関連付けられているビューをレプリケートしようとしています。これは、ビューの複製スクリプトです

:setvar SubscriberDB "ReplicationSubscriberDB"
:setvar SubscriberServerName "HYDHTC0131320D\MSSQLSERVER2"
:setvar PublisherDB "PublisherDB"
:setvar PublisherServerName "HYDHTC0131320D"
:setvar ReplicationAccount "myusername"
:setvar ReplicationAccountPassword "mypassword"

GO
:on error exit
GO

exec sp_addpublication @publication = N'DepartmentsView', @description = N'Transactional publication of database from Publisher ''$(PublisherServerName)''.', @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',  @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'true', @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
exec sp_addpublication_snapshot @publication = N'DepartmentsView', @frequency_type = 1, @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, @job_login = N'$(ReplicationAccount)', @job_password = '$(ReplicationAccountPassword)', @publisher_security_mode = 1
GO


exec sp_addarticle @publication = N'DepartmentsView', @article = N'vwDepartments', @source_owner = N'dbo', @source_object = N'vwDepartments', @type = N'view schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x48000001, @destination_table = N'vwDepartments', @destination_owner = N'dbo'
GO

EXEC sp_startpublication_snapshot @publication = N'DepartmentsView'
GO


use [$(PublisherDB)]
GO
exec sp_addsubscription @publication = N'DepartmentsView', @subscriber = N'$(SubscriberServerName)', @destination_db = N'$(SubscriberDB)', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0
GO

exec sp_addpushsubscription_agent @publication = N'DepartmentsView', @subscriber = N'$(SubscriberServerName)', @subscriber_db = N'$(SubscriberDB)', @job_login = N'$(ReplicationAccount)', @job_password = '$(ReplicationAccountPassword)', @subscriber_security_mode = 1, @frequency_type = 4, @frequency_interval = 1, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 8, @frequency_subday_interval = 6, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 20120607, @active_end_date = 99991231, @enabled_for_syncmgr = N'False', @dts_package_location = N'Distributor'
GO

複製後、ビューは作成されますが、ロールはビューの権限に関連付けられません。このロールは、パブリッシャー データベースとサブスクライバー データベースの両方に存在します。このロールはビューで使用されるテーブルに割り当てられ、テーブルは両方のデータベースに存在します。

schema_option を 0x48000001 に設定してみました。

  1. オブジェクト作成スクリプト (CREATE TABLE、CREATE PROCEDURE など) を生成します。この値は、ストアド プロシージャ アーティクルの既定値です。
  2. サブスクライバーにまだ存在しないスキーマを作成します。
  3. 権限をレプリケートします。

私はこの投稿、http://social.msdn.microsoft.com/Forums/en-US/sqlreplication/thread/a4fa2d32-00ea-47a7-9276-52764fab72ae/にも目を通しました。または、sp_addpublication で @post_snapshot_script を使用する必要があります。

@post_snapshot_script を試してみましたが、動作していますが、このアプローチは使いたくありません。

この問題を解決する方法を教えてください。

前もって感謝します。

4

2 に答える 2

0

これは、SQL Server 2012 の既知の問題です。この問題は、スナップショット エージェントのバグが原因で発生します。Microsoft がこの問題の修正をリリースするまでの間、回避策があります。 1. スナップショット フォルダを開きます。2. 必要な権限を追加して、ビューの .sch ファイルを編集します。

その後、サブスクライバーは正しいスナップショットを取得できます。

于 2012-12-19T18:37:17.843 に答える