home *** CD-ROM | disk | FTP | other *** search
/ 95.86.62.111 / 95.86.62.111.tar / 95.86.62.111 / sql2000 / INSTALL / replcom.sql < prev    next >
Text File  |  2000-07-07  |  431KB  |  12,994 lines

  1. /*
  2. ** replcom.sql            1997/02/12 22:03
  3. **
  4. **
  5. ** Copyright Microsoft, Inc. 1998-2000
  6. ** All Rights Reserved.
  7. */
  8.  
  9.  
  10. dump tran master with no_log
  11. go
  12.  
  13. exec dbo.sp_configure 'update',1
  14. go
  15. reconfigure with override
  16. go
  17.  
  18. set ANSI_NULLS off
  19. go
  20.  
  21. use master
  22. go
  23.  
  24. exec dbo.sp_MS_upd_sysobj_category 1 --Capture time for use at the end
  25. go
  26.  
  27.  
  28. dump tran master with no_log
  29. GO
  30.  
  31. /* 
  32. ** Drop the stored procedures in this script using the old dropping SP 
  33. ** and then drop itself
  34. */
  35. if exists (select * from sysobjects
  36.     where type = 'P'
  37.             and name = 'sp_MSdrop_replcom')
  38. begin
  39.     drop procedure sp_MSdrop_replcom
  40. end
  41.  
  42. /*
  43. ** Create stored procedures to drop the stored procedures
  44. ** created by this script
  45. */
  46.  
  47. raiserror('Creating procedure sp_MSdrop_replcom', 0,1)
  48. GO
  49.  
  50. create procedure sp_MSdrop_replcom
  51. as
  52.     if exists (select * from sysobjects 
  53.         where type = 'P'
  54.             and name = 'sp_MScreate_distributor_tables')
  55.         drop procedure sp_MScreate_distributor_tables
  56.  
  57.     if exists (select * from sysobjects
  58.         where type = 'P'
  59.                 and name = 'sp_MSIfExistsRemoteLogin')
  60.         drop procedure sp_MSIfExistsRemoteLogin
  61.  
  62.     if exists (select * from sysobjects
  63.         where type = 'P'
  64.                 and name = 'sp_helppublicationsync')
  65.         drop procedure sp_helppublicationsync
  66.  
  67.     if exists (select * from sysobjects
  68.             where type = 'P'
  69.                 and name = 'sp_addpublication_snapshot')
  70.         drop procedure sp_addpublication_snapshot
  71.  
  72.     if exists (select * from sysobjects
  73.             where type = 'P'
  74.                 and name = 'sp_MShelpobjectpublications')
  75.         drop procedure sp_MShelpobjectpublications
  76.  
  77.     if exists (select * from sysobjects
  78.             where type = 'P'
  79.                 and name = 'sp_addpublisher')
  80.         drop procedure sp_addpublisher
  81.  
  82.     if exists (select * from sysobjects
  83.             where type = 'P'
  84.                 and name = 'sp_addsubscriber')
  85.         drop procedure sp_addsubscriber
  86.  
  87.     if exists (select * from sysobjects
  88.             where type = 'P'
  89.                 and name = 'sp_addsubscriber_schedule')
  90.         drop procedure sp_addsubscriber_schedule
  91.  
  92.     if exists (select * from sysobjects
  93.             where type = 'P'
  94.                 and name = 'sp_changesubscriber_schedule')
  95.         drop procedure sp_changesubscriber_schedule
  96.  
  97.     if exists (select * from sysobjects
  98.             where type = 'P'
  99.                 and name = 'sp_changesubscriber')
  100.         drop procedure sp_changesubscriber
  101.  
  102.     IF EXISTS (SELECT * FROM sysobjects
  103.             WHERE type = 'P'
  104.                 AND name = 'sp_MScreate_dist_tables')
  105.         DROP PROCEDURE sp_MScreate_dist_tables
  106.  
  107.     if exists (select * from sysobjects
  108.             where type = 'P'
  109.                 and name = 'sp_distcounters')
  110.         drop procedure sp_distcounters
  111.  
  112.  
  113.     if exists (select * from sysobjects
  114.             where type = 'P'
  115.                 and name = 'sp_droppublisher')
  116.         drop procedure sp_droppublisher
  117.  
  118.     if exists (select * from sysobjects
  119.             where type = 'P'
  120.                 and name = 'sp_dropsubscriber')
  121.         drop procedure sp_dropsubscriber
  122.  
  123.     if exists (select * from sysobjects
  124.             where type = 'P'
  125.                 and name = 'sp_dsninfo')
  126.         drop procedure sp_dsninfo
  127.  
  128.     if exists (select * from sysobjects
  129.             where type = 'P'
  130.                 and name = 'sp_enumdsn')
  131.         drop procedure sp_enumdsn
  132.  
  133.     if exists (select * from sysobjects
  134.             where type = 'P'
  135.                 and name = 'sp_helpdistributor')
  136.         drop procedure sp_helpdistributor
  137.  
  138.     if exists (select * from sysobjects
  139.             where type = 'P'
  140.                 and name = 'sp_helppublicationsync')    /* Remove old version */
  141.         drop procedure sp_helppublicationsync
  142.  
  143.     if exists (select * from sysobjects
  144.             where type = 'P'
  145.                 and name = 'sp_helpreplicationdb')
  146.         drop procedure sp_helpreplicationdb
  147.  
  148.     if exists (select * from sysobjects
  149.             where type = 'P'
  150.                 and name = 'sp_helpsubscriberinfo')
  151.         drop procedure sp_helpsubscriberinfo
  152.  
  153.     if exists (select * from sysobjects
  154.             where type = 'P'
  155.                 and name = 'sp_publishdb')
  156.         drop procedure sp_publishdb
  157.  
  158.     if exists (select * from sysobjects
  159.             where type = 'P'
  160.                 and name = 'sp_replica')
  161.         drop procedure sp_replica
  162.  
  163.     if exists (select * from sysobjects
  164.             where type = 'P'
  165.                 and name = 'sp_adddistributiondb')
  166.         drop procedure sp_adddistributiondb
  167.  
  168.     if exists (select * from sysobjects
  169.             where type = 'P'
  170.                 and name = 'sp_changedistributiondb')
  171.         drop procedure sp_changedistributiondb
  172.  
  173.     if exists (select * from sysobjects
  174.             where type = 'P'
  175.                 and name = 'sp_helpdistributiondb')
  176.         drop procedure sp_helpdistributiondb
  177.  
  178.     if exists (select * from sysobjects
  179.             where type = 'P'
  180.                 and name = 'sp_dropdistributiondb')
  181.         drop procedure sp_dropdistributiondb
  182.  
  183.     if exists (select * from sysobjects
  184.             where type = 'P'
  185.                 and name = 'sp_adddistpublisher')
  186.         drop procedure sp_adddistpublisher
  187.  
  188.     if exists (select * from sysobjects
  189.             where type = 'P'
  190.                 and name = 'sp_changedistpublisher')
  191.         drop procedure sp_changedistpublisher
  192.  
  193.     if exists (select * from sysobjects
  194.             where type = 'P'
  195.                 and name = 'sp_helpdistpublisher')
  196.         drop procedure sp_helpdistpublisher
  197.  
  198.     if exists (select * from sysobjects
  199.             where type = 'P'
  200.                 and name = 'sp_dropdistpublisher')
  201.         drop procedure sp_dropdistpublisher
  202.  
  203.     if exists (select * from sysobjects
  204.             where type = 'P'
  205.                 and name = 'sp_MSadd_distributor_alerts_and_responses')
  206.         drop procedure  sp_MSadd_distributor_alerts_and_responses
  207.  
  208.     if exists (select * from sysobjects
  209.             where type = 'P'
  210.                 and name = 'sp_MSdrop_distributor_alerts_and_responses')
  211.         drop procedure  sp_MSdrop_distributor_alerts_and_responses
  212.  
  213.     if exists (select * from sysobjects
  214.             where type = 'P'
  215.                 and name = 'sp_adddistributor')
  216.         drop procedure  sp_adddistributor
  217.  
  218.     if exists (select * from sysobjects
  219.             where type = 'P'
  220.                 and name = 'sp_dropdistributor')
  221.         drop procedure sp_dropdistributor
  222.  
  223.     if exists (select * from sysobjects
  224.             where type = 'P'
  225.                 and name = 'sp_changedistributor_property')
  226.         drop procedure sp_changedistributor_property
  227.  
  228.     if exists (select * from sysobjects
  229.             where type = 'P'
  230.                 and name = 'sp_helpdistributor_properties')
  231.         drop procedure sp_helpdistributor_properties
  232.  
  233.     if exists (select * from sysobjects
  234.             where type = 'X'
  235.                 and name = 'sp_repldone')
  236.         exec dbo.sp_dropextendedproc 'sp_repldone'
  237.  
  238.     if exists (select * from sysobjects
  239.             where type = 'X'
  240.                 and name = 'sp_repltrans')
  241.         exec dbo.sp_dropextendedproc 'sp_repltrans'
  242.  
  243.     if exists (select * from sysobjects
  244.             where type = 'X'
  245.                 and name = 'sp_replcmds')
  246.         exec dbo.sp_dropextendedproc 'sp_replcmds'
  247.  
  248.     if exists (select * from sysobjects
  249.             where type = 'X'
  250.                 and name = 'sp_replcounters')
  251.         exec dbo.sp_dropextendedproc 'sp_replcounters'
  252.  
  253.     if exists (select * from sysobjects
  254.             where type = 'X'
  255.                 and name = 'sp_replflush')
  256.         exec dbo.sp_dropextendedproc 'sp_replflush'
  257.  
  258.     if exists (select * from sysobjects
  259.             where type = 'X'
  260.                  and name = 'sp_replpostcmd' )
  261.         exec dbo.sp_dropextendedproc 'sp_replpostcmd'
  262.  
  263.     if exists (select * from sysobjects
  264.             where type = 'X'
  265.                  and name = 'sp_replpostschema' )
  266.         exec dbo.sp_dropextendedproc 'sp_replpostschema'
  267.  
  268.     if exists (select * from sysobjects
  269.             where type = 'X'
  270.                  and name = 'sp_replincrementlsn' )
  271.         exec dbo.sp_dropextendedproc 'sp_replincrementlsn'
  272.  
  273.     if exists (select * from sysobjects
  274.             where type = 'X'
  275.                  and name = 'sp_replupdateschema' )
  276.         exec dbo.sp_dropextendedproc 'sp_replupdateschema'
  277.  
  278.     if exists (select * from sysobjects
  279.             where type = 'X'
  280.                  and name = 'sp_replsetoriginator' )
  281.         exec dbo.sp_dropextendedproc 'sp_replsetoriginator'
  282.  
  283.     if exists (select * from sysobjects
  284.             where type = 'X'
  285.                  and name = 'sp_replsetsyncstatus' )
  286.         exec dbo.sp_dropextendedproc 'sp_replsetsyncstatus'
  287.  
  288.     if exists (select * from sysobjects
  289.             where type = 'X'
  290.                  and name = 'sp_replpostsyncstatus' )
  291.         exec dbo.sp_dropextendedproc 'sp_replpostsyncstatus'
  292.  
  293.     if exists (select * from sysobjects
  294.             where type = 'X'
  295.                 and name = 'xp_enumdsn')
  296.         exec dbo.sp_dropextendedproc 'xp_enumdsn'
  297.  
  298.     if exists (select * from sysobjects
  299.             where type = 'X'
  300.                 and name = 'xp_oledbinfo')
  301.         exec dbo.sp_dropextendedproc 'xp_oledbinfo'
  302.  
  303.     if exists (select * from sysobjects
  304.             where type = 'X'
  305.                 and name = 'xp_dsninfo')
  306.         exec dbo.sp_dropextendedproc 'xp_dsninfo'
  307.  
  308.     if exists (select * from sysobjects
  309.             where type = 'X'
  310.                 and name = 'xp_repl_encrypt')
  311.         exec dbo.sp_dropextendedproc 'xp_repl_encrypt'
  312.  
  313.     if exists (select * from sysobjects
  314.             where type = 'X'
  315.                 and name = 'xp_repl_convert_encrypt')
  316.         exec dbo.sp_dropextendedproc 'xp_repl_convert_encrypt'
  317.  
  318.     if exists (select * from sysobjects
  319.             where type = 'X'
  320.                 and name = 'xp_repl_help_connect')
  321.         exec dbo.sp_dropextendedproc 'xp_repl_help_connect'
  322.  
  323.      if exists (select * from sysobjects
  324.             where type = 'X'
  325.                 and name = 'xp_replproberemsrv')
  326.         exec dbo.sp_dropextendedproc 'xp_replproberemsrv'
  327.  
  328.     -- sp_helpsubscriber is removed permanently from the system.
  329.     if exists (select * from sysobjects
  330.         where type = 'P'
  331.                 and name = 'sp_helpsubscriber')
  332.         drop procedure sp_helpsubscriber
  333.  
  334.     -- sp_MSrepl_encrypt obsolete; use xp_repl_encrypt
  335.     if exists (select * from sysobjects
  336.         where type = 'P'
  337.                 and name = 'sp_MSrepl_encrypt')
  338.         drop procedure sp_MSrepl_encrypt
  339.  
  340.     if exists (select * from sysobjects 
  341.         where name = 'sp_add_agent_profile' 
  342.                 and type = 'P')
  343.         drop procedure sp_add_agent_profile
  344.  
  345.     if exists (select * from sysobjects 
  346.         where name = 'sp_help_agent_profile' 
  347.                 and type = 'P')
  348.         drop procedure sp_help_agent_profile
  349.  
  350.     if exists (select * from sysobjects 
  351.         where name = 'sp_help_agent_default' 
  352.             and type = 'P')
  353.         drop procedure sp_help_agent_default
  354.  
  355.     if exists (select * from sysobjects 
  356.         where name = 'sp_drop_agent_profile' 
  357.                 and type = 'P')
  358.         drop procedure sp_drop_agent_profile
  359.  
  360.     if exists (select name from sysobjects 
  361.         where name = 'sp_MSupdate_agenttype_default'
  362.                 and type = 'P')
  363.         drop procedure sp_MSupdate_agenttype_default
  364.  
  365.     if exists (select * from sysobjects 
  366.         where name = 'sp_MSvalidate_agent_parameter' 
  367.                 and type = 'P')
  368.         drop procedure sp_MSvalidate_agent_parameter
  369.  
  370.     if exists (select * from sysobjects 
  371.         where name = 'sp_add_agent_parameter' 
  372.                 and type = 'P')
  373.         drop procedure sp_add_agent_parameter
  374.  
  375.     if exists (select * from sysobjects 
  376.         where name = 'sp_generate_agent_parameter' 
  377.                 and type = 'P')
  378.         drop procedure sp_generate_agent_parameter
  379.  
  380.     if exists (select * from sysobjects 
  381.         where name = 'sp_change_agent_parameter' 
  382.                 and type = 'P')
  383.         drop procedure sp_change_agent_parameter
  384.  
  385.     if exists (select * from sysobjects 
  386.         where name = 'sp_change_agent_profile' 
  387.                 and type = 'P')
  388.         drop procedure sp_change_agent_profile
  389.  
  390.     if exists (select * from sysobjects 
  391.         where name = 'sp_help_agent_parameter' 
  392.                 and type = 'P')
  393.       drop procedure sp_help_agent_parameter
  394.  
  395.     if exists (select * from sysobjects 
  396.         where name = 'sp_drop_agent_parameter' 
  397.                 and type = 'P')
  398.       drop procedure sp_drop_agent_parameter
  399.  
  400.     if exists (select * from sysobjects 
  401.         where name = 'sp_MShelp_distdb' 
  402.                 and type = 'P')
  403.       drop procedure sp_MShelp_distdb
  404.  
  405.     if exists (select * from sysobjects 
  406.         where name = 'sp_MShelp_distdb' 
  407.                 and type = 'P')
  408.       drop procedure sp_MShelp_distdb
  409.  
  410.     if exists (select * from sysobjects 
  411.         where name = 'sp_MSenum_misc_agents'
  412.                 and type = 'P')
  413.       drop procedure sp_MSenum_misc_agents
  414.  
  415.     if exists (select * from sysobjects 
  416.         where name = 'sp_MSupdate_replication_status' 
  417.                 and type = 'P')
  418.       drop procedure sp_MSupdate_replication_status
  419.  
  420.     if exists (select * from sysobjects 
  421.         where name = 'sp_MSload_replication_status' 
  422.                 and type = 'P')
  423.       drop procedure sp_MSload_replication_status
  424.  
  425.     if exists (select * from sysobjects 
  426.         where name = 'sp_MScreate_replication_status_table' 
  427.                 and type = 'P')
  428.       drop procedure sp_MScreate_replication_status_table
  429.  
  430.     if exists (select * from sysobjects 
  431.         where name = 'sp_MShelp_replication_status' 
  432.                 and type = 'P')
  433.       drop procedure sp_MShelp_replication_status
  434.  
  435.     if exists (select * from sysobjects 
  436.         where name = 'sp_MSenum_replication_agents' 
  437.                 and type = 'P')
  438.       drop procedure sp_MSenum_replication_agents
  439.  
  440.     if exists (select * from sysobjects 
  441.         where name = 'sp_replication_agent_checkup' 
  442.                 and type = 'P')
  443.       drop procedure sp_replication_agent_checkup
  444.  
  445.     if exists (select * from sysobjects 
  446.         where name = 'sp_MSreplrole' 
  447.                 and type = 'P')
  448.       drop procedure sp_MSreplrole
  449.  
  450.     if exists (select * from sysobjects 
  451.         where name = 'sp_MScreate_replication_checkup_agent' 
  452.                 and type = 'P')
  453.       drop procedure sp_MScreate_replication_checkup_agent
  454.  
  455.     if exists (select * from sysobjects 
  456.         where name = 'sp_MSenum_replication_job' 
  457.                 and type = 'P')
  458.       drop procedure sp_MSenum_replication_job
  459.  
  460.     if exists (select * from sysobjects 
  461.         where name = 'sp_MSrepl_dbrole' 
  462.                 and type = 'P')
  463.       drop procedure sp_MSrepl_dbrole
  464.  
  465.     if exists (select * from sysobjects
  466.         where type = 'P'
  467.                 and name = 'sp_oledbinfo')
  468.         drop procedure sp_oledbinfo
  469.  
  470.     if exists (select * from sysobjects
  471.         where type = 'P'
  472.                 and name = 'sp_enumoledbdatasources')
  473.         drop procedure sp_enumoledbdatasources
  474.  
  475.     if exists (select * from sysobjects
  476.         where type = 'P'
  477.                 and name = 'sp_MSget_oledbinfo')
  478.         drop procedure sp_MSget_oledbinfo
  479.  
  480.     if exists (select * from sysobjects 
  481.         where name = 'sp_changedistributor_password' 
  482.                 and type = 'P')
  483.       drop procedure sp_changedistributor_password
  484.  
  485.     if exists (select * from sysobjects 
  486.         where name = 'sp_grant_publication_access' 
  487.                 and type = 'P')
  488.       drop procedure sp_grant_publication_access
  489.  
  490.     if exists (select * from sysobjects 
  491.         where name = 'sp_revoke_publication_access' 
  492.                 and type = 'P')
  493.       drop procedure sp_revoke_publication_access
  494.  
  495.     if exists (select * from sysobjects 
  496.         where name = 'sp_help_publication_access' 
  497.                 and type = 'P')
  498.       drop procedure sp_help_publication_access
  499.  
  500.     if exists (select * from sysobjects 
  501.         where name = 'sp_check_publication_access' 
  502.                 and type = 'P')
  503.       drop procedure sp_check_publication_access
  504.  
  505.     if exists (select * from sysobjects 
  506.         where name = 'sp_MSinit_replication_perfmon' 
  507.                 and type = 'P')
  508.       drop procedure sp_MSinit_replication_perfmon
  509.  
  510.     if exists (select * from sysobjects 
  511.         where name = 'sp_MSrepl_startup' 
  512.                 and type = 'P')
  513.       drop procedure sp_MSrepl_startup
  514.  
  515.     if exists (select * from sysobjects 
  516.         where name = 'sp_MSflush_access_cache' 
  517.                 and type = 'P')
  518.       drop procedure sp_MSflush_access_cache
  519.  
  520.     if exists (select * from sysobjects 
  521.         where name = 'sp_MSreinit_failed_subscriptions' 
  522.                 and type = 'P')
  523.       drop procedure sp_MSreinit_failed_subscriptions
  524.  
  525.     if exists (select * from sysobjects 
  526.         where name = 'sp_add_datatype_mapping' 
  527.                 and type = 'P')
  528.         drop procedure sp_add_datatype_mapping
  529.     
  530.     if exists (select * from sysobjects 
  531.         where name = 'sp_help_datatype_mapping' 
  532.                 and type = 'P')
  533.         drop procedure sp_help_datatype_mapping
  534.  
  535.     if exists (select * from sysobjects 
  536.         where name = 'sp_MSrepl_gettype_mappings' 
  537.                 and type = 'P')
  538.         drop procedure sp_MSrepl_gettype_mappings
  539.         
  540.     if exists (select * from sysobjects 
  541.         where name = 'sp_MSfix_6x_tasks' 
  542.                 and type = 'P')
  543.         drop procedure sp_MSfix_6x_tasks
  544.  
  545.     if exists (select * from sysobjects 
  546.         where name = 'sp_MSget_agent_names' 
  547.                 and type = 'P')
  548.         drop procedure sp_MSget_agent_names
  549.  
  550.     -- Common conflict viewer support procs
  551.     if exists (select * from sysobjects
  552.             where type = 'P'
  553.                 and name = 'sp_MShelpconflictpublications')
  554.         drop procedure sp_MShelpconflictpublications
  555.  
  556.     -- Procs for managing dynamic snapshot views
  557.     if exists (select * from sysobjects
  558.             where type = 'P'
  559.                 and name = 'sp_MScleanupdynsnapshotvws')
  560.         drop procedure sp_MScleanupdynsnapshotvws
  561.  
  562.     if exists (select * from sysobjects
  563.             where type = 'P'
  564.                 and name = 'sp_MScleanupmergepublisher')
  565.         drop procedure sp_MScleanupmergepublisher
  566.  
  567.     if exists (select * from sysobjects
  568.             where type = 'P'
  569.                 and name = 'sp_MScleanupmergepublisherdb')
  570.         drop procedure sp_MScleanupmergepublisherdb
  571.     
  572.     if exists (select * from sysobjects
  573.             where type = 'P'
  574.                 and name = 'sp_MShelp_replication_table')
  575.         drop procedure sp_MShelp_replication_table
  576.     if exists (select * from sysobjects
  577.             where type = 'P'
  578.                 and name = 'sp_MScopyscriptfile')
  579.         drop procedure sp_MScopyscriptfile
  580.  
  581.     if exists (select * from sysobjects
  582.             where type = 'FN'
  583.                 and name = 'fn_replgetagentcommandlinefromjobid')
  584.         drop function system_function_schema.fn_replgetagentcommandlinefromjobid
  585.     
  586.     if exists (select * from sysobjects
  587.             where type = 'P'
  588.                 and name = 'sp_replproberemoteserver')
  589.         drop procedure sp_replproberemoteserver
  590.  
  591.     if exists (select * from sysobjects
  592.             where type = 'FN'
  593.                 and name = 'fn_getpersistedservernamecasevariation'
  594.                 and user_id('system_function_schema') = uid)
  595.         drop function system_function_schema.fn_getpersistedservernamecasevariation
  596.  
  597. GO
  598.  
  599. /* 
  600. **  We must execute dbo.sp_MSdrop_replcom here since sp_MSdrop_replcom may not exist
  601. **  before this script is applied and it is possible
  602. **  that some replication sps are left. (We ignore error when dropping
  603. **  the replication so it is possible sp_MSdrop_replcom is dropped but
  604. **  some replication sps were left).
  605. */
  606. exec dbo.sp_MSdrop_replcom
  607. go
  608.  
  609. raiserror('Creating procedure sp_MScreate_distributor_tables', 0,1)
  610. GO
  611.  
  612. create procedure sp_MScreate_distributor_tables
  613. as
  614.     declare @profile_id     int
  615.     declare @retcode    int
  616.     declare @profile_name nvarchar(100)
  617.     declare @profile_desc nvarchar(100)
  618.  
  619.     /* Create MSpublishers table */
  620.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'MSdistpublishers'
  621.         and xtype = 'U')
  622.     begin
  623.         DROP TABLE msdb..MSdistpublishers
  624.         if @@error<> 0 goto FAILURE
  625.     end
  626.  
  627.     /* Create MSdistributiondbs table */
  628.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'MSdistributiondbs'
  629.         and xtype = 'U')
  630.     begin
  631.         DROP TABLE msdb..MSdistributiondbs
  632.         if @@error<> 0 goto FAILURE
  633.     end
  634.  
  635.     /* create MSdistributor table */
  636.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'MSdistributor'
  637.         and xtype = 'U')
  638.     begin
  639.         DROP TABLE msdb..MSdistributor
  640.         if @@error<> 0 goto FAILURE
  641.     end
  642.  
  643.     /* create sysreplicationalerts table */
  644.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'sysreplicationalerts'
  645.         and xtype = 'U')
  646.     begin
  647.         DROP TABLE msdb..sysreplicationalerts
  648.         if @@error<> 0 goto FAILURE
  649.     end
  650.     
  651.     /* create MSagent_profiles table */
  652.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'MSagent_profiles'
  653.         and xtype = 'U')
  654.     begin
  655.         DROP TABLE msdb..MSagent_profiles
  656.         if @@error<> 0 goto FAILURE
  657.     end
  658.  
  659.     /* create MSagent_parameters table */
  660.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'MSagent_parameters' 
  661.         and xtype = 'U')
  662.     begin
  663.         DROP TABLE msdb..MSagent_parameters
  664.         if @@error<> 0 goto FAILURE
  665.     end
  666.  
  667.     /* create MSdatatype_mappings table */
  668.     IF EXISTS (SELECT * FROM msdb..sysobjects WHERE name = 'MSdatatype_mappings' 
  669.         and xtype = 'U')
  670.     begin
  671.         DROP TABLE msdb..MSdatatype_mappings
  672.         if @@error<> 0 goto FAILURE
  673.     end
  674.  
  675.     
  676.     CREATE TABLE msdb.dbo.MSdistpublishers
  677.     (
  678.         name                sysname     NOT NULL,
  679.         distribution_db     sysname     NOT NULL,
  680.         working_directory   nvarchar(255) NOT NULL,
  681.         security_mode       int         NOT NULL,
  682.         login               sysname     NOT NULL,
  683.         password            nvarchar(524) NULL,
  684.         active              bit         NOT NULL,
  685.         trusted             bit         NOT NULL,
  686.         thirdparty_flag     bit         NOT NULL
  687.     )
  688.     if @@error<> 0 goto FAILURE
  689.  
  690.     CREATE UNIQUE CLUSTERED INDEX uc1MSdistpublishers 
  691.         ON msdb.dbo.MSdistpublishers(name)
  692.     if @@error<> 0 goto FAILURE
  693.  
  694.  
  695.     CREATE TABLE msdb.dbo.MSdistributiondbs
  696.     (
  697.         name            sysname     NOT NULL,
  698.         min_distretention   int     NOT NULL,
  699.         max_distretention   int     NOT NULL,
  700.         history_retention   int     NOT NULL
  701.     )
  702.     if @@error<> 0 goto FAILURE
  703.  
  704.     CREATE UNIQUE CLUSTERED INDEX uc1MSdistributiondbs 
  705.             ON msdb.dbo.MSdistributiondbs(name)
  706.     if @@error<> 0 goto FAILURE
  707.  
  708.  
  709.  
  710.     CREATE TABLE msdb.dbo.MSdistributor 
  711.     ( 
  712.         property        sysname     NOT NULL, 
  713.         value           nvarchar(3000)  NULL
  714.     )
  715.     if @@error<> 0 goto FAILURE
  716.     
  717.     CREATE UNIQUE CLUSTERED INDEX uc1MSdistributor 
  718.             ON msdb.dbo.MSdistributor(property)
  719.     if @@error<> 0 goto FAILURE
  720.  
  721.     CREATE TABLE msdb.dbo.sysreplicationalerts
  722.     (
  723.         alert_id            int identity(1,1) NOT NULL,
  724.         status              int NOT NULL,
  725.         agent_type          int NULL,
  726.         agent_id            int NULL,
  727.         error_id            int NULL,
  728.         alert_error_code    int NULL,
  729.         time                datetime NOT NULL,
  730.         publisher           sysname NULL,
  731.         publisher_db        sysname NULL,
  732.         publication         sysname NULL,
  733.         publication_type    int NULL,
  734.         subscriber          sysname NULL,
  735.         subscriber_db       sysname NULL,
  736.         article             sysname NULL,
  737.         destination_object  sysname NULL,
  738.         source_object       sysname NULL,
  739.         alert_error_text    ntext NULL
  740.     )
  741.     if @@error<> 0 goto FAILURE
  742.  
  743.     CREATE UNIQUE CLUSTERED INDEX ucsysreplicationalerts ON msdb.dbo.sysreplicationalerts(alert_id)
  744.     if @@error<> 0 goto FAILURE
  745.  
  746.     CREATE TABLE msdb.dbo.MSagent_profiles
  747.     (
  748.         profile_id    int           NOT NULL IDENTITY,
  749.         profile_name  sysname       NOT NULL,
  750.         agent_type          int             NOT NULL, -- 1-Snapshot, 2-Logreader,
  751.                                                       -- 3-Distribution, 4-Merge,
  752.                                                       -- 9-Qreader
  753.         type                int             NOT NULL, -- 0-System, 1-Custom
  754.         description         nvarchar(3000)  NULL,
  755.         def_profile   bit               NOT NULL
  756.     )
  757.     if @@error<> 0 goto FAILURE
  758.  
  759.  
  760.     CREATE UNIQUE CLUSTERED INDEX ucMSagent_profiles ON msdb.dbo.MSagent_profiles
  761.         (profile_name, profile_id, agent_type)
  762.     if @@error<> 0 goto FAILURE
  763.  
  764.     CREATE TABLE msdb.dbo.MSagent_parameters
  765.     (
  766.         profile_id     int          NOT NULL,
  767.         parameter_name       sysname        NOT NULL,
  768.         value                nvarchar(255)  NOT NULL
  769.     )
  770.     if @@error<> 0 goto FAILURE
  771.  
  772.     CREATE UNIQUE CLUSTERED INDEX ucMSagent_parameters ON msdb.dbo.MSagent_parameters
  773.         (parameter_name, profile_id)
  774.     if @@error<> 0 goto FAILURE
  775.  
  776.     /* 
  777.     ** Create default / non default profiles 
  778.     ** for all the agents 
  779.     */
  780.  
  781.     /* 
  782.     ** Snapshot agent 
  783.     */
  784.     set @profile_id = NULL
  785.     set @profile_name = formatmessage(20545) -- Default Snapshot Profile
  786.     set @profile_desc = NULL
  787.  
  788.     exec @retcode = dbo.sp_add_agent_profile
  789.             @profile_id = @profile_id OUT,
  790.             @profile_name = @profile_name,
  791.             @agent_type = 1,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  792.             @profile_type = 0,   -- 0-System, 1-Custom 
  793.             @description = @profile_desc,
  794.             @default = 1
  795.     if (@retcode = 1 or @@ERROR <> 0)
  796.         goto FAILURE
  797.  
  798.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  799.     if (@retcode = 1 or @@ERROR <> 0)
  800.         goto FAILURE
  801.  
  802.     /* 
  803.     ** Logreader agent 
  804.     */
  805.     set @profile_id = NULL
  806.     set @profile_name = formatmessage(20545) -- Default LogReader Profile
  807.     set @profile_desc = NULL
  808.  
  809.     exec @retcode = dbo.sp_add_agent_profile
  810.             @profile_id = @profile_id OUT,
  811.             @profile_name = @profile_name,
  812.             @agent_type = 2,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  813.             @profile_type = 0,   -- 0-System, 1-Custom 
  814.             @description = @profile_desc,
  815.             @default = 1
  816.     if (@retcode = 1 or @@ERROR <> 0)
  817.         goto FAILURE
  818.  
  819.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  820.     if (@retcode = 1 or @@ERROR <> 0)
  821.         goto FAILURE
  822.  
  823.     /* 
  824.     ** Logreader agent - Verbose History Profile
  825.     */
  826.     set @profile_id = NULL
  827.     set @profile_name = formatmessage(20546) -- LogReader Verbose History Profile
  828.     set @profile_desc = formatmessage(20547)
  829.  
  830.     exec @retcode = dbo.sp_add_agent_profile
  831.             @profile_id = @profile_id OUT,
  832.             @profile_name = @profile_name,
  833.             @agent_type = 2,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  834.             @profile_type = 0,   -- 0-System, 1-Custom 
  835.             @description = @profile_desc,
  836.             @default = 0
  837.     if (@retcode = 1 or @@ERROR <> 0)
  838.         goto FAILURE
  839.  
  840.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  841.     if (@retcode = 1 or @@ERROR <> 0)
  842.         goto FAILURE
  843.  
  844.     /* 
  845.     ** Distribution agent 
  846.     */
  847.     set @profile_id = NULL
  848.     set @profile_name = formatmessage(20545) -- Default Distribution Profile
  849.     set @profile_desc = NULL
  850.  
  851.     exec @retcode = dbo.sp_add_agent_profile
  852.             @profile_id = @profile_id OUT,
  853.             @profile_name = @profile_name,
  854.             @agent_type = 3,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  855.             @profile_type = 0,   -- 0-System, 1-Custom 
  856.             @description = @profile_desc,
  857.             @default = 1
  858.     if (@retcode = 1 or @@ERROR <> 0)
  859.         goto FAILURE
  860.  
  861.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  862.     if (@retcode = 1 or @@ERROR <> 0)
  863.         goto FAILURE
  864.  
  865.     /*
  866.     ** Distribution Agent Verbose History Profile
  867.     */
  868.     set @profile_id = NULL
  869.     set @profile_name = formatmessage(20546) -- Distribution Verbose History Profile
  870.     set @profile_desc = formatmessage(20547)
  871.  
  872.     exec @retcode = dbo.sp_add_agent_profile
  873.             @profile_id = @profile_id OUT,
  874.             @profile_name = @profile_name,
  875.             @agent_type = 3,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  876.             @profile_type = 0,   -- 0-System, 1-Custom 
  877.             @description = @profile_desc,
  878.             @default = 0
  879.     if (@retcode = 1 or @@ERROR <> 0)
  880.         goto FAILURE
  881.  
  882.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  883.     if (@retcode = 1 or @@ERROR <> 0)
  884.         goto FAILURE
  885.  
  886.     /* 
  887.     ** Merge agent : Default profile for well connected scenarios 
  888.     */
  889.     set @profile_id = NULL
  890.     set @profile_name = formatmessage(20545) -- Default Merge Profile
  891.     set @profile_desc = NULL
  892.  
  893.     exec @retcode = dbo.sp_add_agent_profile
  894.             @profile_id = @profile_id OUT,
  895.             @profile_name = @profile_name,
  896.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  897.             @profile_type = 0,   -- 0-System, 1-Custom 
  898.             @description = @profile_desc,
  899.             @default = 1
  900.  
  901.     if (@retcode = 1 or @@ERROR <> 0)
  902.         goto FAILURE
  903.  
  904.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  905.     if (@retcode = 1 or @@ERROR <> 0)
  906.         goto FAILURE
  907.  
  908.     /* 
  909.     ** Merge agent : Non default profile for disconnected scenarios ( unreliable link ) 
  910.     */
  911.     set @profile_id = NULL
  912.     set @profile_name = formatmessage(20548) -- Non-Default Merge Profile
  913.     set @profile_desc = formatmessage(20549)
  914.  
  915.     exec @retcode = dbo.sp_add_agent_profile
  916.             @profile_id = @profile_id OUT,
  917.             @profile_name = @profile_name,
  918.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  919.             @profile_type = 0,   -- 0-System, 1-Custom 
  920.             @description = @profile_desc,
  921.             @default = 0
  922.  
  923.     if (@retcode = 1 or @@ERROR <> 0)
  924.         goto FAILURE
  925.  
  926.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  927.     if (@retcode = 1 or @@ERROR <> 0)
  928.         goto FAILURE
  929.  
  930.     /* 
  931.     ** Merge agent : Non default profile for verbose histroy
  932.     */
  933.     set @profile_id = NULL
  934.     set @profile_name = formatmessage(20546) -- Verbose Merge Profile
  935.     set @profile_desc = formatmessage(20547)
  936.  
  937.     exec @retcode = dbo.sp_add_agent_profile
  938.             @profile_id = @profile_id OUT,
  939.             @profile_name = @profile_name,
  940.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  941.             @profile_type = 0,   -- 0-System, 1-Custom 
  942.             @description = @profile_desc,
  943.             @default = 0
  944.  
  945.     if (@retcode = 1 or @@ERROR <> 0)
  946.         goto FAILURE
  947.  
  948.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  949.     if (@retcode = 1 or @@ERROR <> 0)
  950.         goto FAILURE
  951.  
  952.     /* 
  953.     ** Merge agent : Synchronization Manager Profile
  954.     */
  955.     set @profile_id = NULL
  956.     set @profile_name = formatmessage(20550) -- SyncMgr Profile
  957.     set @profile_desc = formatmessage(20551)
  958.  
  959.     exec @retcode = dbo.sp_add_agent_profile
  960.             @profile_id = @profile_id OUT,
  961.             @profile_name = @profile_name,
  962.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  963.             @profile_type = 0,   -- 0-System, 1-Custom 
  964.             @description = @profile_desc,
  965.             @default = 0
  966.  
  967.     if (@retcode = 1 or @@ERROR <> 0)
  968.         goto FAILURE
  969.  
  970.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  971.     if (@retcode = 1 or @@ERROR <> 0)
  972.         goto FAILURE
  973.  
  974.     /* 
  975.     ** Distribution agent : Synchronization Manager Profile
  976.     */
  977.     set @profile_id = NULL
  978.     set @profile_name = formatmessage(20550) -- SyncMgr Profile
  979.     set @profile_desc = formatmessage(20551)
  980.  
  981.     exec @retcode = dbo.sp_add_agent_profile
  982.             @profile_id = @profile_id OUT,
  983.             @profile_name = @profile_name,
  984.             @agent_type = 3,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  985.             @profile_type = 0,   -- 0-System, 1-Custom 
  986.             @description = @profile_desc,
  987.             @default = 0
  988.  
  989.     if (@retcode = 1 or @@ERROR <> 0)
  990.         goto FAILURE
  991.  
  992.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  993.     if (@retcode = 1 or @@ERROR <> 0)
  994.         goto FAILURE
  995.  
  996.     /* 
  997.     ** Qreader agent (default profile)
  998.     */
  999.     set @profile_id = NULL
  1000.     set @profile_name = formatmessage(20545) -- Default QueueReader Profile
  1001.     set @profile_desc = formatmessage(20589)
  1002.  
  1003.     exec @retcode = dbo.sp_add_agent_profile
  1004.             @profile_id = @profile_id OUT,
  1005.             @profile_name = @profile_name,
  1006.             @agent_type = 9,
  1007.             @profile_type = 0, 
  1008.             @description = @profile_desc,
  1009.             @default = 1
  1010.     if (@retcode = 1 or @@ERROR <> 0)
  1011.         goto FAILURE
  1012.  
  1013.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  1014.     if (@retcode = 1 or @@ERROR <> 0)
  1015.         goto FAILURE
  1016.  
  1017.     /* 
  1018.     ** Merge agent : Rowcount Validation profile  
  1019.     */
  1020.     set @profile_id = NULL
  1021.     set @profile_name = formatmessage(21308) -- Rowcount Validation Profile
  1022.     set @profile_desc = formatmessage(21309) -- Rowcount Validation Profile Description
  1023.  
  1024.     exec @retcode = dbo.sp_add_agent_profile
  1025.             @profile_id = @profile_id OUT,
  1026.             @profile_name = @profile_name,
  1027.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  1028.             @profile_type = 0,   -- 0-System, 1-Custom 
  1029.             @description = @profile_desc,
  1030.             @default = 0
  1031.  
  1032.     if (@retcode = 1 or @@ERROR <> 0)
  1033.         goto FAILURE
  1034.  
  1035.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  1036.     if (@retcode = 1 or @@ERROR <> 0)
  1037.         goto FAILURE
  1038.  
  1039.     /* 
  1040.     ** Merge agent : Rowcount & Checksum Validation profile  
  1041.     */
  1042.     set @profile_id = NULL
  1043.     set @profile_name = formatmessage(21310) -- Rowcount & Checksum Validation Profile
  1044.     set @profile_desc = formatmessage(21311) -- Rowcount & Checksum Validation Profile Description
  1045.  
  1046.     exec @retcode = dbo.sp_add_agent_profile
  1047.             @profile_id = @profile_id OUT,
  1048.             @profile_name = @profile_name,
  1049.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  1050.             @profile_type = 0,   -- 0-System, 1-Custom 
  1051.             @description = @profile_desc,
  1052.             @default = 0
  1053.  
  1054.     if (@retcode = 1 or @@ERROR <> 0)
  1055.         goto FAILURE
  1056.  
  1057.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  1058.     if (@retcode = 1 or @@ERROR <> 0)
  1059.         goto FAILURE
  1060.  
  1061.  
  1062.     /* 
  1063.     ** Distribution agent, skip error profile
  1064.     */
  1065.     set @profile_id = NULL
  1066.     set @profile_name = formatmessage(20599) -- Default Distribution Profile
  1067.     set @profile_desc = formatmessage(20600)
  1068.  
  1069.     exec @retcode = dbo.sp_add_agent_profile
  1070.             @profile_id = @profile_id OUT,
  1071.             @profile_name = @profile_name,
  1072.             @agent_type = 3,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  1073.             @profile_type = 0,   -- 0-System, 1-Custom 
  1074.             @description = @profile_desc,
  1075.             @default = 0
  1076.     if (@retcode = 1 or @@ERROR <> 0)
  1077.         goto FAILURE
  1078.  
  1079.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  1080.     if (@retcode = 1 or @@ERROR <> 0)
  1081.         goto FAILURE
  1082.  
  1083.     /* 
  1084.     ** Merge agent : High volume server-to-server profile
  1085.     */
  1086.     set @profile_id = NULL
  1087.     set @profile_name = formatmessage(20616) -- High volume server-to-server profile
  1088.     set @profile_desc = formatmessage(20617) -- High volume server-to-server profile Description
  1089.  
  1090.     exec @retcode = dbo.sp_add_agent_profile
  1091.             @profile_id = @profile_id OUT,
  1092.             @profile_name = @profile_name,
  1093.             @agent_type = 4,   -- 1-Snapshot, 2-Logreader, 3-Distribution, 4-Merge
  1094.             @profile_type = 0,   -- 0-System, 1-Custom 
  1095.             @description = @profile_desc,
  1096.             @default = 0
  1097.  
  1098.     if (@retcode = 1 or @@ERROR <> 0)
  1099.         goto FAILURE
  1100.  
  1101.     exec @retcode = dbo.sp_generate_agent_parameter @profile_id
  1102.     if (@retcode = 1 or @@ERROR <> 0)
  1103.         goto FAILURE
  1104.  
  1105.     create table msdb.dbo.MSdatatype_mappings 
  1106.     (
  1107.     dbms_name           sysname NOT NULL,
  1108.     sql_type            sysname NOT NULL,
  1109.     dest_type           sysname NOT NULL,
  1110.     dest_prec           int     NOT NULL,
  1111.     dest_create_params  int     NOT NULL,
  1112.     dest_nullable       bit     NOT NULL
  1113.     )
  1114.  
  1115.     -- MS Jet
  1116.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'binary' , 'binary', 255, 4, 1
  1117.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'varbinary' , 'varbinary', 255, 4, 1
  1118.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'binary' , 'image', 1073741824, 0, 1
  1119.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'varbinary' , 'image', 1073741824, 0, 1
  1120.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'sql_variant' , 'longtext', 1073741824, 0, 1
  1121.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'varchar' , 'varchar', 255, 4, 1
  1122.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'varchar' , 'longtext', 1073741824, 0, 1
  1123.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'nchar' , 'nchar', 255, 4, 1
  1124.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'nchar' , 'longtext', 1073741824, 0, 1
  1125.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'char' , 'char', 255, 4, 1
  1126.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'char' , 'longtext', 1073741824, 0, 1
  1127.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'nvarchar' , 'nchar varying', 255, 4, 1
  1128.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'nvarchar' , 'longtext', 1073741824, 0, 1
  1129.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'datetime' , 'datetime', 255, 0, 1
  1130.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'smalldatetime' , 'datetime', 255, 0, 1
  1131.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'decimal' , 'decimal', 255, 3, 1
  1132.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'numeric' , 'decimal', 255, 3, 1
  1133.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'float' , 'float', 255, 0, 1
  1134.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'real' , 'real', 255, 0, 1
  1135.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'bigint' , 'decimal', 255, 0, 1
  1136.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'int' , 'int', 255, 0, 1
  1137.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'smallint' , 'smallint', 255, 0, 1
  1138.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'tinyint' , 'byte', 255, 0, 1
  1139.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'money' , 'currency', 255, 0, 1
  1140.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'smallmoney' , 'currency', 255, 0, 1
  1141.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'bit' , 'bit', 255, 0, 1
  1142.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'sysname' , 'nchar varying', 255, 4, 1
  1143.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'timestamp' , 'binary', 255, 4, 1
  1144.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'uniqueidentifier' , 'guid', 255, 0, 1
  1145.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'text' , 'longtext', 1073741824, 0, 1
  1146.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'ntext' , 'longtext', 1073741824, 0, 1
  1147.     exec dbo.sp_add_datatype_mapping 'MS Jet', 'image' , 'image', 1073741824, 0, 1
  1148.  
  1149.     -- Oracle
  1150.     exec dbo.sp_add_datatype_mapping 'Oracle', 'binary' , 'raw', 255, 4, 1
  1151.     exec dbo.sp_add_datatype_mapping 'Oracle', 'varbinary' , 'raw', 255, 4, 1
  1152.     exec dbo.sp_add_datatype_mapping 'Oracle', 'binary' , 'long raw', 2147483647, 0, 1
  1153.     exec dbo.sp_add_datatype_mapping 'Oracle', 'varbinary' , 'long raw', 2147483647, 0, 1
  1154.     exec dbo.sp_add_datatype_mapping 'Oracle', 'sql_variant' , 'long', 2147483647, 0, 1
  1155.     --exec dbo.sp_add_datatype_mapping 'Oracle', 'varchar' , 'char', 255, 4, 1
  1156.     exec dbo.sp_add_datatype_mapping 'Oracle', 'varchar' , 'varchar2', 2000, 4, 1
  1157.     exec dbo.sp_add_datatype_mapping 'Oracle', 'varchar' , 'long', 2147483647, 0, 1
  1158.     exec dbo.sp_add_datatype_mapping 'Oracle', 'nchar' , 'char', 255, 4, 1
  1159.     exec dbo.sp_add_datatype_mapping 'Oracle', 'nchar' , 'varchar2', 2000, 4, 1
  1160.     exec dbo.sp_add_datatype_mapping 'Oracle', 'nchar' , 'long', 2147483647, 0, 1
  1161.     exec dbo.sp_add_datatype_mapping 'Oracle', 'char' , 'char', 255, 4, 1
  1162.     exec dbo.sp_add_datatype_mapping 'Oracle', 'char' , 'varchar2', 2000, 4, 1
  1163.     exec dbo.sp_add_datatype_mapping 'Oracle', 'char' , 'long', 2147483647, 0, 1
  1164.     --exec dbo.sp_add_datatype_mapping 'Oracle', 'nvarchar' , 'char', 255, 4, 1
  1165.     exec dbo.sp_add_datatype_mapping 'Oracle', 'nvarchar' , 'varchar2', 2000, 4, 1
  1166.     exec dbo.sp_add_datatype_mapping 'Oracle', 'nvarchar' , 'long', 2147483647, 0, 1
  1167.     exec dbo.sp_add_datatype_mapping 'Oracle', 'datetime' , 'date', 255, 0, 1
  1168.     exec dbo.sp_add_datatype_mapping 'Oracle', 'smalldatetime' , 'date', 255, 0, 1
  1169.     exec dbo.sp_add_datatype_mapping 'Oracle', 'decimal' , 'number', 255, 3, 1
  1170.     exec dbo.sp_add_datatype_mapping 'Oracle', 'numeric' , 'number', 255, 3, 1
  1171.     exec dbo.sp_add_datatype_mapping 'Oracle', 'float' , 'float', 255, 0, 1
  1172.     exec dbo.sp_add_datatype_mapping 'Oracle', 'real' , 'float', 255, 0, 1
  1173.     exec dbo.sp_add_datatype_mapping 'Oracle', 'bigint' , 'number', 255, 3, 1
  1174.     exec dbo.sp_add_datatype_mapping 'Oracle', 'int' , 'number', 255, 3, 1
  1175.     exec dbo.sp_add_datatype_mapping 'Oracle', 'smallint' , 'number', 255, 3, 1
  1176.     exec dbo.sp_add_datatype_mapping 'Oracle', 'tinyint' , 'number', 255, 3, 1
  1177.     exec dbo.sp_add_datatype_mapping 'Oracle', 'money' , 'number', 255, 3, 1
  1178.     exec dbo.sp_add_datatype_mapping 'Oracle', 'smallmoney' , 'number', 255, 3, 1
  1179.     exec dbo.sp_add_datatype_mapping 'Oracle', 'bit' , 'number', 255, 3, 1
  1180.     exec dbo.sp_add_datatype_mapping 'Oracle', 'sysname' , 'char', 255, 4, 1
  1181.     exec dbo.sp_add_datatype_mapping 'Oracle', 'timestamp' , 'raw', 255, 4, 1
  1182.     exec dbo.sp_add_datatype_mapping 'Oracle', 'uniqueidentifier' , 'char', 255, 4, 1
  1183.     exec dbo.sp_add_datatype_mapping 'Oracle', 'text' , 'long', 2147483647, 0, 1
  1184.     exec dbo.sp_add_datatype_mapping 'Oracle', 'ntext' , 'long', 2147483647, 0, 1
  1185.     exec dbo.sp_add_datatype_mapping 'Oracle', 'image' , 'long raw', 2147483647, 0, 1
  1186.  
  1187.     -- MS SSCE
  1188.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'binary' , 'binary', 255, 4, 1
  1189.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'varbinary' , 'varbinary', 255, 4, 1
  1190.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'binary' , 'image', 1073741824, 0, 1
  1191.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'varbinary' , 'image', 1073741824, 0, 1
  1192.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'sql_variant' , 'ntext', 1073741824, 0, 1
  1193.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'varchar' , 'national char varying', 255, 4, 1
  1194.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'varchar' , 'ntext', 1073741824, 0, 1
  1195.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'nchar' , 'nchar', 255, 4, 1
  1196.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'nchar' , 'ntext', 1073741824, 0, 1
  1197.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'char' , 'nchar', 255, 4, 1
  1198.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'char' , 'ntext', 1073741824, 0, 1
  1199.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'nvarchar' , 'national char varying', 255, 4, 1
  1200.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'nvarchar' , 'ntext', 1073741824, 0, 1
  1201.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'datetime' , 'datetime', 255, 0, 1
  1202.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'smalldatetime' , 'datetime', 255, 0, 1
  1203.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'decimal' , 'numeric', 255, 3, 1
  1204.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'numeric' , 'numeric', 255, 3, 1
  1205.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'float' , 'float', 255, 0, 1
  1206.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'real' , 'real', 255, 0, 1
  1207.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'bigint' , 'bigint', 255, 0, 1
  1208.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'int' , 'int', 255, 0, 1
  1209.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'smallint' , 'smallint', 255, 0, 1
  1210.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'tinyint' , 'tinyint', 255, 0, 1
  1211.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'money' , 'money', 255, 0, 1
  1212.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'smallmoney' , 'money', 255, 0, 1
  1213.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'bit' , 'bit', 255, 0, 1
  1214.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'sysname' , 'national char varying', 255, 4, 1
  1215.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'timestamp' , 'binary', 255, 4, 1
  1216.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'uniqueidentifier' , 'uniqueidentifier', 255, 0, 1
  1217.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'text' , 'ntext', 1073741824, 0, 1
  1218.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'ntext' , 'ntext', 1073741824, 0, 1
  1219.     exec dbo.sp_add_datatype_mapping 'MS SSCE', 'image' , 'image', 1073741824, 0, 1
  1220.  
  1221.     --DB2/400
  1222.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'bit', 'SMALLINT', 1,  0, 1
  1223.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'tinyint', 'SMALLINT', 1, 0, 1
  1224.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'smallint', 'SMALLINT', 5, 0, 1
  1225.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'int', 'INT', 10, 0, 1
  1226.  
  1227.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'char', 'CHAR', 8000, 4, 1
  1228.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'varchar', 'VARCHAR', 8000, 4, 1
  1229.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'smalldatetime', 'TIMESTAMP', 26, 0, 1
  1230.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'datetime', 'TIMESTAMP', 26, 0, 1
  1231.     
  1232.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'real', 'REAL', 24, 0, 1
  1233.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'decimal', 'DECIMAL', 31, 3, 1
  1234.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'double precision', 'DOUBLE', 53, 0, 1
  1235.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'float', 'FLOAT', 53, 0, 1
  1236.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'numeric', 'NUMERIC', 31, 3, 1
  1237.  
  1238.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'smallmoney', 'DECIMAL', 10, 3, 1
  1239.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'money', 'DECIMAL', 19, 3, 1
  1240.  
  1241.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'varbinary', 'VARCHAR () FOR BIT DATA', 8000, 4, 1
  1242.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'binary', 'CHAR () FOR BIT DATA', 8000, 4, 1
  1243.  
  1244.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'timestamp', 'CHAR () FOR BIT DATA', 8, 4, 1
  1245.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'uniqueidentifier', 'CHAR', 38, 4, 1
  1246.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'image', 'VARCHAR () FOR BIT DATA', 32739, 4, 1
  1247.     exec dbo.sp_add_datatype_mapping 'DB2/400', 'text', 'VARCHAR', 32739, 4, 1
  1248.  
  1249.     --DB2/MVS
  1250.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'bit', 'SMALLINT', 1,  0, 1
  1251.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'tinyint', 'SMALLINT', 1, 0, 1
  1252.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'smallint', 'SMALLINT', 5, 0, 1
  1253.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'int', 'INT', 10, 0, 1
  1254.  
  1255.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'char', 'CHAR', 254, 4, 1
  1256.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'varchar', 'VARCHAR', 4045, 4, 1
  1257.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'char', 'VARCHAR', 4045, 4, 1
  1258.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'smalldatetime', 'TIMESTAMP', 26, 0, 1
  1259.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'datetime', 'TIMESTAMP', 26, 0, 1
  1260.  
  1261.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'real', 'REAL', 24, 0, 1
  1262.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'decimal', 'DECIMAL', 31, 3, 1
  1263.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'double precision', 'DOUBLE', 53, 0, 1
  1264.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'float', 'FLOAT', 53, 0, 1
  1265.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'numeric', 'NUMERIC', 31, 3, 1
  1266.  
  1267.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'smallmoney', 'DECIMAL', 10, 3, 1
  1268.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'money', 'DECIMAL', 19, 3, 1
  1269.  
  1270.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'varbinary', 'VARCHAR () FOR BIT DATA', 4045, 4, 1
  1271.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'binary', 'CHAR () FOR BIT DATA', 254, 4, 1
  1272.  
  1273.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'timestamp', 'CHAR () FOR BIT DATA', 8, 4, 1
  1274.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'uniqueidentifier', 'CHAR', 38, 4, 1
  1275.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'image', 'VARCHAR () FOR BIT DATA', 4045, 4, 1
  1276.     exec dbo.sp_add_datatype_mapping 'DB2/MVS', 'text', 'VARCHAR', 4045, 4, 1
  1277.  
  1278.     --DB2/NT
  1279.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'bit', 'SMALLINT', 1,  0, 1
  1280.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'tinyint', 'SMALLINT', 1, 0, 1
  1281.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'smallint', 'SMALLINT', 5, 0, 1
  1282.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'int', 'INT', 10, 0, 1
  1283.  
  1284.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'char', 'CHAR', 254, 4, 1
  1285.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'varchar', 'VARCHAR', 4000, 4, 1
  1286.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'char', 'VARCHAR', 4000, 4, 1
  1287.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'smalldatetime', 'TIMESTAMP', 26, 0, 1
  1288.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'datetime', 'TIMESTAMP', 26, 0, 1
  1289.  
  1290.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'real', 'REAL', 24, 0, 1
  1291.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'decimal', 'DECIMAL', 31, 3, 1
  1292.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'double precision', 'DOUBLE', 53, 0, 1
  1293.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'float', 'FLOAT', 53, 0, 1
  1294.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'numeric', 'NUMERIC', 31, 3, 1
  1295.  
  1296.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'smallmoney', 'DECIMAL', 10, 3, 1
  1297.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'money', 'DECIMAL', 19, 3, 1
  1298.  
  1299.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'varbinary', 'VARCHAR () FOR BIT DATA', 4000, 4, 1
  1300.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'binary', 'CHAR () FOR BIT DATA', 254, 4, 1
  1301.  
  1302.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'timestamp', 'CHAR () FOR BIT DATA', 8, 4, 1
  1303.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'uniqueidentifier', 'CHAR', 38, 4, 1
  1304.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'image', 'VARCHAR () FOR BIT DATA', 4000, 4, 1
  1305.     exec dbo.sp_add_datatype_mapping 'DB2/NT', 'text', 'VARCHAR', 4000, 4, 1
  1306.  
  1307.     --DB2/6000
  1308.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'bit', 'SMALLINT', 1,  0, 1
  1309.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'tinyint', 'SMALLINT', 1, 0, 1
  1310.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'smallint', 'SMALLINT', 5, 0, 1
  1311.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'int', 'INT', 10, 0, 1
  1312.  
  1313.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'char', 'CHAR', 254, 4, 1
  1314.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'varchar', 'VARCHAR', 4000, 4, 1
  1315.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'char', 'VARCHAR', 4000, 4, 1
  1316.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'smalldatetime', 'TIMESTAMP', 26, 0, 1
  1317.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'datetime', 'TIMESTAMP', 26, 0, 1
  1318.  
  1319.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'real', 'REAL', 24, 0, 1
  1320.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'decimal', 'DECIMAL', 31, 3, 1
  1321.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'double precision', 'DOUBLE', 53, 0, 1
  1322.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'float', 'FLOAT', 53, 0, 1
  1323.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'numeric', 'NUMERIC', 31, 3, 1
  1324.  
  1325.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'smallmoney', 'DECIMAL', 10, 3, 1
  1326.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'money', 'DECIMAL', 19, 3, 1
  1327.  
  1328.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'varbinary', 'VARCHAR () FOR BIT DATA', 4000, 4, 1
  1329.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'binary', 'CHAR () FOR BIT DATA', 254, 4, 1
  1330.  
  1331.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'timestamp', 'CHAR () FOR BIT DATA', 8, 4, 1
  1332.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'uniqueidentifier', 'CHAR', 38, 4, 1
  1333.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'image', 'VARCHAR () FOR BIT DATA', 4000, 4, 1
  1334.     exec dbo.sp_add_datatype_mapping 'DB2/6000', 'text', 'VARCHAR', 4000, 4, 1
  1335.  
  1336.     return 0
  1337. FAILURE:
  1338.     return 1
  1339. go
  1340.  
  1341. dump tran master with no_log
  1342. GO
  1343.  
  1344. /*
  1345. ** Create replication stored procedures and functions.
  1346. ** Part 2:  create all other stored procedures and functions.
  1347. */
  1348. --
  1349. -- Name: fn_getpersistedservernamecasevariation
  1350. --
  1351. -- Description: A simple function for getting the case variation of a
  1352. --              server name as persisted in master..sysservers. For
  1353. --              example, if sErVeRnAmE is what is being persisted 
  1354. --              as a srvname in sysservers
  1355. --
  1356. --              select fn_getpersistedservernamecasevariation('SERVERNAME')
  1357. --              select fn_getpersistedservernamecasevariation('servername')
  1358. --            
  1359. --              will all return the string 'sErVeRnAmE'                
  1360. --
  1361. -- Parameter: @servername sysname (mandatory)
  1362. --
  1363. -- Notes: This function will return null if the specified server name
  1364. --        does not match any srvname's in master..sysservers in a
  1365. --        case insensitive manner.
  1366. --
  1367. -- Security: Admin access only
  1368. -- 
  1369. raiserror('Creating function fn_getpersistedservernamecasevariation', 0,1)
  1370. go
  1371. create function system_function_schema.fn_getpersistedservernamecasevariation (
  1372.     @servername sysname
  1373.     ) returns sysname
  1374. as
  1375. begin
  1376.  
  1377.     declare @real_servername sysname
  1378.     select @real_servername = null
  1379.     select @real_servername = srvname 
  1380.       from master.dbo.sysservers
  1381.      where upper(@servername) = upper(srvname) collate database_default 
  1382.  
  1383.     return @real_servername
  1384. end
  1385. go
  1386.  
  1387. raiserror('Creating procedure sp_MSIfExistsRemoteLogin', 0,1)
  1388. GO
  1389.  
  1390. CREATE proc sp_MSIfExistsRemoteLogin
  1391.     @remotesrvname sysname,
  1392.     @locallgname   sysname,
  1393.     @remotelgname  sysname
  1394. AS
  1395. begin
  1396.  
  1397.  
  1398.     if (@locallgname IS NULL)
  1399.     begin
  1400.      IF EXISTS (SELECT * FROM master.dbo.sysremotelogins srl, master.dbo.sysservers ss
  1401.                  WHERE UPPER(ss.srvname) = UPPER(@remotesrvname) collate database_default AND 
  1402.                        srl.remoteserverid = ss.srvid AND 
  1403.                        (srl.remoteusername = @remotelgname OR 
  1404.                        (srl.remoteusername IS NULL AND srl.sid = 0x2)))
  1405.         return (1)
  1406.     else
  1407.         return (0)
  1408.     end
  1409.  
  1410.     if exists (SELECT * FROM master.dbo.sysremotelogins srl, master.dbo.sysservers ss 
  1411.                                 WHERE UPPER(ss.srvname) = UPPER(@remotesrvname) collate database_default AND 
  1412.                                       srl.remoteserverid = ss.srvid AND 
  1413.                                       srl.remoteusername = @remotelgname AND 
  1414.                                       srl.sid = suser_sid(@locallgname))
  1415.         return (1)
  1416.     else
  1417.         return (0)
  1418. end
  1419. go
  1420.  
  1421. raiserror('Creating procedure sp_helppublicationsync', 0,1)
  1422. GO
  1423.  
  1424. CREATE PROCEDURE sp_helppublicationsync (
  1425.         @publication sysname    /* The publication name */
  1426.         ) AS
  1427.     SET NOCOUNT ON
  1428.     RAISERROR (21023, 16, -1,'sp_helppublicationsync')
  1429.     RETURN(1)
  1430. GO
  1431.  
  1432. raiserror('Creating procedure sp_MSreplrole', 0,1)
  1433. GO
  1434. create procedure sp_MSreplrole
  1435. @name sysname,
  1436. @operation nvarchar(4)
  1437. as
  1438. declare @retcode int
  1439. -- Add/Drop when proper.
  1440. if @operation = 'add'
  1441. begin
  1442.     if user_id(@name) is null
  1443.     begin
  1444.         exec @retcode = dbo.sp_addrole @name
  1445.         IF @@ERROR <> 0 or @retcode <> 0
  1446.             RETURN (1)
  1447.     end
  1448. end
  1449. else if @operation = 'drop' 
  1450. begin
  1451.     if user_id(@name) is not null
  1452.     begin
  1453.         exec @retcode = dbo.sp_droprole @name
  1454.         IF @@ERROR <> 0 or @retcode <> 0
  1455.             RETURN (1)
  1456.     end
  1457. end
  1458. go
  1459.  
  1460. dump tran master with no_log
  1461. GO
  1462.  
  1463. raiserror('Creating procedure sp_addpublication_snapshot', 0,1)
  1464. GO
  1465.  
  1466. CREATE PROCEDURE sp_addpublication_snapshot (
  1467.     @publication sysname,    
  1468.     @frequency_type  int = 4 ,              /* 4== Daily */
  1469.     @frequency_interval int = 1,            /* Every day */
  1470.     @frequency_subday int = 4,              /* Sub interval = Minute */
  1471.     @frequency_subday_interval int = 5,     /* Every five minutes */
  1472.     @frequency_relative_interval int = 1, 
  1473.     @frequency_recurrence_factor int = 0, 
  1474.     @active_start_date int = 0, 
  1475.     @active_end_date int = 99991231 , 
  1476.     @active_start_time_of_day int = 0, 
  1477.     @active_end_time_of_day int = 235959,
  1478.     @snapshot_job_name nvarchar(100) = NULL         
  1479. ) AS
  1480.  
  1481.     SET NOCOUNT ON
  1482.  
  1483.     /*
  1484.     ** Declarations.
  1485.     */
  1486.     DECLARE @retcode                int
  1487.     DECLARE @newid                  int
  1488.     DECLARE @mergepublish_bit       smallint
  1489.     DECLARE @transpublish_bit       int
  1490.     DECLARE @transpub_found         bit
  1491.     DECLARE @mergepub_found         bit
  1492.     DECLARE @newagentid             int
  1493.  
  1494.     /*
  1495.     ** Initializations
  1496.     */
  1497.     select @mergepublish_bit    = 4
  1498.     select @transpublish_bit    = 1
  1499.     select @transpub_found      = 0
  1500.     select @mergepub_found      = 0
  1501.     
  1502.     /*
  1503.     ** Parameter Check
  1504.     */
  1505.     exec @retcode = dbo.sp_MSreplcheck_name @publication
  1506.     if @@ERROR <> 0 or @retcode <> 0
  1507.         return(1)
  1508.  
  1509.     /*
  1510.     ** Security Check
  1511.     */
  1512.     exec @retcode = dbo.sp_MSreplcheck_publish
  1513.     if @@ERROR <> 0 or @retcode <> 0
  1514.         return(1)
  1515.  
  1516.     /*
  1517.     **  Check if the publication is valid.
  1518.     **  1. Check transaction-level publications
  1519.     **  2. Check merge publications
  1520.     */
  1521.     if (select category & @transpublish_bit from master..sysdatabases where name = DB_NAME() collate database_default) <> 0
  1522.     begin
  1523.         EXEC @retcode = dbo.sp_MSaddpub_snapshot     @publication ,    
  1524.             @frequency_type,  
  1525.             @frequency_interval, 
  1526.             @frequency_subday, 
  1527.             @frequency_subday_interval,
  1528.             @frequency_relative_interval, 
  1529.             @frequency_recurrence_factor, 
  1530.             @active_start_date, 
  1531.             @active_end_date, 
  1532.             @active_start_time_of_day, 
  1533.             @active_end_time_of_day,         
  1534.             @newagentid OUTPUT,
  1535.             @snapshot_job_name 
  1536.  
  1537.         IF @retcode <> 0 and @@ERROR <> 0 
  1538.             BEGIN
  1539.                 RETURN (1)
  1540.             END
  1541.  
  1542.         if @newagentid <> 0
  1543.             begin
  1544.                 select @transpub_found = 1
  1545.                 goto DONE
  1546.             end             
  1547.  
  1548.     end
  1549.     
  1550.     if (select category & @mergepublish_bit from master..sysdatabases where name = DB_NAME() collate database_default) <> 0
  1551.     begin
  1552.         EXEC @retcode = dbo.sp_MSaddmergepub_snapshot     @publication ,    
  1553.             @frequency_type,  
  1554.             @frequency_interval, 
  1555.             @frequency_subday, 
  1556.             @frequency_subday_interval,
  1557.             @frequency_relative_interval, 
  1558.             @frequency_recurrence_factor, 
  1559.             @active_start_date, 
  1560.             @active_end_date, 
  1561.             @active_start_time_of_day, 
  1562.             @active_end_time_of_day,         
  1563.             @newagentid OUTPUT,
  1564.             @snapshot_job_name
  1565.  
  1566.         IF @retcode <> 0 and @@ERROR <> 0 
  1567.             BEGIN
  1568.                 RETURN (1)
  1569.             END
  1570.  
  1571.         if @newagentid <> 0
  1572.             begin
  1573.                 select @mergepub_found = 1
  1574.                 goto DONE
  1575.             end             
  1576.     end
  1577.  
  1578. DONE:
  1579.     if @transpub_found = 0 and @mergepub_found = 0
  1580.     begin
  1581.         RAISERROR (15001, 11, -1, @publication)
  1582.         RETURN (1)
  1583.     end
  1584.     return (0)        
  1585. GO
  1586.  
  1587. raiserror('Creating procedure sp_MShelpobjectpublications', 0,1)
  1588. GO
  1589.  
  1590. create procedure sp_MShelpobjectpublications (@object_name sysname)
  1591. AS
  1592.     /*
  1593.     ** Declarations.
  1594.     */
  1595.     DECLARE @retcode                int
  1596.     DECLARE @mergepublish_bit       smallint
  1597.     DECLARE @transpublish_bit       int
  1598.  
  1599.     declare @object_id int
  1600.  
  1601.     /*
  1602.     ** Initializations
  1603.     */
  1604.     select @mergepublish_bit    = 4
  1605.     select @transpublish_bit    = 1
  1606.     select @object_id           = OBJECT_ID(@object_name)
  1607.  
  1608.     create table #helpobjpubs (
  1609.         publication     sysname         collate database_default not null, 
  1610.         reptype         int             NOT NULL, 
  1611.         article         sysname         collate database_default not null, 
  1612.         article_type    int             NULL, 
  1613.         column_tracking int             NULL, 
  1614.         article_resolver nvarchar(255)  collate database_default null,
  1615.         identity_support int             NULL, 
  1616.         resolver_clsid nvarchar(50)        NULL,
  1617.         resolver_info  nvarchar(255)    NULL,
  1618.         verify_resolver_signature int     NULL,
  1619.         allow_interactive_resolver bit     NULL,
  1620.         fast_multicol_updateproc bit    NULL,
  1621.         check_permissions int            NULL)
  1622.     /*
  1623.     **  1. Return the transactional publications that the table is involved in
  1624.     */
  1625.     if (select category & @transpublish_bit from master..sysdatabases where name = DB_NAME() collate database_default) <> 0
  1626.     begin
  1627.         if exists (select * from sysextendedarticlesview a, 
  1628.             syspublications p where a.pubid = p.pubid and a.objid = @object_id)
  1629.             begin
  1630.                 insert into #helpobjpubs(publication, reptype, article, article_type) 
  1631.                     select p.name, 1, a.name, a.type  from sysextendedarticlesview a, 
  1632.                         syspublications p where a.pubid = p.pubid and a.objid = @object_id
  1633.                 IF @@ERROR <> 0 
  1634.                     BEGIN
  1635.                         select @retcode = 1
  1636.                         goto DONE
  1637.                     END
  1638.             end
  1639.     end
  1640.     /*
  1641.     **  2. Return the merge publications that the table is involved in
  1642.     */
  1643.     if exists (select * from sysobjects where name='sysmergepublications')
  1644.     begin
  1645.         if exists (select * from sysmergeextendedarticlesview a, 
  1646.             sysmergepublications p where a.pubid = p.pubid and a.objid = @object_id)
  1647.             begin
  1648.                 insert into #helpobjpubs (publication, reptype, article, article_type, column_tracking, article_resolver,
  1649.                 identity_support, resolver_clsid, resolver_info, verify_resolver_signature, allow_interactive_resolver,
  1650.                             fast_multicol_updateproc, check_permissions)
  1651.                     select p.name, 2, a.name, a.type, a.column_tracking, a.article_resolver, a.identity_support,
  1652.                             a.resolver_clsid, a.resolver_info, a.verify_resolver_signature, a.allow_interactive_resolver,
  1653.                             a.fast_multicol_updateproc, a.check_permissions
  1654.                         from sysmergeextendedarticlesview a, sysmergepublications p 
  1655.                         where a.pubid = p.pubid and a.objid = @object_id
  1656.                 IF @@ERROR <> 0 
  1657.                     BEGIN
  1658.                         select @retcode = 1
  1659.                         goto DONE
  1660.                     END
  1661.             end
  1662.     end
  1663.     select @retcode = 0
  1664.  
  1665. DONE:
  1666.     select * from #helpobjpubs
  1667.     drop table #helpobjpubs
  1668.     return (@retcode)
  1669. go
  1670.  
  1671. raiserror('Creating procedure sp_helpreplicationdb', 0,1)
  1672. GO
  1673.  
  1674. CREATE PROCEDURE sp_helpreplicationdb
  1675.         @dbname sysname = '%', @type sysname = 'pub'
  1676.     AS
  1677.  
  1678.     SET NOCOUNT ON
  1679.  
  1680.     /*
  1681.     ** Declarations.
  1682.     */
  1683.  
  1684.     DECLARE @retcode int, @typebit int
  1685.  
  1686.     if (lower(@type) like 'pub%')
  1687.        select @typebit = 1
  1688.     else if (lower(@type) like 'sub%')
  1689.        select @typebit = 2
  1690.     else
  1691.     begin
  1692.        raiserror(14091,-1,-1)
  1693.        return 1
  1694.     end
  1695.  
  1696.     /*
  1697.     ** Parameter Check:  @dbname.
  1698.     ** Check to make sure that the database name conforms to the rules
  1699.     ** for identifiers.
  1700.     */
  1701.  
  1702.     IF @dbname <> '%'
  1703.        BEGIN
  1704.           EXECUTE @retcode = dbo.sp_validname @dbname
  1705.  
  1706.           IF @@ERROR <> 0 OR @retcode <> 0
  1707.           RETURN (1)
  1708.        END
  1709.  
  1710.     /*
  1711.     ** Show databases with this option enabled.
  1712.     */
  1713.  
  1714.     SELECT name
  1715.       FROM master..sysdatabases
  1716.      WHERE ((@dbname = N'%') or (name = @dbname collate database_default)) 
  1717.        AND (category & @typebit) <> 0
  1718. go
  1719.  
  1720.  
  1721. raiserror('Creating procedure sp_helpdistributor', 0,1)
  1722. go
  1723.  
  1724. CREATE PROCEDURE sp_helpdistributor (
  1725.     @distributor sysname  = '%' OUTPUT, /* The distribution server name */
  1726.     @distribdb   sysname  = '%' OUTPUT, /* The distribution database */
  1727.     @directory   nvarchar(255) = '%' OUTPUT, /* The working directory */
  1728.     @account     nvarchar(255) = '%' OUTPUT, /* The Windows NT user account */
  1729.     @min_distretention int      = -1 OUTPUT, /* The min distribution retention */
  1730.     @max_distretention int      = -1 OUTPUT, /* The min distribution retention */
  1731.     @history_retention   int  = -1 OUTPUT, /* The history retention period */
  1732.     @history_cleanupagent nvarchar(100) = '%' OUTPUT, /* The history cleanup agent */
  1733.     @distrib_cleanupagent nvarchar(100) = '%' OUTPUT, /* The distribution cleanup agent */
  1734.     @publisher sysname = NULL,  /* Name of publisher */
  1735.     @local nvarchar(5) = NULL,        /* Get local server values */
  1736.     @rpcsrvname sysname = '%' OUTPUT
  1737. ) AS
  1738.     SET NOCOUNT ON
  1739.  
  1740.     /*
  1741.     ** Declarations.
  1742.     */
  1743.     DECLARE @loc_distributor         sysname
  1744.     DECLARE @loc_distribdb             sysname
  1745.     DECLARE @loc_directory             nvarchar(255)
  1746.     DECLARE @loc_account             nvarchar(255)
  1747.     DECLARE @loc_mindistretention     int
  1748.     DECLARE @loc_maxdistretention     int
  1749.     DECLARE @loc_historyretention   int  
  1750.     DECLARE @loc_historycleanupagent nvarchar(100)
  1751.     DECLARE @loc_distribcleanupagent nvarchar(100)
  1752.     DECLARE @loc_security_mode  int  
  1753.     DECLARE @loc_login sysname
  1754.     DECLARE @loc_password sysname
  1755.     declare @loc_rpcsrvname sysname
  1756.     DECLARE @proc nvarchar(255)
  1757.     DECLARE @reg_key nvarchar (255)
  1758.     DECLARE @retcode int
  1759.     declare @rpcsrvlogin sysname
  1760.     declare @srvid smallint
  1761.     declare @dist_rpcname sysname
  1762.     declare @platform_nt binary
  1763.  
  1764.     select @platform_nt = 0x1
  1765.  
  1766.     IF @publisher IS NULL
  1767.     BEGIN
  1768.         /* 
  1769.         ** 6.x compatibility 
  1770.         ** If local is set, we know the call is from a publisher. 
  1771.         ** set it to be @@REMSERVER 
  1772.         ** Otherwise, set it to be local server name
  1773.         ** Note: @@REMSERVER is NULL for local sp calls 
  1774.         */
  1775.         IF LOWER(@local) = 'local' AND @@REMSERVER IS NOT NULL
  1776.             SELECT @publisher = @@REMSERVER
  1777.         ELSE
  1778.             SELECT  @publisher = @@SERVERNAME
  1779.     END
  1780.  
  1781.     /*
  1782.     ** Get the distribution server
  1783.     */
  1784.     SELECT @dist_rpcname = srvname, @loc_distributor = datasource, @srvid = srvid, @loc_rpcsrvname = srvname
  1785.         FROM master..sysservers
  1786.         WHERE srvstatus & 8 <> 0
  1787.     
  1788.     if @loc_distributor is null
  1789.         GOTO DONE
  1790.  
  1791.     select @rpcsrvlogin = name from master.dbo.sysxlogins where
  1792.         srvid = @srvid and sid is NULL
  1793.  
  1794.     /*
  1795.     ** If remote distribuiton, execute dbo.sp_helpdistributor on distribution
  1796.     ** server.
  1797.     */
  1798.     IF UPPER(@loc_distributor) <> UPPER(@@SERVERNAME)
  1799.     BEGIN
  1800.         SELECT @proc = @dist_rpcname + '.master.dbo.sp_helpdistributor'
  1801.         EXECUTE @retcode = @proc
  1802.             @loc_distributor OUTPUT,
  1803.             @loc_distribdb OUTPUT,
  1804.             @loc_directory OUTPUT,
  1805.             @loc_account OUTPUT,
  1806.             @loc_mindistretention OUTPUT,
  1807.             @loc_maxdistretention OUTPUT,
  1808.             @loc_historyretention OUTPUT,
  1809.             @loc_historycleanupagent OUTPUT,
  1810.             @loc_distribcleanupagent OUTPUT,
  1811.             @@SERVERNAME,
  1812.             @local = 'local'
  1813.         IF @retcode <> 0 or @@ERROR <> 0
  1814.            RETURN (1)
  1815.  
  1816.             GOTO DONE
  1817.     END
  1818.  
  1819.     SELECT  @loc_distribdb = distribution_db,
  1820.             @loc_directory = working_directory
  1821.         FROM msdb.dbo.MSdistpublishers WHERE UPPER(name) = UPPER(@publisher) collate database_default
  1822.  
  1823.     IF @@ERROR <> 0
  1824.         RETURN 1 ;
  1825.  
  1826.     SELECT  @loc_mindistretention = min_distretention,      
  1827.             @loc_maxdistretention = max_distretention,
  1828.             @loc_historyretention = history_retention
  1829.         FROM msdb.dbo.MSdistributiondbs WHERE name = @loc_distribdb collate database_default 
  1830.  
  1831.     /*
  1832.     ** Fetch the distribution account name.
  1833.     */
  1834.     IF ((@distributor = '%' AND @distribdb = '%' AND @directory = '%'
  1835.     AND @account = '%' AND @min_distretention = -1 AND @max_distretention = -1 
  1836.     AND @history_retention = -1 AND @history_cleanupagent = '%' 
  1837.     AND @distrib_cleanupagent = '%' ) 
  1838.     OR @account IS NULL) and ( platform() & @platform_nt = @platform_nt ) 
  1839.        BEGIN
  1840.  
  1841.         declare @instance sysname
  1842.         declare @regkey nvarchar(260)
  1843.         select @instance = convert(sysname, SERVERPROPERTY('InstanceName'))
  1844.         select @regkey = 'SYSTEM\CurrentControlSet\Services\'
  1845.         -- default installation
  1846.         if @instance is null
  1847.             SELECT @regkey = @regkey + 'SQLServerAgent' 
  1848.         else
  1849.             SELECT @regkey = @regkey + 'SQLAgent$' + @instance
  1850.  
  1851.         SELECT @proc = 'master..xp_regread'
  1852.         EXECUTE @retcode = @proc 'HKEY_LOCAL_MACHINE',
  1853.               @regkey,
  1854.               'ObjectName',
  1855.             @param = @loc_account OUTPUT
  1856.     
  1857.         IF @@ERROR <> 0 OR @retcode <> 0
  1858.             SELECT @loc_account = NULL
  1859.        END
  1860.  
  1861.     /*
  1862.     ** Fetch the history cleanup agentname.
  1863.     */
  1864.     IF @loc_distribdb IS NOT NULL
  1865.         SELECT @loc_historycleanupagent = formatmessage (20567, @loc_distribdb)
  1866.  
  1867.     /*
  1868.     ** Fetch the distribution cleanup agent name.
  1869.     */
  1870.     IF @loc_distribdb IS NOT NULL
  1871.         SELECT @loc_distribcleanupagent = formatmessage (20568, @loc_distribdb)
  1872.  
  1873.  
  1874. DONE:
  1875.     /*
  1876.     ** Return result set if no output parameters
  1877.     */
  1878.  
  1879.     IF @distributor = '%' AND @distribdb = '%' AND @directory = '%'
  1880.     AND @account = '%' AND @min_distretention = -1 AND @max_distretention = -1 
  1881.     AND @history_retention = -1 AND @history_cleanupagent = '%' 
  1882.     AND @distrib_cleanupagent = '%' AND @rpcsrvname = '%' 
  1883.     SELECT       'distributor'           = @loc_distributor,
  1884.                'distribution database' = @loc_distribdb,
  1885.                'directory'              = @loc_directory,
  1886.                'account'               = @loc_account,
  1887.                'min distrib retention' = @loc_mindistretention,
  1888.                'max distrib retention' = @loc_maxdistretention,
  1889.                'history retention'     = @loc_historyretention,
  1890.                'history cleanup agent'  = @loc_historycleanupagent,
  1891.                'distribution cleanup agent' = @loc_distribcleanupagent,
  1892.                'rpc server name' = @loc_rpcsrvname,
  1893.                'rpc login name' = @rpcsrvlogin
  1894.  
  1895.     /*
  1896.     ** Return output parameters if requested.
  1897.     */
  1898.  
  1899.     IF @distributor IS NULL
  1900.         SELECT @distributor = @loc_distributor
  1901.     IF @distribdb IS NULL
  1902.         SELECT @distribdb = @loc_distribdb
  1903.     IF @directory IS NULL
  1904.         SELECT @directory = @loc_directory
  1905.     IF @account IS NULL
  1906.         SELECT @account = @loc_account
  1907.     IF @min_distretention IS NULL
  1908.         SELECT @min_distretention = @loc_mindistretention
  1909.     IF @max_distretention IS NULL
  1910.         SELECT @max_distretention = @loc_maxdistretention
  1911.     IF @history_retention IS NULL
  1912.         SELECT @history_retention = @loc_historyretention
  1913.     IF @history_cleanupagent IS NULL
  1914.         SELECT @history_cleanupagent = @loc_historycleanupagent
  1915.     IF @distrib_cleanupagent IS NULL
  1916.         SELECT @distrib_cleanupagent = @loc_distribcleanupagent
  1917.    
  1918.     IF @rpcsrvname IS NULL
  1919.     begin
  1920.         -- Use local RPC if possible to avoid blocking problem.
  1921.         if is_srvrolemember('sysadmin') = 1 and UPPER(@loc_distributor) = UPPER(@@servername)
  1922.             select @rpcsrvname = @@servername
  1923.         else
  1924.             select @rpcsrvname = @loc_rpcsrvname
  1925.     end
  1926.   
  1927.     RETURN (0)
  1928. GO
  1929.  
  1930. dump tran master with no_log
  1931. go
  1932.  
  1933. raiserror('Creating procedure sp_enumdsn', 0,1)
  1934. GO
  1935.  
  1936. CREATE PROCEDURE sp_enumdsn
  1937.     AS
  1938.  
  1939.     SET NOCOUNT ON
  1940.  
  1941.     DECLARE @distributor sysname
  1942.     DECLARE @distproc nvarchar (300)
  1943.     DECLARE @retcode int
  1944.  
  1945.     DECLARE @dsotype_odbc int
  1946.     DECLARE @dsotype_oledb int
  1947.  
  1948.     select @dsotype_odbc = 1
  1949.     select @dsotype_oledb = 3
  1950.  
  1951.     /*
  1952.     ** Get distribution server information for remote RPC
  1953.     ** subscription calls.
  1954.     */
  1955.  
  1956.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT
  1957.     IF @@error <> 0 OR @retcode <> 0 or @distributor is null
  1958.         BEGIN
  1959.         RAISERROR (14071, 16, -1)
  1960.             RETURN (1)
  1961.     END
  1962.  
  1963.     create table #datasourcestemptable (DataSourceName sysname collate database_default not null, Description nvarchar(255) collate database_default null, DataSourceType int null, ProviderName nvarchar(255) collate database_default null)
  1964.     
  1965.     /*
  1966.     ** Call xp_enumdsn
  1967.     */
  1968.     SELECT @distproc = RTRIM(@distributor) + '.master..xp_enumdsn'
  1969.     insert into #datasourcestemptable(DataSourceName, Description) EXEC @retcode = @distproc
  1970.     IF @@error <> 0
  1971.         BEGIN
  1972.         RAISERROR (14071, 16, -1)
  1973.         RETURN (1)
  1974.     END
  1975.  
  1976.     update #datasourcestemptable set DataSourceType = @dsotype_odbc where DataSourceType is null
  1977.     IF @@error <> 0 
  1978.     BEGIN
  1979.         RETURN (1)
  1980.     END
  1981.  
  1982.     /*
  1983.     ** Call sp_enumoledbdatasources
  1984.     */
  1985.     SELECT @distproc = RTRIM(@distributor) + '.master.dbo.sp_enumoledbdatasources'
  1986.     insert into #datasourcestemptable(DataSourceName, Description, ProviderName) EXEC @retcode = @distproc
  1987.     IF @@error <> 0
  1988.         BEGIN
  1989.         RAISERROR (14071, 16, -1)
  1990.         RETURN (1)
  1991.     END
  1992.  
  1993.     update #datasourcestemptable set DataSourceType = @dsotype_oledb where DataSourceType is null
  1994.     IF @@error <> 0 
  1995.     BEGIN
  1996.         RETURN (1)
  1997.     END
  1998.     
  1999.     select 'Data Source Name' = DataSourceName, Description, 'Type' = DataSourceType, 'Provider Name' = ProviderName 
  2000.     from #datasourcestemptable
  2001.     order by 3, 1
  2002.  
  2003.     drop table #datasourcestemptable
  2004.  
  2005.     return (0)
  2006. go
  2007.  
  2008. raiserror('Creating procedure sp_enumoledbdatasources', 0,1)
  2009. GO
  2010.  
  2011. CREATE PROCEDURE sp_enumoledbdatasources
  2012.     AS
  2013.     set nocount on
  2014.  
  2015.     select srvname, srvproduct, providername from master..sysservers where 
  2016.     (srvstatus & 0x0080) <> 0
  2017.  
  2018.     return (0)
  2019. go
  2020.  
  2021. raiserror('Creating procedure sp_helpsubscriberinfo', 0,1)
  2022. GO
  2023.  
  2024. CREATE PROCEDURE sp_helpsubscriberinfo
  2025.     @subscriber sysname = '%'
  2026.     AS
  2027.  
  2028.     SET NOCOUNT ON
  2029.  
  2030.     DECLARE @distributor sysname
  2031.     DECLARE @distribdb sysname
  2032.     DECLARE @distproc nvarchar (300)
  2033.     DECLARE @retcode int
  2034.     DECLARE @subscriber_bit smallint
  2035.     DECLARE @show_password bit
  2036.  
  2037.     /*
  2038.     ** Security Check
  2039.     */
  2040.  
  2041.     /*
  2042.     ** Initializations.
  2043.     */
  2044.     SELECT @subscriber_bit = 4
  2045.  
  2046.  
  2047.     /*
  2048.     ** Check if subscriber is valid
  2049.     */
  2050.  
  2051.     IF @subscriber IS NULL
  2052.         BEGIN
  2053.             RAISERROR (14043, 16, -1, '@subscriber')
  2054.             RETURN (1)
  2055.         END
  2056.  
  2057.  
  2058.     IF @subscriber <> '%'
  2059.         BEGIN
  2060.  
  2061.             EXECUTE @retcode = dbo.sp_validname @subscriber
  2062.             IF @retcode <> 0
  2063.                 RETURN (1)
  2064.  
  2065.             IF NOT EXISTS (SELECT *
  2066.                         FROM master..sysservers
  2067.                         WHERE UPPER(srvname) = UPPER(@subscriber) collate database_default
  2068.                         AND (srvstatus & @subscriber_bit) <> 0)
  2069.                 BEGIN
  2070.                     RAISERROR (14010, 16, -1)
  2071.                     RETURN (1)
  2072.                 END
  2073.         END
  2074.  
  2075.  
  2076.     /*
  2077.     ** Get distribution server information for remote RPC
  2078.     ** subscription calls.
  2079.     */
  2080.  
  2081.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  2082.                                        @distribdb   = @distribdb OUTPUT
  2083.  
  2084.     /* RAISEERROR is subscriber is not '%' */                                               
  2085.     IF @@error <> 0 OR @retcode <> 0 OR @distribdb IS NULL OR @distributor IS NULL
  2086.         BEGIN
  2087.         IF @subscriber <> '%'
  2088.             BEGIN
  2089.                 RAISERROR (14071, 16, -1)
  2090.                 RETURN (1)
  2091.             END
  2092.         ELSE
  2093.             RETURN 0
  2094.         END
  2095.  
  2096.      create table #subscriber_info
  2097.      (
  2098.         publisher  sysname collate database_default not null,
  2099.         subscriber  sysname collate database_default not null,
  2100.         type tinyint not null,           /* 0: MS SQL Server 1: ODBC Data Source */
  2101.         login sysname collate database_default null, 
  2102.         password nvarchar(524) NULL,
  2103.         commit_batch_size int not null,  -- commit_batch_size, no longer supported
  2104.         status_batch_size int not null,  -- status_batch_size, no longer supported
  2105.         flush_frequency int not null,  -- flush_frequency, no longer supported
  2106.         frequency_type int not null,
  2107.         frequency_interval int not null,
  2108.         frequency_relative_interval int not null,
  2109.         frequency_recurrence_factor int not null,
  2110.         frequency_subday int not null,
  2111.         frequency_subday_interval int not null,
  2112.         active_start_time_of_day int not null,
  2113.         active_end_time_of_day int not null,
  2114.         active_start_date int not null,
  2115.         active_end_date int not null,
  2116.         retryattempt    int not null, -- retryattempt, no longer exist
  2117.         retrydelay  int not null,  -- retrydelay, no longer exist
  2118.         description nvarchar(255) collate database_default null,
  2119.         security_mode int not null,
  2120.         frequency_type2 int not null,
  2121.         frequency_interval2 int not null,
  2122.         frequency_relative_interval2 int not null,
  2123.         frequency_recurrence_factor2 int not null,
  2124.         frequency_subday2 int not null,
  2125.         frequency_subday_interval2 int not null,
  2126.         active_start_time_of_day2 int not null,
  2127.         active_end_time_of_day2 int not null,
  2128.         active_start_date2 int not null,
  2129.         active_end_date2 int not null
  2130.     )
  2131.  
  2132.     IF @@error <> 0
  2133.         RETURN (1)
  2134.      
  2135.     /*
  2136.     ** Retrieve MSsubscriber_info
  2137.     */
  2138.     if is_srvrolemember('sysadmin') = 1
  2139.         select @show_password = 1
  2140.     else
  2141.         select @show_password = 0
  2142.  
  2143.     SELECT @distproc = RTRIM(@distributor) + '.' +
  2144.         RTRIM(@distribdb) + '.dbo.sp_MShelp_subscriber_info'
  2145.  
  2146.     insert into #subscriber_info EXEC @retcode = @distproc 
  2147.         @publisher = @@SERVERNAME, 
  2148.         @subscriber = @subscriber,
  2149.         @show_password = @show_password
  2150.  
  2151.     IF @@error <> 0
  2152.         BEGIN
  2153.         RAISERROR (14071, 16, -1)
  2154.         RETURN (1)
  2155.     END
  2156.  
  2157.     IF @retcode <> 0
  2158.         BEGIN
  2159.         RAISERROR (14085, 16, -1)
  2160.         RETURN (1)
  2161.      END
  2162.  
  2163.     -- Filter out subscribers that are not defined locally but left at the distributor
  2164.     -- This will happen if the publisher is cleaned up when the distributor is offline.
  2165.     select info.* from #subscriber_info info, master..sysservers servers where
  2166.         UPPER(info.subscriber) = UPPER(servers.srvname) collate database_default and
  2167.         (servers.srvstatus & @subscriber_bit) <> 0
  2168.  
  2169. go
  2170.  
  2171. raiserror('Creating procedure sp_replica', 0,1)
  2172. GO
  2173.  
  2174. CREATE PROCEDURE sp_replica (
  2175.         @tabname nvarchar(92),     /* The table being replicated */
  2176.         @replicated nvarchar(5)    /* True or false */
  2177.         ) AS
  2178.  
  2179.     SET NOCOUNT ON
  2180.     RAISERROR (21023, 16, -1,'sp_replica')
  2181.     RETURN(1)
  2182. go
  2183.  
  2184.  
  2185. dump tran master with no_log
  2186. go
  2187.  
  2188. raiserror('Creating procedure sp_addpublisher', 0,1)
  2189. GO
  2190.  
  2191. CREATE PROCEDURE sp_addpublisher (
  2192.     @publisher sysname,      /* publisher server name */
  2193.     @type nvarchar (5) = NULL     /* NULL or 'dist' */
  2194.  ) AS
  2195.  
  2196.     SET NOCOUNT ON
  2197.     RAISERROR (21023, 16, -1,'sp_addpublisher')
  2198.     RETURN(1)
  2199. go
  2200.  
  2201. raiserror('Creating procedure sp_addsubscriber', 0,1)
  2202. GO
  2203.  
  2204. CREATE PROCEDURE sp_addsubscriber (
  2205.     @subscriber sysname,
  2206.     @type tinyint = 0,
  2207.     @login sysname = 'sa',
  2208.     @password sysname = NULL,
  2209.     @commit_batch_size int = 100,
  2210.     @status_batch_size int = 100,
  2211.     @flush_frequency int = 0,
  2212.     @frequency_type int = 64,
  2213.     @frequency_interval int = 1,
  2214.     @frequency_relative_interval int = 1,
  2215.     @frequency_recurrence_factor int = 0,
  2216.     @frequency_subday int = 4,
  2217.     @frequency_subday_interval int = 5,
  2218.     @active_start_time_of_day int = 0,
  2219.     @active_end_time_of_day int = 235959,
  2220.     @active_start_date int = 0,
  2221.     @active_end_date int = 99991231,
  2222.     @description nvarchar (255) = NULL,
  2223.     @security_mode int = 1,  /* backward compatible */ /* 0 standard; 1 integrated */
  2224.     @encrypted_password bit = 0
  2225.         ) AS
  2226.  
  2227.     DECLARE @distributor sysname
  2228.     DECLARE @distribdb sysname
  2229.     DECLARE @distproc nvarchar (300)
  2230.     DECLARE @retcode int
  2231.     DECLARE @dsn_subscriber tinyint
  2232.     DECLARE @jet_subscriber tinyint
  2233.     DECLARE @oledb_subscriber tinyint
  2234.     DECLARE @dist_rpcname sysname
  2235.     DECLARE @platform_nt binary
  2236.  
  2237.     -- Defined in sqlrepl.h
  2238.     select @dsn_subscriber = 1    /* Const: subscriber type 'dsn' */ 
  2239.     select @jet_subscriber = 2   
  2240.     select @oledb_subscriber = 3  
  2241.     
  2242.     select @platform_nt = 0x1
  2243.  
  2244.     /* 
  2245.     ** Check if replication components are installed on this server
  2246.     */
  2247.     exec @retcode = dbo.sp_MS_replication_installed
  2248.     if (@retcode <> 1)
  2249.     begin
  2250.         return (1)
  2251.     end
  2252.     
  2253.     /*
  2254.     ** Parameter Check:  @subscriber.
  2255.     ** Check to make sure that the subscriber doesn't already exist, and
  2256.     ** that the name is a valid non-null identifier.
  2257.     */
  2258.  
  2259.     IF @subscriber IS NULL
  2260.         BEGIN
  2261.             RAISERROR (14043, 16, -1, '@subscriber')
  2262.             RETURN (1)
  2263.         END
  2264.  
  2265.     EXECUTE @retcode = dbo.sp_validname @subscriber
  2266.  
  2267.     IF @@ERROR <> 0 OR @retcode <> 0
  2268.     RETURN (1)
  2269.  
  2270.     if LOWER(@subscriber) = 'all'
  2271.         BEGIN
  2272.             RAISERROR (14032, 16, -1, '@subscriber')
  2273.             RETURN (1)
  2274.         END
  2275.  
  2276.     /* 
  2277.     ** Check for invalid security mode
  2278.     */
  2279.     IF @security_mode < 0 OR @security_mode > 1
  2280.         BEGIN
  2281.             RAISERROR(14109, 16, -1)
  2282.             RETURN (1)
  2283.         END
  2284.  
  2285.     IF (UPPER(@subscriber) = UPPER(@@SERVERNAME) and @platform_nt != ( platform() & @platform_nt ) and @security_mode = 1)
  2286.         BEGIN
  2287.             RAISERROR(21038, 16, -1)
  2288.             RETURN (1)
  2289.         END
  2290.  
  2291.     IF EXISTS (SELECT *
  2292.                  FROM master..sysservers
  2293.                 WHERE UPPER(srvname) = UPPER(@subscriber) collate database_default
  2294.                   AND srvstatus & 4 <> 0)
  2295.  
  2296.         BEGIN
  2297.             RAISERROR (14040, 16, -1, @subscriber)
  2298.             RETURN (1)
  2299.         END
  2300.  
  2301.     IF @password = N''
  2302.         select @password = NULL
  2303.  
  2304.     
  2305.     /*
  2306.     **  If no MSsubscriber_info parameters skip RPC code.
  2307.     */
  2308.  
  2309.     IF @frequency_type = -1
  2310.         GOTO ADDSUB
  2311.  
  2312.     /*
  2313.     ** Get distribution server information for remote RPC
  2314.     ** subscription calls.
  2315.     */
  2316.  
  2317.  /*   BEGIN TRAN addsubscriber */
  2318.  
  2319.     EXEC @retcode = dbo.sp_helpdistributor  @distributor = @distributor OUTPUT,
  2320.                                         @rpcsrvname = @dist_rpcname OUTPUT,
  2321.                                         @distribdb   = @distribdb   OUTPUT
  2322.  
  2323.     IF @@error <> 0
  2324.         BEGIN
  2325.          RAISERROR (14071, 16, -1)
  2326.          goto undo
  2327.      END
  2328.  
  2329.     IF @retcode <> 0 OR @distribdb IS NULL OR @distributor IS NULL
  2330.         BEGIN
  2331.             RAISERROR (14071, 16, -1)
  2332.             goto undo
  2333.         END
  2334.  
  2335.  
  2336.     DECLARE @zeroint int
  2337.     SELECT @zeroint = 0
  2338.     /*
  2339.     ** Insert information into MSsubscriber_info
  2340.     */
  2341.     SELECT @distproc = RTRIM(@dist_rpcname) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSadd_subscriber_info'
  2342.     EXEC @retcode = @distproc
  2343.          @@SERVERNAME,
  2344.          @subscriber,
  2345.      @type,
  2346.      @login,
  2347.      @password,
  2348.      @commit_batch_size,
  2349.      @status_batch_size,
  2350.      @flush_frequency,
  2351.      @frequency_type,
  2352.      @frequency_interval,
  2353.      @frequency_relative_interval,
  2354.      @frequency_recurrence_factor,
  2355.      @frequency_subday,
  2356.      @frequency_subday_interval,
  2357.      @active_start_time_of_day,
  2358.      @active_end_time_of_day,
  2359.      @active_start_date,
  2360.      @active_end_date,
  2361.      /* Work around of server RPC  named parameter problem */
  2362.      @retryattempts = @zeroint,
  2363.      @retrydelay  = @zeroint,
  2364.      @description = @description,
  2365.      @security_mode = @security_mode,
  2366.      @encrypted_password = @encrypted_password
  2367.  
  2368.     IF @@error <> 0 OR @retcode <> 0
  2369.         BEGIN
  2370.         RAISERROR (14042, 16, -1)
  2371.         goto undo
  2372.     END
  2373.  
  2374.     /*
  2375.     ** add schedule information into MSsubscriber_schedule for merge agent
  2376.     */
  2377.     -- NOTE: We may need better default schedule for merge agent
  2378.     
  2379.     SELECT @distproc = RTRIM(@dist_rpcname) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSadd_subscriber_schedule'
  2380.     EXEC @retcode = @distproc
  2381.          @@SERVERNAME,
  2382.          @subscriber,
  2383.          0, -- agent_type = 0 means distribution agent
  2384.          @frequency_type,
  2385.          @frequency_interval,
  2386.          @frequency_relative_interval,
  2387.          @frequency_recurrence_factor,
  2388.          @frequency_subday,
  2389.          @frequency_subday_interval,
  2390.          @active_start_time_of_day,
  2391.          @active_end_time_of_day,
  2392.          @active_start_date,
  2393.          @active_end_date
  2394.     
  2395.     IF @@error <> 0 OR @retcode <> 0
  2396.         BEGIN
  2397.             RAISERROR (14042, 16, -1)
  2398.             goto undo
  2399.         END
  2400.  
  2401.     EXEC @retcode = @distproc
  2402.          @@SERVERNAME,
  2403.          @subscriber,
  2404.          1,             --agent_type = 0 means merge agent
  2405.          4,             --frequency_type,
  2406.          1,             --frequency_interval,
  2407.          1,             --frequency_relative_interval,
  2408.          0,             --frequency_recurrence_factor,
  2409.          8,             --frequency_subday,
  2410.          1,             --frequency_subday_interval,
  2411.          0,             --active_start_time_of_day,
  2412.          235959,        --active_end_time_of_day,
  2413.          0,             --active_start_date,
  2414.          99991231       --active_end_date
  2415.     
  2416.     IF @@error <> 0 OR @retcode <> 0
  2417.         BEGIN
  2418.             RAISERROR (14042, 16, -1)
  2419.             goto undo
  2420.         END
  2421.  
  2422. /*    Commit Transaction addsubscriber */
  2423.  
  2424. ADDSUB:
  2425.  
  2426.     /*
  2427.     ** The server may already be listed in master..sysservers, but might
  2428.     ** not be marked as a subscriber yet.  If it's not in
  2429.     ** master..sysservers, let's add it first.
  2430.     */
  2431.  
  2432.     IF NOT EXISTS (SELECT *
  2433.                          FROM master..sysservers
  2434.                         WHERE LOWER(srvname) = LOWER(@subscriber) collate database_default)
  2435.     begin
  2436.  
  2437.         EXECUTE @retcode = dbo.sp_addserver @subscriber
  2438.  
  2439.             IF @@error <> 0 OR @retcode <> 0
  2440.                 BEGIN
  2441.                 RAISERROR (14042, 16, -1)
  2442.                     RETURN (1)
  2443.                 END
  2444.     end
  2445.     ELSE
  2446.     BEGIN
  2447.         SELECT @subscriber = fn_getpersistedservernamecasevariation(@subscriber) collate database_default
  2448.     END
  2449.  
  2450.     /*
  2451.     ** Set the server option to indicate this is a subscriber.
  2452.     */
  2453.  
  2454.     EXECUTE @retcode = dbo.sp_serveroption @subscriber, 'sub', true
  2455.  
  2456.     IF @@error <> 0 OR @retcode <> 0
  2457.         BEGIN
  2458.            RAISERROR (14042, 16, -1)
  2459.            RETURN (1)
  2460.         END
  2461.  
  2462.     /*
  2463.     ** Set the server option to indicate this is a DSN subscriber.
  2464.     */
  2465.     if @type = @dsn_subscriber OR @type = @jet_subscriber OR @type = @oledb_subscriber
  2466.        BEGIN
  2467.           update master..sysservers set srvproduct = 'MSREPL-NONSQL' where
  2468.             UPPER(srvname) = UPPER(@subscriber) collate database_default
  2469.           IF @@error <> 0 
  2470.             return(1)
  2471.        END
  2472.     
  2473.         RETURN (0) 
  2474. undo:
  2475.  
  2476.     RETURN (1) 
  2477. GO
  2478.  
  2479. raiserror('Creating procedure sp_addsubscriber_schedule', 0,1)
  2480. GO
  2481.  
  2482. CREATE PROCEDURE sp_addsubscriber_schedule (
  2483.     @subscriber sysname,
  2484.     @agent_type smallint = 0,
  2485.     @frequency_type int = 64,
  2486.     @frequency_interval int = 1,
  2487.     @frequency_relative_interval int = 1,
  2488.     @frequency_recurrence_factor int = 0,
  2489.     @frequency_subday int = 4,
  2490.     @frequency_subday_interval int = 5,
  2491.     @active_start_time_of_day int = 0,
  2492.     @active_end_time_of_day int = 235959,
  2493.     @active_start_date int = 0,
  2494.     @active_end_date int = 99991231
  2495.         ) AS
  2496.  
  2497.     DECLARE @distributor sysname
  2498.     DECLARE @distribdb sysname
  2499.     DECLARE @distproc nvarchar (300)
  2500.     DECLARE @retcode int
  2501.     DECLARE @msg nvarchar(255)
  2502.     
  2503.     /*
  2504.     ** Parameter Check:  @subscriber.
  2505.     ** Check to make sure that the subscriber doesn't already exist, and
  2506.     ** that the name is a valid non-null identifier.
  2507.     */
  2508.  
  2509.     IF @subscriber IS NULL
  2510.         BEGIN
  2511.             RAISERROR (14043, 16, -1, '@subscriber')
  2512.             RETURN (1)
  2513.         END
  2514.  
  2515.     EXECUTE @retcode = dbo.sp_validname @subscriber
  2516.  
  2517.     IF @@ERROR <> 0 OR @retcode <> 0
  2518.     RETURN (1)
  2519.  
  2520.     if LOWER(@subscriber) = 'all'
  2521.         BEGIN
  2522.             RAISERROR (14032, 16, -1, '@subscriber')
  2523.             RETURN (1)
  2524.         END
  2525.  
  2526.     IF NOT EXISTS (SELECT * FROM master..sysservers WHERE UPPER(srvname) = UPPER(@subscriber) collate database_default)
  2527.         BEGIN
  2528.             RAISERROR (14048, 16, -1, @subscriber)
  2529.             RETURN (1)
  2530.         END
  2531.     
  2532.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  2533.                                        @distribdb   = @distribdb   OUTPUT
  2534.  
  2535.     IF @@error <> 0
  2536.         BEGIN
  2537.          RAISERROR (14071, 16, -1)
  2538.          RETURN (1)
  2539.      END
  2540.  
  2541.     IF @retcode <> 0 OR @distribdb IS NULL OR @distributor IS NULL
  2542.         BEGIN
  2543.             RAISERROR (14071, 16, -1)
  2544.             RETURN (1)
  2545.         END
  2546.     
  2547.     SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSadd_subscriber_schedule'
  2548.     EXEC @retcode = @distproc
  2549.          @@SERVERNAME,
  2550.          @subscriber,
  2551.          @agent_type,
  2552.          @frequency_type,
  2553.          @frequency_interval,
  2554.          @frequency_relative_interval,
  2555.          @frequency_recurrence_factor,
  2556.          @frequency_subday,
  2557.          @frequency_subday_interval,
  2558.          @active_start_time_of_day,
  2559.          @active_end_time_of_day,
  2560.          @active_start_date,
  2561.          @active_end_date
  2562.     
  2563.     IF @@error <> 0 OR @retcode <> 0
  2564.         BEGIN
  2565.         RAISERROR (14042, 16, -1)
  2566.         RETURN (1)
  2567.     END
  2568.  
  2569.     RETURN (0)
  2570. GO
  2571.  
  2572. raiserror('Creating procedure sp_changesubscriber', 0,1)
  2573. GO
  2574.  
  2575. CREATE PROCEDURE sp_changesubscriber (
  2576.     @subscriber sysname,
  2577.     @type tinyint = NULL,
  2578.     @login sysname = NULL,
  2579.     @password sysname = '%',
  2580.     @commit_batch_size int = NULL,
  2581.     @status_batch_size int = NULL,
  2582.     @flush_frequency int = NULL,
  2583.     @frequency_type int = NULL,
  2584.     @frequency_interval int = NULL,
  2585.     @frequency_relative_interval int = NULL,
  2586.     @frequency_recurrence_factor int = NULL,
  2587.     @frequency_subday int = NULL,
  2588.     @frequency_subday_interval int = NULL,
  2589.     @active_start_time_of_day int = NULL,
  2590.     @active_end_time_of_day int = NULL,
  2591.     @active_start_date int = NULL,
  2592.     @active_end_date int = NULL,
  2593.     @description nvarchar (255) = NULL,
  2594.     @security_mode int = NULL /* 0 standard; 1 integrated */
  2595.  
  2596.         ) AS
  2597.  
  2598.     DECLARE @distributor sysname
  2599.     DECLARE @distribdb sysname
  2600.     DECLARE @distproc nvarchar (300)
  2601.     DECLARE @msg nvarchar(255)
  2602.     DECLARE @retcode int
  2603.     DECLARE @platform_nt binary
  2604.  
  2605.     select @platform_nt = 0x1
  2606.  
  2607.     IF (UPPER(@subscriber) = UPPER(@@SERVERNAME) and @platform_nt != ( platform() & @platform_nt ) and @security_mode = 1)
  2608.         BEGIN
  2609.             RAISERROR(21038, 16, -1)
  2610.             RETURN (1)
  2611.         END
  2612.  
  2613.     /*
  2614.     ** Check to make sure that the subscriber exists.
  2615.     */
  2616.     IF NOT EXISTS (SELECT *
  2617.                  FROM master..sysservers
  2618.                 WHERE UPPER(srvname) = UPPER(@subscriber) collate database_default)
  2619.         BEGIN
  2620.             RAISERROR(14048, 16, 1, @subscriber)
  2621.             RETURN (1)
  2622.         END
  2623.  
  2624.     /*
  2625.     ** Get distribution server information for remote RPC
  2626.     ** subscription calls.
  2627.     */
  2628.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  2629.         @distribdb = @distribdb OUTPUT
  2630.     IF @@ERROR <> 0 OR @retcode <> 0
  2631.         BEGIN
  2632.             RAISERROR (14071, 16, -1)
  2633.             RETURN (1)
  2634.         END
  2635.  
  2636.     DECLARE @intnull int
  2637.     /*
  2638.     ** Update MSsubscriber_info
  2639.     */
  2640.     SELECT @distproc = RTRIM(@distributor) + '.' +
  2641.         RTRIM(@distribdb) + '.dbo.sp_MSupdate_subscriber_info'
  2642.     EXEC @retcode = @distproc
  2643.         @@SERVERNAME,
  2644.         @subscriber,
  2645.     @type,
  2646.     @login,
  2647.     @password,
  2648.     @commit_batch_size,
  2649.     @status_batch_size,
  2650.     @flush_frequency,
  2651.     @frequency_type,
  2652.     @frequency_interval,
  2653.     @frequency_relative_interval,
  2654.     @frequency_recurrence_factor,
  2655.     @frequency_subday,
  2656.     @frequency_subday_interval,
  2657.     @active_start_time_of_day,
  2658.     @active_end_time_of_day,
  2659.     @active_start_date,
  2660.     @active_end_date,
  2661.     @retryattempts = @intnull,
  2662.     @retrydelay  = @intnull,
  2663.     @description = @description,
  2664.     @security_mode = @security_mode
  2665.     IF @@ERROR <> 0 OR @retcode <> 0
  2666.         BEGIN
  2667.             RAISERROR (14048, 16, -1, @subscriber)
  2668.             RETURN (1)
  2669.     END
  2670. go
  2671.  
  2672. raiserror('Creating procedure sp_changesubscriber_schedule', 0,1)
  2673. GO
  2674.  
  2675. CREATE PROCEDURE sp_changesubscriber_schedule (
  2676.     @subscriber sysname,
  2677.     @agent_type smallint,
  2678.     @frequency_type int = NULL,
  2679.     @frequency_interval int = NULL,
  2680.     @frequency_relative_interval int = NULL,
  2681.     @frequency_recurrence_factor int = NULL,
  2682.     @frequency_subday int = NULL,
  2683.     @frequency_subday_interval int = NULL,
  2684.     @active_start_time_of_day int = NULL,
  2685.     @active_end_time_of_day int = NULL,
  2686.     @active_start_date int = NULL,
  2687.     @active_end_date int = NULL
  2688.         ) AS
  2689.  
  2690.     DECLARE @distributor sysname
  2691.     DECLARE @distribdb sysname
  2692.     DECLARE @distproc nvarchar (300)
  2693.     DECLARE @msg nvarchar(255)
  2694.     DECLARE @retcode int
  2695.  
  2696.     /*
  2697.     ** Check to make sure that the subscriber DOES exist.
  2698.     */
  2699.     IF NOT EXISTS (SELECT *
  2700.                  FROM master..sysservers
  2701.                 WHERE UPPER(srvname) = UPPER(@subscriber) collate database_default)
  2702.         BEGIN
  2703.             RAISERROR (14048, 16, -1, @subscriber)
  2704.             RETURN (1)
  2705.         END
  2706.  
  2707.     /*
  2708.     ** Get distribution server information for remote RPC
  2709.     ** subscription calls.
  2710.     */
  2711.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  2712.         @distribdb = @distribdb OUTPUT
  2713.     IF @@ERROR <> 0 OR @retcode <> 0
  2714.          BEGIN
  2715.             RAISERROR (14071, 16, -1)
  2716.              RETURN (1)
  2717.          END
  2718.  
  2719.     /*
  2720.     ** Update MSsubscriber_info
  2721.     */
  2722.     SELECT @distproc = RTRIM(@distributor) + '.' +
  2723.         RTRIM(@distribdb) + '.dbo.sp_MSupdate_subscriber_schedule'
  2724.     EXEC @retcode = @distproc
  2725.         @@SERVERNAME,
  2726.         @subscriber,
  2727.         @agent_type,
  2728.         @frequency_type,
  2729.         @frequency_interval,
  2730.         @frequency_relative_interval,
  2731.         @frequency_recurrence_factor,
  2732.         @frequency_subday,
  2733.         @frequency_subday_interval,
  2734.         @active_start_time_of_day,
  2735.         @active_end_time_of_day,
  2736.         @active_start_date,
  2737.         @active_end_date
  2738.     
  2739.     IF @@ERROR <> 0 OR @retcode <> 0
  2740.         BEGIN
  2741.             RAISERROR (14048, 16, -1, @subscriber)
  2742.             RETURN (1)
  2743.         END
  2744.         
  2745.     RETURN (0)  
  2746. go 
  2747.     
  2748. raiserror('Creating procedure sp_distcounters', 0,1)
  2749. GO
  2750.  
  2751. CREATE PROCEDURE sp_distcounters
  2752.     AS
  2753.  
  2754.     SET NOCOUNT ON
  2755.  
  2756.     /*
  2757.     ** Declarations.
  2758.     */
  2759.     DECLARE @distributor sysname
  2760.     DECLARE @distribdb sysname
  2761.     DECLARE @distproc nvarchar (300)
  2762.     DECLARE @retcode int
  2763.  
  2764.     /*
  2765.     ** Get distribution server information for remote RPC
  2766.     ** subscription calls.  If no distribution information, assume
  2767.     ** replication is not being used.
  2768.     */
  2769.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  2770.                                        @distribdb = @distribdb OUTPUT
  2771.     IF @@error <> 0 OR @retcode <> 0 OR @distributor IS NULL OR
  2772.        @distribdb IS NULL
  2773.     RETURN (1)
  2774.  
  2775.     /*
  2776.     ** Request counters from Distribution Server
  2777.     */
  2778.     SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) +
  2779.     '.dbo.sp_MSdistribution_counters'
  2780.     EXEC @retcode = @distproc @@SERVERNAME
  2781. go
  2782.  
  2783.  
  2784. raiserror('Creating procedure sp_droppublisher', 0,1)
  2785. GO
  2786.  
  2787. CREATE PROCEDURE sp_droppublisher (
  2788.     @publisher sysname,         /* publisher server name */
  2789.     @type nvarchar (5) = NULL      /* NULL or 'dist' */
  2790.         ) AS
  2791.  
  2792.     SET NOCOUNT ON
  2793.     RAISERROR (21023, 16, -1,'sp_droppublisher')
  2794.     RETURN(1)
  2795.  
  2796. go
  2797.  
  2798. raiserror('Creating procedure sp_dropsubscriber', 0,1)
  2799. GO
  2800.  
  2801. CREATE PROCEDURE sp_dropsubscriber (
  2802.     @subscriber sysname,        /* The name of the subscriber */
  2803.     @reserved nvarchar(50) = NULL,
  2804.     @ignore_distributor bit = 0
  2805.         ) AS
  2806.  
  2807.     SET NOCOUNT ON
  2808.  
  2809.     /*
  2810.     ** Declarations.
  2811.     */
  2812.  
  2813.     DECLARE @db_name sysname
  2814.     DECLARE @foundSubscription int
  2815.     DECLARE @command nvarchar(255)
  2816.     DECLARE @transpublishdb_bit int
  2817.     DECLARE @mergepublishdb_bit int
  2818.     DECLARE @distributor sysname
  2819.     DECLARE @distribdb sysname
  2820.     DECLARE @distproc nvarchar (300)
  2821.     DECLARE @retcode int
  2822.     DECLARE @type nvarchar(10)
  2823.  
  2824.     SELECT @transpublishdb_bit = 1
  2825.     SELECT @mergepublishdb_bit = 4
  2826.  
  2827.  
  2828.     /*
  2829.     ** Parameter Check:  @subscriber.
  2830.     ** Check to make sure that the subscriber exists.
  2831.     */
  2832.  
  2833.     IF @subscriber IS NULL
  2834.         BEGIN
  2835.             RAISERROR (14043, 16, -1, '@subscriber')
  2836.             RETURN (1)
  2837.         END
  2838.  
  2839.     EXECUTE @retcode = dbo.sp_validname @subscriber
  2840.  
  2841.     IF @retcode <> 0
  2842.     RETURN (1)
  2843.  
  2844.     IF lower(@subscriber) <> 'all' and NOT EXISTS (SELECT *
  2845.                      FROM master..sysservers
  2846.                     WHERE UPPER(srvname) = UPPER(@subscriber) collate database_default
  2847.                       AND srvstatus & 4 <> 0)
  2848.  
  2849.         BEGIN
  2850.             RAISERROR (14048, 16, -1, @subscriber)
  2851.             RETURN (1)
  2852.         END
  2853.  
  2854.     if lower(@subscriber) = 'all'
  2855.     begin
  2856.         DECLARE hCdropsubscriber_all CURSOR LOCAL FAST_FORWARD FOR
  2857.             SELECT srvname
  2858.                      FROM master..sysservers
  2859.                     WHERE srvstatus & 4 <> 0
  2860.         FOR READ ONLY
  2861.         OPEN hCdropsubscriber_all
  2862.         FETCH hCdropsubscriber_all INTO @subscriber
  2863.     
  2864.         WHILE (@@fetch_status <> -1)
  2865.         BEGIN
  2866.             EXECUTE @retcode  = dbo.sp_dropsubscriber
  2867.                 @subscriber = @subscriber,    
  2868.                 @ignore_distributor = @ignore_distributor,
  2869.                 @reserved = @reserved
  2870.             IF @@ERROR <> 0 OR @retcode <> 0
  2871.             BEGIN
  2872.                 CLOSE hCdropsubscriber_all
  2873.                 DEALLOCATE hCdropsubscriber_all
  2874.                 RETURN (1)
  2875.             END
  2876.             FETCH hCdropsubscriber_all INTO @subscriber
  2877.         end
  2878.         
  2879.         CLOSE hCdropsubscriber_all
  2880.         DEALLOCATE hCdropsubscriber_all
  2881.  
  2882.         return(0)
  2883.     end
  2884.  
  2885.  
  2886.     /*
  2887.     ** There should be no subscription by the subscriber
  2888.     ** Open a cursor the published databases.
  2889.     **
  2890.     */
  2891.     DECLARE hCdropsubscriber CURSOR LOCAL FAST_FORWARD FOR
  2892.             SELECT name, N'tran' FROM master..sysdatabases      
  2893.                 WHERE (category & @transpublishdb_bit) <> 0 
  2894.         UNION
  2895.             select name, N'merge' from master..sysdatabases      
  2896.                 WHERE (category & @mergepublishdb_bit) <> 0 
  2897.     FOR READ ONLY
  2898.  
  2899.     OPEN hCdropsubscriber
  2900.     FETCH hCdropsubscriber INTO @db_name, @type
  2901.     
  2902.     WHILE (@@fetch_status <> -1)
  2903.     BEGIN        
  2904.         IF LOWER(@reserved) = 'drop_subscriptions'
  2905.         BEGIN
  2906.             if @type = 'tran'
  2907.             begin
  2908.                 SELECT @command = quotename(@db_name) + '.dbo.sp_dropsubscription'
  2909.                 EXECUTE @retcode  = @command 
  2910.                     @publication = 'all', 
  2911.                     @article = 'all', 
  2912.                     @subscriber = @subscriber,
  2913.                     @ignore_distributor = @ignore_distributor
  2914.             end
  2915.             if @type = 'merge'
  2916.             begin
  2917.                 SELECT @command = quotename(@db_name) + '.dbo.sp_dropmergesubscription'
  2918.                 EXECUTE @retcode  = @command 
  2919.                     @publication = 'all', 
  2920.                     @subscriber = @subscriber,
  2921.                     @subscription_type = 'both',
  2922.                     @ignore_distributor = @ignore_distributor
  2923.             end
  2924.             IF @@ERROR <> 0 OR @retcode <> 0
  2925.             BEGIN
  2926.                 CLOSE hCdropsubscriber
  2927.                 DEALLOCATE hCdropsubscriber
  2928.                 RETURN (1)
  2929.             END
  2930.         END
  2931.         
  2932.         -- Set @foundSubscription to not null so that sp_helpsubscription will not display
  2933.         -- result set
  2934.         select @foundSubscription = 0
  2935.  
  2936.         if @type = 'tran'
  2937.         begin
  2938.             SELECT @command = quotename(@db_name) + '.dbo.sp_helpsubscription'
  2939.             EXECUTE @retcode  = @command @publication = '%', @article = '%', 
  2940.                 @subscriber = @subscriber,
  2941.                 @found = @foundSubscription  OUTPUT
  2942.  
  2943.             IF @@ERROR <> 0 OR @retcode <> 0
  2944.             BEGIN
  2945.                 CLOSE hCdropsubscriber
  2946.                 DEALLOCATE hCdropsubscriber
  2947.                 RETURN (1)
  2948.             END
  2949.         end
  2950.         else
  2951.         begin
  2952.             SELECT @command = quotename(@db_name) + '.dbo.sp_helpmergesubscription'
  2953.             EXECUTE @retcode  = @command @publication = '%', 
  2954.                 @subscriber = @subscriber,
  2955.                 @subscription_type = 'both',
  2956.                 @found = @foundSubscription  OUTPUT
  2957.  
  2958.             IF @@ERROR <> 0 OR @retcode <> 0
  2959.             BEGIN
  2960.                 CLOSE hCdropsubscriber
  2961.                 DEALLOCATE hCdropsubscriber
  2962.                 RETURN (1)
  2963.             END
  2964.         end
  2965.  
  2966.  
  2967.         IF @foundSubscription <> 0
  2968.         BEGIN
  2969.             CLOSE hCdropsubscriber
  2970.             DEALLOCATE hCdropsubscriber
  2971.             RAISERROR ( 14144,  16, -1, @subscriber, @db_name)
  2972.             RETURN (1)
  2973.         END
  2974.  
  2975.         FETCH hCdropsubscriber INTO @db_name, @type
  2976.  
  2977.     END
  2978.     
  2979.     CLOSE hCdropsubscriber
  2980.     DEALLOCATE hCdropsubscriber
  2981.  
  2982.     /*
  2983.     ** Drop the subsubscriber_info in the distribution database
  2984.     */
  2985.     /*
  2986.     ** if @ignore_distributor = 1, we are in bruteforce cleanup mode, don't do RPC.
  2987.     */
  2988.     if @ignore_distributor = 0
  2989.     begin
  2990.  
  2991.  
  2992.         /*
  2993.         ** Get distribution server information for remote RPC
  2994.         ** agent verification.
  2995.         */
  2996.         EXEC @retcode = dbo.sp_helpdistributor 
  2997.             @rpcsrvname = @distributor OUTPUT,
  2998.             @distribdb = @distribdb OUTPUT
  2999.         IF @@error <> 0 OR @retcode <> 0
  3000.             BEGIN
  3001.             RAISERROR (14071, 16, -1)
  3002.                RETURN (1)
  3003.         END
  3004.         
  3005.         /*
  3006.         ** Insert information into MSsubscriber_info in the distribution db
  3007.         */
  3008.         if @distribdb is not null
  3009.         begin
  3010.             SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSdrop_subscriber_info'
  3011.             EXEC @retcode = @distproc
  3012.                  @publisher = @@SERVERNAME,
  3013.                  @subscriber = @subscriber
  3014.  
  3015.             IF @@error <> 0 OR @retcode <> 0
  3016.                 BEGIN
  3017.                 RAISERROR (14042, 16, -1)
  3018.                 RETURN (1)
  3019.             END
  3020.         end
  3021.     end
  3022.  
  3023.     -- We have already validated the existence of the server at this point
  3024.     SELECT @subscriber = fn_getpersistedservernamecasevariation(@subscriber) collate database_default
  3025.  
  3026.     /*
  3027.     ** Turn off the subscriber server option.
  3028.     */
  3029.     EXECUTE @retcode = dbo.sp_serveroption @subscriber, 'sub', false
  3030.     IF @@ERROR <> 0 OR @retcode <> 0
  3031.     BEGIN
  3032.        RAISERROR (14047, 16, -1, @subscriber)
  3033.        RETURN (1)
  3034.     END
  3035.  
  3036.     RAISERROR (14062, 10, -1)
  3037. go
  3038.  
  3039. raiserror('Creating procedure sp_dsninfo', 0,1)
  3040. GO
  3041.  
  3042. CREATE PROCEDURE sp_dsninfo
  3043. --  xp_dsninfo does not support unicode
  3044.     @dsn varchar(128),
  3045.     @infotype varchar(128) = NULL,
  3046.     @login varchar(128) = NULL,
  3047.     @password varchar(128) = NULL,
  3048.     @dso_type int = 1  /* 1 is ODBC, 3 OLEDB. */
  3049.     AS
  3050.  
  3051.     SET NOCOUNT ON
  3052.  
  3053.     DECLARE @distributor sysname
  3054.     DECLARE @distproc nvarchar (300)
  3055.     DECLARE @retcode int
  3056.     DECLARE @dsotype_odbc int
  3057.     DECLARE @dsotype_oledb int
  3058.  
  3059.     select @dsotype_odbc = 1
  3060.     select @dsotype_oledb = 3
  3061.  
  3062.     /*
  3063.     ** Get distribution server information for remote RPC
  3064.     ** subscription calls.
  3065.     */
  3066.  
  3067.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT
  3068.     IF @@error <> 0 OR @retcode <> 0
  3069.         BEGIN
  3070.         RAISERROR (14071, 16, -1)
  3071.             RETURN (1)
  3072.     END
  3073.  
  3074.     if (@dso_type = @dsotype_odbc)
  3075.     begin
  3076.         /*
  3077.         ** Call xp_dsninfo
  3078.         */
  3079.         SELECT @distproc = RTRIM(@distributor) + '.master..xp_dsninfo'
  3080.         EXEC @retcode = @distproc @dsn, @infotype, @login, @password
  3081.         IF @@error <> 0
  3082.             BEGIN
  3083.             RAISERROR (14071, 16, -1)
  3084.             RETURN (1)
  3085.         END
  3086.     end
  3087.     else if (@dso_type = @dsotype_oledb)
  3088.     begin
  3089.         /*
  3090.         ** Call sp_oledbinfo
  3091.         */
  3092.         EXEC @retcode = master.dbo.sp_oledbinfo @dsn, @infotype, @login, @password
  3093.         IF @@error <> 0
  3094.             BEGIN
  3095.             RAISERROR (14071, 16, -1)
  3096.             RETURN (1)
  3097.         END
  3098.     end
  3099.  
  3100. go
  3101.  
  3102. dump tran master with no_log
  3103. go
  3104.  
  3105. raiserror('Creating procedure sp_publishdb', 0,1)
  3106. GO
  3107.  
  3108. /* For backward compatible */
  3109. CREATE PROCEDURE sp_publishdb @dbname sysname,@value nvarchar (5)
  3110.     AS
  3111.  
  3112.     DECLARE @retcode int
  3113.  
  3114.     EXECUTE @retcode = dbo.sp_replicationdboption @dbname, 'publish', @value
  3115.  
  3116.     IF @@ERROR <> 0 or @retcode <> 0
  3117.     BEGIN
  3118.        RETURN (1)
  3119.     END
  3120.  
  3121.     RETURN(0)
  3122. go
  3123.  
  3124.  
  3125. raiserror('Creating procedure sp_MScreate_dist_tables', 0,1)
  3126. GO
  3127.  
  3128. CREATE PROCEDURE sp_MScreate_dist_tables
  3129. AS
  3130.  
  3131.    /*
  3132.    ** Important:  
  3133.    ** We use varbinary(16) for xact_id and xact_seqno, we don't want ending nulls
  3134.    ** to be truncated by the server
  3135.    **
  3136.    ** Also, in MSrepl_commands, we don't want ending space to be truncated.  
  3137.    */
  3138.    SET ANSI_PADDING ON
  3139.  
  3140.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSrepl_version' and type = 'U')
  3141.    BEGIN
  3142.       /****************************************************************************/
  3143.       raiserror('Creating table MSrepl_version', 0,1)
  3144.       /****************************************************************************/
  3145.       CREATE TABLE dbo.MSrepl_version
  3146.       (
  3147.       major_version int NOT NULL,
  3148.       minor_version int NOT NULL,
  3149.       revision int NOT NULL,
  3150.       db_existed bit NULL
  3151.       )
  3152.       CREATE UNIQUE CLUSTERED INDEX ucMSrepl_version ON dbo.MSrepl_version
  3153.                     (major_version, minor_version, revision)
  3154.     
  3155.       EXEC dbo.sp_MS_marksystemobject 'MSrepl_version'
  3156.       
  3157.       INSERT INTO MSrepl_version VALUES (7,0,0,0)
  3158.    END
  3159.  
  3160.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSpublisher_databases' and type = 'U')
  3161.    BEGIN
  3162.       /****************************************************************************/
  3163.       raiserror('Creating table MSpublisher_databases', 0,1)
  3164.       /****************************************************************************/
  3165.       CREATE TABLE dbo.MSpublisher_databases(
  3166.         publisher_id smallint NOT NULL,
  3167.         publisher_db sysname NULL,
  3168.         id int identity NOT NULL,                   
  3169.     )
  3170.       EXEC dbo.sp_MS_marksystemobject 'MSpublisher_databases'
  3171.  
  3172.       raiserror('Creating clustered index ucMSpublisher_databases', 0,1)
  3173.       CREATE UNIQUE CLUSTERED INDEX ucMSpublisher_databases ON dbo.MSpublisher_databases
  3174.      (publisher_id, publisher_db, id)
  3175.    END
  3176.  
  3177.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSpublications' and type = 'U')
  3178.    BEGIN
  3179.       /****************************************************************************/
  3180.       raiserror('Creating table MSpublications', 0,1)
  3181.       /****************************************************************************/
  3182.       CREATE TABLE dbo.MSpublications (
  3183.         publisher_id smallint NOT NULL,
  3184.         publisher_db sysname NULL,
  3185.         publication sysname NOT NULL,
  3186.         publication_id int identity NOT NULL,   -- This id IS NOT the same as the SQL Server publisher's
  3187.         publication_type int NOT NULL,          -- 0 = Snapshot 1 = Transactional
  3188.         thirdparty_flag bit NOT NULL,           -- 0 = SQL Server 1 = Third Party
  3189.         independent_agent bit NOT NULL,
  3190.         immediate_sync bit NOT NULL,
  3191.         allow_push bit NOT NULL,
  3192.         allow_pull bit NOT NULL,
  3193.         allow_anonymous bit NOT NULL,
  3194.         description nvarchar(255) NULL,
  3195.         vendor_name nvarchar(100) NULL,
  3196.         retention    int NULL,
  3197.         sync_method int default 0 NOT NULL,
  3198.         allow_subscription_copy bit default 0 not null,
  3199.         thirdparty_options int null,
  3200.         allow_queued_tran bit default 0    not null
  3201.         )
  3202.       EXEC dbo.sp_MS_marksystemobject 'MSpublications'
  3203.  
  3204.      -- publication_id needs to be the first columns in the index. It
  3205.      -- is used in sp_MSmaximum_cleanup_seqno.
  3206.       raiserror('Creating clustered index ucMSpublications', 0,1)
  3207.       CREATE UNIQUE CLUSTERED INDEX ucMSpublications ON dbo.MSpublications
  3208.      (publication_id,  publication, publisher_db, publisher_id)
  3209.  
  3210.    END
  3211.    ELSE
  3212.    BEGIN
  3213.       IF NOT EXISTS (select * from syscolumns
  3214.         where name = 'sync_method'
  3215.         and id=object_id('MSpublications'))
  3216.       BEGIN
  3217.          ALTER TABLE MSpublications ADD sync_method int default 0 not null
  3218.       END
  3219.  
  3220.       IF NOT EXISTS (select * from syscolumns
  3221.         where name = 'allow_subscription_copy'
  3222.         and id=object_id('MSpublications'))
  3223.       BEGIN
  3224.          ALTER TABLE MSpublications ADD allow_subscription_copy bit default 0 not null
  3225.       END
  3226.       IF NOT EXISTS (select * from syscolumns
  3227.         where name = 'thirdparty_options'
  3228.         and id=object_id('MSpublications'))
  3229.       BEGIN
  3230.          ALTER TABLE MSpublications ADD thirdparty_options int null
  3231.       END
  3232.  
  3233.       IF NOT EXISTS (select * from syscolumns
  3234.         where name = 'allow_queued_tran'
  3235.         and id=object_id('MSpublications'))
  3236.       BEGIN
  3237.          ALTER TABLE MSpublications ADD allow_queued_tran bit default 0    not null
  3238.       END
  3239.    END
  3240.  
  3241.  
  3242.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSarticles' and type = 'U')
  3243.    BEGIN
  3244.       /****************************************************************************/
  3245.       raiserror('Creating table MSarticles', 0,1)
  3246.       /****************************************************************************/
  3247.     CREATE TABLE dbo.MSarticles (
  3248.         publisher_id smallint NOT NULL,
  3249.         publisher_db sysname NULL,
  3250.         publication_id int NOT NULL,
  3251.         article sysname NOT NULL,
  3252.         article_id int NOT NULL,                            -- This id is the same as a SQL Server Publisher's
  3253.         destination_object sysname NULL,
  3254.         source_owner    sysname NULL,
  3255.         source_object sysname NULL,
  3256.         description nvarchar(255) NULL
  3257.     )   
  3258.  
  3259.       EXEC dbo.sp_MS_marksystemobject 'MSarticles'
  3260.  
  3261.       raiserror('Creating clustered index ucMSarticles', 0,1)
  3262.       CREATE UNIQUE CLUSTERED INDEX ucMSarticles ON dbo.MSarticles
  3263.      (publisher_db, publisher_id, article_id, article, publication_id)
  3264.    END
  3265.  
  3266.     IF NOT EXISTS( SELECT * FROM sysobjects WHERE name = 'MSsync_states' )
  3267.     BEGIN
  3268.         CREATE TABLE dbo.MSsync_states
  3269.         (
  3270.             publisher_id smallint not null,
  3271.             publisher_db sysname not null,
  3272.             publication_id int not null 
  3273.         )
  3274.         EXEC dbo.sp_MS_marksystemobject 'MSsync_states'
  3275.  
  3276.         CREATE UNIQUE CLUSTERED INDEX ucMSsyncstates on dbo.MSsync_states
  3277.         ( publisher_id, publisher_db, publication_id )
  3278.     END
  3279.  
  3280.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsubscriptions' and type = 'U')
  3281.    BEGIN
  3282.       /****************************************************************************/
  3283.       raiserror('Creating table MSsubscriptions', 0,1)
  3284.       /****************************************************************************/
  3285.        CREATE TABLE dbo.MSsubscriptions
  3286.       (
  3287.         publisher_database_id int NOT NULL,         -- Used to reference MSrepl_transactions and MSrepl_commands
  3288.         publisher_id smallint NOT NULL,
  3289.         publisher_db sysname NOT NULL,
  3290.         publication_id int NOT NULL,
  3291.         article_id int NOT NULL,
  3292.         subscriber_id smallint NOT NULL,
  3293.         subscriber_db sysname NOT NULL,
  3294.         subscription_type int NOT NULL,         -- 0 = push, 1 = pull, 2 = anonymous 
  3295.         sync_type tinyint NOT NULL,                 -- 1 = automatic 2 = no sync
  3296.         status tinyint NOT NULL,                        -- 0 = inactive, 1 = subscribed, 2 = active 
  3297.         subscription_seqno varbinary(16) NOT NULL,  -- publisher's database sequence number 
  3298.         snapshot_seqno_flag bit NOT NULL,               -- 1 if subscription_seqno is the snapshot seqno
  3299.         independent_agent bit NOT NULL,             -- Value carried over from MSpublications
  3300.         subscription_time datetime NOT NULL, 
  3301.         loopback_detection bit NOT NULL,  
  3302.         agent_id int NOT NULL,
  3303.         update_mode tinyint NOT NULL,                -- 0 = read only, 1 = sync tran, 2 = queued tran, 
  3304.                                                     -- 3 = failover, 4 = sqlqueued tran, 5 = sqlqueued failover
  3305.         publisher_seqno varbinary(16) NOT NULL,
  3306.         ss_cplt_seqno   varbinary(16) NOT NULL
  3307.       )
  3308.  
  3309.       EXEC dbo.sp_MS_marksystemobject 'MSsubscriptions'
  3310.  
  3311.       raiserror('Creating clustered index ucMSsubscirptions', 0,1)
  3312.       CREATE UNIQUE CLUSTERED INDEX ucMSsubscriptions ON dbo.MSsubscriptions
  3313.       (agent_id, article_id)
  3314.  
  3315.       -- Index used by sp_MSdelete_publisherdb_trans
  3316.       raiserror('Creating index iMSsubscriptions', 0,1)
  3317.       CREATE INDEX iMSsubscriptions ON dbo.MSsubscriptions
  3318.       (publisher_database_id, article_id, subscriber_id, subscriber_db, publication_id, publisher_db, publisher_id)
  3319.     END
  3320.     ELSE
  3321.     BEGIN
  3322.         if not exists ( select * from syscolumns 
  3323.                         where id = object_id( N'MSsubscriptions' ) 
  3324.                         and name = N'ss_cplt_seqno' )
  3325.         begin                
  3326.             exec ('alter table MSsubscriptions add ss_cplt_seqno varbinary(16) NULL')
  3327.             exec ('update MSsubscriptions set ss_cplt_seqno = publisher_seqno')
  3328.             exec ('alter table MSsubscriptions alter column ss_cplt_seqno varbinary(16) NOT NULL')
  3329.         end
  3330.     END
  3331.  
  3332.    -- For beta 3 upgrade, we need to create new index here.
  3333.    if not exists (select * from sysindexes where name = 'iMSsubscriptions2')
  3334.    begin
  3335.       -- Index used by sp_MSdelete_publisherdb_trans
  3336.       raiserror('Creating index iMSsubscriptions2', 0,1)
  3337.       CREATE INDEX iMSsubscriptions2 ON dbo.MSsubscriptions
  3338.       (publisher_database_id, subscription_seqno)
  3339.    end
  3340.  
  3341.    
  3342.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSmerge_subscriptions' and type = 'U')
  3343.    BEGIN
  3344.       /****************************************************************************/
  3345.       raiserror('Creating table MSmerge_subscriptions', 0,1)
  3346.       /****************************************************************************/
  3347.        CREATE TABLE dbo.MSmerge_subscriptions
  3348.       (
  3349.         publisher_id smallint NOT NULL,
  3350.         publisher_db sysname NULL,
  3351.         publication_id int NOT NULL,
  3352.         subscriber_id smallint NOT NULL,
  3353.         subscriber_db sysname NULL,
  3354.         subscription_type int NULL,         -- 0 = push, 1 = pull, 2 = anonymous 
  3355.         sync_type tinyint NOT NULL,                 -- 1 = automatic 2 = no sync
  3356.         status tinyint NOT NULL,                        -- 0 = inactive, 1 = subscribed, 2 = active 
  3357.         subscription_time datetime NOT NULL
  3358.       )
  3359.  
  3360.       EXEC dbo.sp_MS_marksystemobject 'MSmerge_subscriptions'
  3361.  
  3362.       raiserror('Creating clustered index ucMSmerge_subscriptions', 0,1)
  3363.       CREATE UNIQUE CLUSTERED INDEX ucMSmerge_subscriptions ON dbo.MSmerge_subscriptions
  3364.      (publisher_id, publisher_db, publication_id, subscriber_id, subscriber_db)
  3365.    END
  3366.  
  3367.  
  3368.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSrepl_transactions' and type = 'U')
  3369.    BEGIN
  3370.       /****************************************************************************/
  3371.       raiserror('Creating table MSrepl_transactions', 0,1)
  3372.       /****************************************************************************/
  3373.       CREATE TABLE dbo.MSrepl_transactions
  3374.       (
  3375.       publisher_database_id int NOT NULL,
  3376.       xact_id varbinary(16) NULL,
  3377.       xact_seqno varbinary (16 )  NOT NULL,
  3378.       entry_time datetime  NOT NULL
  3379.       )
  3380.  
  3381.       EXEC dbo.sp_MS_marksystemobject 'MSrepl_transactions'
  3382.  
  3383.       raiserror('Creating clustered index usMSrepl_transactions', 0,1)
  3384.       CREATE UNIQUE CLUSTERED INDEX ucMSrepl_transactions ON dbo.MSrepl_transactions
  3385.          (publisher_database_id, xact_seqno)
  3386.          WITH STATISTICS_NORECOMPUTE
  3387.  
  3388.       CREATE STATISTICS stat_publisher_database_id
  3389.          ON MSrepl_transactions (publisher_database_id)
  3390.          WITH NORECOMPUTE
  3391.  
  3392.       CREATE STATISTICS stat_xact_id
  3393.          ON MSrepl_transactions (xact_id)
  3394.          WITH NORECOMPUTE
  3395.  
  3396.       CREATE STATISTICS stat_xact_seqno
  3397.          ON MSrepl_transactions (xact_seqno)
  3398.          WITH NORECOMPUTE
  3399.  
  3400.       CREATE STATISTICS stat_entry_time
  3401.          ON MSrepl_transactions (entry_time)
  3402.          WITH NORECOMPUTE
  3403.  
  3404.    END
  3405.  
  3406.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSrepl_commands' and type = 'U')
  3407.    BEGIN
  3408.  
  3409.       /****************************************************************************/
  3410.       raiserror('Creating table MSrepl_commands', 0,1)
  3411.       /****************************************************************************/
  3412.  
  3413.  
  3414.       CREATE TABLE dbo.MSrepl_commands (
  3415.       publisher_database_id int not null,
  3416.       xact_seqno varbinary(16) not null,
  3417.       type int not null, 
  3418.       article_id int not null,
  3419.       originator_id int not null,
  3420.       command_id int not null,
  3421.       partial_command bit not null,
  3422.       command varbinary(1024) NULL
  3423.       )
  3424.  
  3425.  
  3426.       EXEC dbo.sp_MS_marksystemobject 'MSrepl_commands'
  3427.  
  3428.       raiserror('Creating clusterd index ucMSrepl_commands', 0,1)
  3429.       CREATE UNIQUE CLUSTERED INDEX ucMSrepl_commands ON dbo.MSrepl_commands
  3430.          (publisher_database_id, xact_seqno, command_id)
  3431.          WITH STATISTICS_NORECOMPUTE
  3432.  
  3433.       CREATE STATISTICS stat_xact_seqno
  3434.          ON MSrepl_commands (xact_seqno)
  3435.          WITH NORECOMPUTE
  3436.  
  3437.       CREATE STATISTICS stat_type
  3438.          ON MSrepl_commands (type)
  3439.          WITH NORECOMPUTE
  3440.  
  3441.       CREATE STATISTICS stat_article_id
  3442.          ON MSrepl_commands (article_id)
  3443.          WITH NORECOMPUTE
  3444.  
  3445.       CREATE STATISTICS stat_originator_id
  3446.          ON MSrepl_commands (originator_id)
  3447.          WITH NORECOMPUTE
  3448.  
  3449.       CREATE STATISTICS stat_command_id
  3450.          ON MSrepl_commands (command_id)
  3451.          WITH NORECOMPUTE
  3452.  
  3453.       CREATE STATISTICS stat_partial_command
  3454.          ON MSrepl_commands (partial_command)
  3455.          WITH NORECOMPUTE
  3456.  
  3457.    END
  3458.  
  3459.  
  3460.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSrepl_originators' and type = 'U')
  3461.    BEGIN
  3462.       /****************************************************************************/
  3463.       raiserror('Creating table MSrepl_orginators', 0,1)
  3464.       /****************************************************************************/
  3465.       CREATE TABLE dbo.MSrepl_originators
  3466.       (
  3467.       id int identity not null,
  3468.       publisher_database_id int not null,
  3469.       srvname   sysname not null,
  3470.       dbname    sysname not null
  3471.       )
  3472.  
  3473.       EXEC dbo.sp_MS_marksystemobject 'MSrepl_originators'
  3474.  
  3475.       raiserror('Creating clustered index usMSrepl_originators', 0,1)
  3476.       CREATE UNIQUE CLUSTERED INDEX ucMSrepl_originators ON dbo.MSrepl_originators
  3477.          (publisher_database_id, srvname, dbname)
  3478.    END
  3479.  
  3480.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsubscriber_info' and type = 'U')
  3481.    BEGIN
  3482.       /****************************************************************************/
  3483.       raiserror('Creating table MSsubscriber_info', 0,1)
  3484.       /****************************************************************************/
  3485.       CREATE TABLE dbo.MSsubscriber_info
  3486.       (
  3487.       publisher  sysname NOT NULL,
  3488.       subscriber  sysname NOT NULL,
  3489.       type tinyint NOT NULL,           /* 0: MS SQL Server 1: ODBC Data Source */
  3490.       login sysname NULL,
  3491.       password nvarchar(524) NULL,
  3492.       description nvarchar(255) NULL,
  3493.       security_mode int NOT NULL
  3494.       )
  3495.  
  3496.       EXEC dbo.sp_MS_marksystemobject 'MSsubscriber_info'
  3497.  
  3498.       raiserror('Creating clustered index ucMSsubscriber_info', 0,1)
  3499.       CREATE UNIQUE CLUSTERED INDEX ucMSsubscriber_info ON dbo.MSsubscriber_info
  3500.      (publisher, subscriber)
  3501.    END
  3502.    ELSE
  3503.    BEGIN
  3504.       IF NOT EXISTS (select * from syscolumns
  3505.         where name = 'description'
  3506.         and id=object_id('MSsubscriber_info'))
  3507.       BEGIN
  3508.          
  3509.          ALTER TABLE MSsubscriber_info ADD description nvarchar (255) NULL
  3510.          UPDATE MSsubscriber_info SET description = 'SQL Server 6.0'
  3511.       END
  3512.    END
  3513.  
  3514.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsubscriber_schedule' and type = 'U')
  3515.    BEGIN
  3516.          raiserror('Creating table MSsubscriber_schedule', 0,1)
  3517.          
  3518.         CREATE TABLE dbo.MSsubscriber_schedule
  3519.         (
  3520.             publisher  sysname NOT NULL,
  3521.             subscriber  sysname NOT NULL,
  3522.             agent_type      smallint NOT NULL,   -- 0 for distribution agent, 1 for merge agent
  3523.             frequency_type int NOT NULL,
  3524.             frequency_interval int NOT NULL,
  3525.             frequency_relative_interval int NOT NULL,
  3526.             frequency_recurrence_factor int NOT NULL,
  3527.             frequency_subday int NOT NULL,
  3528.             frequency_subday_interval int NOT NULL,
  3529.             active_start_time_of_day int NOT NULL,
  3530.             active_end_time_of_day int NOT NULL,
  3531.             active_start_date int NOT NULL,
  3532.             active_end_date int NOT NULL
  3533.         )
  3534.       EXEC dbo.sp_MS_marksystemobject 'MSsubscriber_schedule'
  3535.  
  3536.         CREATE UNIQUE CLUSTERED INDEX ucMSsubscriber_schedule ON dbo.MSsubscriber_schedule
  3537.      (publisher, subscriber, agent_type)
  3538.      
  3539.     END
  3540.  
  3541.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsnapshot_history' and type = 'U')
  3542.    BEGIN
  3543.         /****************************************************************************/
  3544.          raiserror('Creating table MSsnapshot_history', 0,1)
  3545.         /****************************************************************************/
  3546.         CREATE TABLE dbo.MSsnapshot_history 
  3547.         (
  3548.         agent_id int NOT NULL,
  3549.         runstatus int NOT NULL,
  3550.         start_time datetime NOT NULL,        
  3551.         time datetime NOT NULL,    
  3552.         duration int NOT NULL,            
  3553.         comments nvarchar(255) NOT NULL,
  3554.  
  3555.         -- Session summary statistics
  3556.         delivered_transactions int NOT NULL,
  3557.         delivered_commands int NOT NULL,
  3558.         delivery_rate float NOT NULL,
  3559.  
  3560.         error_id int NOT NULL,
  3561.         timestamp NOT NULL
  3562.     )
  3563.  
  3564.       EXEC dbo.sp_MS_marksystemobject 'MSsnapshot_history'
  3565.  
  3566.      raiserror('Creating clustered index ucMSsnapshot_history', 0,1)
  3567.     CREATE UNIQUE CLUSTERED INDEX ucMSsnapshot_history ON dbo.MSsnapshot_history
  3568.         (agent_id, timestamp, start_time, time)
  3569.  
  3570.     if not exists (select * from sysindexes where name = 'nc1MSsnapshot_history')
  3571.     begin
  3572.          raiserror('Creating clustered index nc1MSsnapshot_history', 0,1)
  3573.         create nonclustered index nc1MSsnapshot_history on MSsnapshot_history(agent_id, start_time) 
  3574.     end    
  3575.  
  3576.    END
  3577.        
  3578.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSlogreader_history' and type = 'U')
  3579.    BEGIN
  3580.         /****************************************************************************/
  3581.         raiserror('Creating table MSlogreader_history', 0,1)
  3582.         /****************************************************************************/    
  3583.         CREATE TABLE dbo.MSlogreader_history
  3584.         (
  3585.         agent_id int NOT NULL,
  3586.         runstatus int NOT NULL,
  3587.         start_time datetime NOT NULL,
  3588.         time datetime NOT NULL,
  3589.         duration int NOT NULL,
  3590.         comments nvarchar(255) NOT NULL,
  3591.         xact_seqno varbinary(16) NULL,
  3592.  
  3593.         -- Session summary statistics
  3594.         delivery_time int NOT NULL,
  3595.         delivered_transactions int NOT NULL,
  3596.         delivered_commands int NOT NULL,
  3597.         average_commands int NOT NULL,
  3598.         delivery_rate float NOT NULL,
  3599.         delivery_latency int NOT NULL,
  3600.  
  3601.         error_id int NOT NULL,
  3602.         timestamp NOT NULL
  3603.         )
  3604.  
  3605.       EXEC dbo.sp_MS_marksystemobject 'MSlogreader_history'
  3606.  
  3607.     raiserror('Creating clustered index ucMSlogreader_history', 0,1)
  3608.     CREATE UNIQUE CLUSTERED INDEX ucMSlogreader_history ON dbo.MSlogreader_history
  3609.         (agent_id, timestamp, runstatus, start_time, time) 
  3610.  
  3611.     if not exists (select * from sysindexes where name = 'nc1MSlogreader_history')
  3612.     begin
  3613.         raiserror('Creating nonclustered index nc1MSlogreader_history', 0,1)
  3614.         create nonclustered index nc1MSlogreader_history on MSlogreader_history(agent_id, start_time) 
  3615.     end    
  3616.  
  3617.    END
  3618.  
  3619.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSdistribution_history' and type = 'U')
  3620.    BEGIN
  3621.         /****************************************************************************/
  3622.           raiserror('Creating table MSdistribution_history', 0,1)
  3623.         /****************************************************************************/    
  3624.  
  3625.         CREATE TABLE dbo.MSdistribution_history
  3626.         (
  3627.         agent_id int NOT NULL,
  3628.         runstatus int NOT NULL,
  3629.         start_time datetime NOT NULL,
  3630.         time datetime NOT NULL,
  3631.         duration int NOT NULL,
  3632.         comments nvarchar(255) NOT NULL,
  3633.         xact_seqno varbinary(16) NULL,
  3634.  
  3635.         -- Current statistics
  3636.         current_delivery_rate float NOT NULL,
  3637.         current_delivery_latency int NOT NULL,
  3638.  
  3639.         -- Session summary statistics
  3640.         delivered_transactions int NOT NULL,
  3641.         delivered_commands int NOT NULL,
  3642.         average_commands int NOT NULL,
  3643.         delivery_rate float NOT NULL,       
  3644.         delivery_latency int NOT NULL, 
  3645.  
  3646.         -- Summary statistics across all sessions
  3647.         total_delivered_commands int NOT NULL, 
  3648.  
  3649.         error_id int NOT NULL,
  3650.         updateable_row bit NOT NULL,
  3651.         timestamp NOT NULL
  3652.         )
  3653.  
  3654.     EXEC dbo.sp_MS_marksystemobject 'MSdistribution_history'
  3655.  
  3656.     raiserror('Creating clustered index ucMSdistribution_history', 0,1)
  3657.     CREATE UNIQUE CLUSTERED INDEX ucMSdistribution_history ON dbo.MSdistribution_history
  3658.         (agent_id, timestamp, runstatus, start_time, time) 
  3659.  
  3660.  
  3661.     if not exists (select * from sysindexes where name = 'nc1MSdistribution_history')
  3662.     begin
  3663.         raiserror('Creating clustered index nc1MSdistribution_history', 0,1)
  3664.         create nonclustered index nc1MSdistribution_history on MSdistribution_history(agent_id, start_time) 
  3665.     end    
  3666.  
  3667.    END
  3668.  
  3669.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSmerge_history' and type = 'U')
  3670.    BEGIN
  3671.         /****************************************************************************/
  3672.       raiserror('Creating table MSmerge_history', 0,1)
  3673.         /****************************************************************************/    
  3674.  
  3675.         CREATE TABLE dbo.MSmerge_history
  3676.         (
  3677.         agent_id                    int             NOT NULL,
  3678.         runstatus               int             NOT NULL,
  3679.         start_time              datetime        NOT NULL,
  3680.         time                    datetime        NOT NULL,
  3681.         duration                int             NOT NULL,
  3682.         comments                nvarchar(255)   NOT NULL,
  3683.         delivery_time               int         NOT NULL,
  3684.         delivery_rate               float       NOT NULL,
  3685.         publisher_insertcount       int         NULL,
  3686.         publisher_updatecount       int         NULL,
  3687.         publisher_deletecount       int         NULL,
  3688.         publisher_conflictcount     int         NULL,
  3689.         subscriber_insertcount      int         NULL,
  3690.         subscriber_updatecount      int         NULL,
  3691.         subscriber_deletecount      int         NULL,
  3692.         subscriber_conflictcount    int         NULL,
  3693.         error_id                    int         NOT NULL,
  3694.         timestamp                               NOT NULL,
  3695.         updateable_row                bit            NOT NULL
  3696.         )        
  3697.  
  3698.     EXEC dbo.sp_MS_marksystemobject 'MSmerge_history'
  3699.  
  3700.     raiserror('Creating clustered index ucMSmerge_history', 0,1)
  3701.     CREATE UNIQUE CLUSTERED INDEX ucMSmerge_history ON dbo.MSmerge_history
  3702.         (agent_id, timestamp, runstatus) 
  3703.         
  3704.     if not exists (select * from sysindexes where name = 'nc1MSmerge_history')
  3705.         begin
  3706.             raiserror('Creating nonclustered index nc1MSmerge_history', 0,1)
  3707.             create nonclustered index nc1MSmerge_history on MSmerge_history(agent_id, runstatus, start_time) 
  3708.         end
  3709.    END
  3710.    ELSE
  3711.    BEGIN
  3712.       IF NOT EXISTS (select * from syscolumns
  3713.         where name = 'updateable_row'
  3714.         and id=object_id('MSmerge_history'))
  3715.       BEGIN 
  3716.          ALTER TABLE MSmerge_history ADD updateable_row bit default 1 NOT NULL
  3717.       END
  3718.  
  3719.       if not exists (select * from sysindexes where name = 'nc1MSmerge_history' and id=object_id('MSmerge_history'))
  3720.       begin
  3721.             raiserror('Creating nonclustered index nc1MSmerge_history', 0,1)
  3722.             create nonclustered index nc1MSmerge_history on MSmerge_history(agent_id, runstatus, start_time) 
  3723.       end    
  3724.    END
  3725.  
  3726.  
  3727.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSrepl_errors' and type = 'U')
  3728.    BEGIN
  3729.         /****************************************************************************/
  3730.         raiserror('Creating table MSrepl_errors', 0,1)
  3731.         /****************************************************************************/    
  3732.  
  3733.         CREATE TABLE dbo.MSrepl_errors
  3734.         (
  3735.         id                  int NOT NULL,
  3736.         time                datetime NOT NULL,
  3737.         error_type_id       int NULL,
  3738.         source_type_id      int NULL,
  3739.         source_name         nvarchar(100) NULL,
  3740.         error_code          sysname NULL,
  3741.         error_text          ntext NULL,
  3742.         xact_seqno            varbinary(16) NULL,
  3743.         command_id            int NULL
  3744.         )
  3745.  
  3746.       EXEC dbo.sp_MS_marksystemobject 'MSrepl_errors'
  3747.  
  3748.     raiserror('Creating clustered index ucMSrepl_errors', 0,1)
  3749.     CREATE CLUSTERED INDEX ucMSrepl_errors ON dbo.MSrepl_errors
  3750.         (id, time) -- WITH ALLOW_DUP_ROW
  3751.    END
  3752.    ELSE
  3753.    BEGIN
  3754.       IF NOT EXISTS (select * from syscolumns
  3755.         where name = 'xact_seqno'
  3756.         and id=object_id('MSrepl_errors'))
  3757.          ALTER TABLE MSrepl_errors ADD xact_seqno varbinary(16) NULL
  3758.  
  3759.       IF NOT EXISTS (select * from syscolumns
  3760.         where name = 'command_id'
  3761.         and id=object_id('MSrepl_errors'))
  3762.          ALTER TABLE MSrepl_errors ADD command_id int NULL
  3763.    END
  3764.  
  3765.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsnapshot_agents' and type = 'U')
  3766.    BEGIN
  3767.         /****************************************************************************/
  3768.         raiserror('Creating table MSsnapshot_agents', 0,1)
  3769.         /****************************************************************************/    
  3770.  
  3771.         CREATE TABLE dbo.MSsnapshot_agents
  3772.         (
  3773.         id                  int IDENTITY NOT NULL,
  3774.         name                nvarchar(100) NOT NULL,
  3775.         publisher_id        smallint NOT NULL,
  3776.         publisher_db        sysname NOT NULL,
  3777.         publication         sysname NOT NULL,
  3778.         publication_type    int NOT NULL,       -- 0 transactional 1 snapshot 2 merge
  3779.         local_job           bit NOT NULL,
  3780.         job_id              binary(16) NULL,
  3781.         profile_id  int     NOT NULL
  3782.         )
  3783.  
  3784.       EXEC dbo.sp_MS_marksystemobject 'MSsnapshot_agents'
  3785.  
  3786.     raiserror('Creating clustered index ucMSsnapshot_agents', 0,1)
  3787.     CREATE CLUSTERED INDEX ucMSsnapshot_agents ON dbo.MSsnapshot_agents
  3788.         (publication, publisher_db, publisher_id) 
  3789.  
  3790.     raiserror('Creatingindex iMSsnapshot_agents', 0,1)
  3791.     CREATE UNIQUE INDEX iMSsnapshot_agents ON dbo.MSsnapshot_agents
  3792.         (id)
  3793.    END
  3794.  
  3795.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSlogreader_agents' and type = 'U')
  3796.    BEGIN
  3797.         /****************************************************************************/
  3798.         raiserror('Creating table MSlogreader_agents', 0,1)
  3799.         /****************************************************************************/    
  3800.  
  3801.         CREATE TABLE dbo.MSlogreader_agents
  3802.         (
  3803.         id                  int IDENTITY NOT NULL,
  3804.         name                nvarchar(100) NOT NULL,
  3805.         publisher_id        smallint NOT NULL,
  3806.         publisher_db        sysname NOT NULL,
  3807.         publication         sysname NOT NULL,-- Not used for SQL Server publisher
  3808.         local_job           bit NOT NULL,
  3809.         job_id              binary(16) NULL,
  3810.         profile_id  int     NOT NULL
  3811.         )
  3812.  
  3813.       EXEC dbo.sp_MS_marksystemobject 'MSlogreader_agents'
  3814.  
  3815.     raiserror('Creating clustered index ucMSlogreader_agents', 0,1)
  3816.     CREATE CLUSTERED INDEX ucMSlogreader_agents ON dbo.MSlogreader_agents
  3817.         (publisher_db, publisher_id) 
  3818.  
  3819.     raiserror('Creatingindex iMSlogreader_agents', 0,1)
  3820.     CREATE UNIQUE INDEX iMSlogreader_agents ON dbo.MSlogreader_agents
  3821.         (id)
  3822.    END
  3823.  
  3824.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSdistribution_agents' and type = 'U')
  3825.    BEGIN
  3826.         /****************************************************************************/
  3827.         raiserror('Creating table MSdistribution_agents', 0,1)
  3828.         /****************************************************************************/    
  3829.  
  3830.         CREATE TABLE dbo.MSdistribution_agents
  3831.         (
  3832.         id                  int IDENTITY NOT NULL,
  3833.         name                nvarchar(100) NOT NULL,
  3834.         publisher_database_id int NOT NULL,
  3835.         publisher_id        smallint NOT NULL,
  3836.         publisher_db        sysname NOT NULL,
  3837.         publication         sysname NOT NULL,
  3838.         subscriber_id       smallint NULL, 
  3839.         subscriber_db       sysname NULL,
  3840.         subscription_type   int NOT NULL,
  3841.         local_job           bit NULL,
  3842.         job_id              binary(16) NULL,
  3843.         subscription_guid   binary(16) NOT NULL,
  3844.         profile_id  int     NOT NULL,
  3845.         anonymous_subid     uniqueidentifier NULL,
  3846.         subscriber_name     sysname NULL,
  3847.         virtual_agent_id    int NULL,
  3848.         anonymous_agent_id  int NULL,
  3849.         creation_date        datetime default (getdate()) not NULL,
  3850.         queue_id            sysname null,
  3851.         queue_status        int default 0 not null,
  3852.         offload_enabled     bit default 0 NOT NULL,
  3853.         offload_server      sysname NULL,
  3854.         dts_package_name    sysname NULL,
  3855.         dts_package_password nvarchar(524) NULL,
  3856.         dts_package_location int default 0 not null,
  3857.         sid                    varbinary(85) default suser_sid() not null
  3858.         )
  3859.  
  3860.         EXEC dbo.sp_MS_marksystemobject 'MSdistribution_agents'
  3861.  
  3862.         raiserror('Creating clustered index ucMSdistribution_agents', 0,1)
  3863.         CREATE UNIQUE CLUSTERED INDEX ucMSdistribution_agents ON dbo.MSdistribution_agents
  3864.             (id)
  3865.  
  3866.         raiserror('Creatingindex iMSdistribution_agents', 0,1)
  3867.         CREATE INDEX iMSdistribution_agents ON dbo.MSdistribution_agents
  3868.             (publication, publisher_db, publisher_id, subscriber_id, subscriber_db, anonymous_subid) 
  3869.    END
  3870.  
  3871.     if not exists (select * from syscolumns where 
  3872.         id = object_id('MSdistribution_agents') and
  3873.         name = 'creation_date')
  3874.     begin
  3875.         alter table MSdistribution_agents add creation_date datetime default (getdate()) not null
  3876.     end 
  3877.  
  3878.     if not exists (select * from syscolumns where 
  3879.         id = object_id('MSdistribution_agents') and
  3880.         name = 'offload_enabled')
  3881.     begin
  3882.         alter table MSdistribution_agents add offload_enabled bit default 0 not null
  3883.     end 
  3884.  
  3885.     if not exists (select * from syscolumns where 
  3886.         id = object_id('MSdistribution_agents') and
  3887.         name = 'offload_server')
  3888.     begin
  3889.         alter table MSdistribution_agents add offload_server sysname null
  3890.     end 
  3891.  
  3892.     if not exists (select * from syscolumns where 
  3893.         id = object_id('MSdistribution_agents') and
  3894.         name = 'queue_id')
  3895.     begin
  3896.         alter table MSdistribution_agents add queue_id sysname null
  3897.     end 
  3898.  
  3899.     if not exists (select * from syscolumns where 
  3900.         id = object_id('MSdistribution_agents') and
  3901.         name = 'queue_status')
  3902.     begin
  3903.         alter table MSdistribution_agents add queue_status int default 0 not null
  3904.     end 
  3905.  
  3906.     if not exists (select * from syscolumns where 
  3907.         id = object_id('MSdistribution_agents') and
  3908.         name = 'dts_package_name')
  3909.     begin
  3910.         alter table MSdistribution_agents add dts_package_name sysname null
  3911.     end 
  3912.     if not exists (select * from syscolumns where 
  3913.         id = object_id('MSdistribution_agents') and
  3914.         name = 'dts_package_password')
  3915.     begin
  3916.         alter table MSdistribution_agents add dts_package_password nvarchar(524) null
  3917.     end 
  3918.  
  3919.     if not exists (select * from syscolumns where 
  3920.         id = object_id('MSdistribution_agents') and
  3921.         name = 'dts_package_location')
  3922.     begin
  3923.         alter table MSdistribution_agents add dts_package_location int default 0 not null
  3924.     end 
  3925.  
  3926.     if not exists (select * from syscolumns where 
  3927.         id = object_id('MSdistribution_agents') and
  3928.         name = 'sid')
  3929.     begin
  3930.         -- set sid to be the upgrade user. db_owner or sysadmin
  3931.         -- can drop the agent entry
  3932.         alter table MSdistribution_agents add sid varbinary(85) default suser_sid() not null
  3933.     end 
  3934.  
  3935.    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSmerge_agents' and type = 'U')
  3936.    BEGIN
  3937.         /****************************************************************************/
  3938.         raiserror('Creating table MSmerge_agents', 0,1)
  3939.         /****************************************************************************/    
  3940.  
  3941.         CREATE TABLE dbo.MSmerge_agents
  3942.         (
  3943.         id                  int IDENTITY NOT NULL,
  3944.         name                nvarchar(100) NOT NULL,
  3945.         publisher_id        smallint NOT NULL,
  3946.         publisher_db        sysname NOT NULL,
  3947.         publication         sysname NOT NULL,
  3948.         subscriber_id       smallint NULL,
  3949.         subscriber_db       sysname NULL,
  3950.         local_job           bit NULL,
  3951.         job_id              binary(16) NULL,
  3952.         profile_id          int NULL,
  3953.         anonymous_subid     uniqueidentifier NULL,
  3954.         subscriber_name     sysname NULL,
  3955.         creation_date        datetime default (getdate()) not NULL,
  3956.         offload_enabled     bit default 0 NOT NULL,
  3957.         offload_server      sysname NULL,
  3958.         sid                    varbinary(85) default suser_sid() not null
  3959.         )
  3960.  
  3961.       EXEC dbo.sp_MS_marksystemobject 'MSmerge_agents'
  3962.  
  3963.     raiserror('Creating clustered index ucMSmerge_agents', 0,1)
  3964.     CREATE CLUSTERED INDEX ucMSmerge_agents ON dbo.MSmerge_agents
  3965.         (publication, publisher_db, publisher_id, subscriber_id, subscriber_db, anonymous_subid) 
  3966.     
  3967.     raiserror('Creatingindex iMSmerge_agents', 0,1)
  3968.     CREATE UNIQUE INDEX iMSmerge_agents ON dbo.MSmerge_agents
  3969.         (id)
  3970.     END
  3971.  
  3972.  
  3973.     -- Need to re_visit the indexing of this table
  3974.     if not exists (select * from sysobjects where name = 'MSrepl_identity_range')
  3975.         begin        
  3976.             raiserror('Creating table MSrepl_identity_range',0,1)
  3977.             
  3978.             create table dbo.MSrepl_identity_range (
  3979.             publisher                sysname not NULL, 
  3980.             publisher_db            sysname    not NULL,
  3981.             tablename                sysname not NULL,
  3982.             identity_support        int NULL,
  3983.             next_seed                bigint NULL, --resource control
  3984.             pub_range                bigint NULL, --publisher range
  3985.             range                    bigint NULL, -- set by sp_addmergearticle
  3986.             max_identity            bigint NULL, --resource control
  3987.             threshold                int    NULL,    --in percentage, set by sp_addmergearticle
  3988.             current_max                bigint NULL    --max value for current check constraint,set by sp_addmergearticle
  3989.             )
  3990.             exec dbo.sp_MS_marksystemobject MSrepl_identity_range
  3991.  
  3992.             grant select on MSrepl_identity_range to public
  3993.         end
  3994.  
  3995.     if not exists (select * from syscolumns where 
  3996.         id = object_id('MSmerge_agents') and
  3997.         name = 'creation_date')
  3998.     begin
  3999.         alter table MSmerge_agents add creation_date datetime default (getdate()) not null
  4000.     end 
  4001.  
  4002.     if not exists (select * from syscolumns where 
  4003.         id = object_id('MSmerge_agents') and
  4004.         name = 'offload_enabled')
  4005.     begin
  4006.         alter table MSmerge_agents add offload_enabled bit default 0 not null
  4007.     end 
  4008.  
  4009.     if not exists (select * from syscolumns where 
  4010.         id = object_id('MSmerge_agents') and
  4011.         name = 'offload_server')
  4012.     begin
  4013.         alter table MSmerge_agents add offload_server sysname null
  4014.     end 
  4015.  
  4016.     if not exists (select * from syscolumns where 
  4017.         id = object_id('MSmerge_agents') and
  4018.         name = 'sid')
  4019.     begin
  4020.         -- set sid to be the upgrade user. db_owner or sysadmin
  4021.         -- can drop the agent entry
  4022.         alter table MSmerge_agents add sid varbinary(85) default suser_sid() not null
  4023.     end 
  4024.  
  4025.     IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSpublication_access' and type = 'U')
  4026.     BEGIN
  4027.         /****************************************************************************/
  4028.         raiserror('Creating table MSpublication_access', 0,1)
  4029.         /****************************************************************************/    
  4030.  
  4031.         CREATE TABLE dbo.MSpublication_access
  4032.         (
  4033.         publication_id      int NULL,       -- Publication_id is unique in distribution database.
  4034.         login               sysname NOT NULL
  4035.                                             -- Logins in the publication access list, they nust
  4036.                                             -- exist at both publisher and distributor side.            
  4037.         )
  4038.  
  4039.         EXEC dbo.sp_MS_marksystemobject 'MSpublication_access'
  4040.  
  4041.         raiserror('Creating clustered index ucMSpublication_access', 0,1)
  4042.         CREATE UNIQUE CLUSTERED INDEX ucMSpublication_access ON dbo.MSpublication_access
  4043.             (publication_id, login) 
  4044.     END
  4045.  
  4046.     -- For b3 upgrade
  4047.     if NOT EXISTS (select * from syscolumns where name='retention' and id=object_id('MSpublications'))
  4048.     begin
  4049.         alter table MSpublications add retention int NULL 
  4050.         UPDATE msdb..MSdistributiondbs set max_distretention=72 where
  4051.             name = db_name() collate database_default
  4052.     end
  4053.  
  4054.     -- drop default_access column
  4055.     if exists (select * from syscolumns where id = object_id('MSpublications') and
  4056.         name = 'default_access')
  4057.     begin
  4058.         alter table MSpublications drop column default_access
  4059.     end 
  4060.  
  4061.     -- Drop publisher_id column
  4062.     if EXISTS (select * from syscolumns where name='publisher_id' and id=object_id('MSpublication_access'))
  4063.     begin
  4064.         drop index MSpublication_access.ucMSpublication_access
  4065.  
  4066.         alter table MSpublication_access drop column publisher_id
  4067.  
  4068.         raiserror('Creating clustered index ucMSpublication_access', 0,1)
  4069.         CREATE CLUSTERED INDEX ucMSpublication_access ON dbo.MSpublication_access
  4070.         (publication_id, login) 
  4071.     end
  4072.  
  4073.     IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSqreader_agents' and type = 'U')
  4074.     BEGIN
  4075.         /****************************************************************************/
  4076.         raiserror('Creating table MSqreader_agents', 0,1)
  4077.         /****************************************************************************/    
  4078.  
  4079.         CREATE TABLE dbo.MSqreader_agents
  4080.         (
  4081.         id                  int IDENTITY NOT NULL,
  4082.         name                nvarchar(100) NULL,
  4083.         job_id              binary(16) NULL,
  4084.         profile_id          int NULL
  4085.         )
  4086.  
  4087.       EXEC dbo.sp_MS_marksystemobject 'MSqreader_agents'
  4088.  
  4089.     raiserror('Creating unique index ucMSqreader_agents', 0,1)
  4090.     CREATE UNIQUE INDEX ucMSqreader_agents ON dbo.MSqreader_agents
  4091.         (id)
  4092.    END
  4093.  
  4094.     -- add columns for existing table
  4095.     if not exists (select * from syscolumns where 
  4096.         id = object_id('MSqreader_agents') and
  4097.         name = 'profile_id')
  4098.     begin
  4099.         alter table dbo.MSqreader_agents add profile_id int NULL
  4100.     end 
  4101.    
  4102.  
  4103.     IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSqreader_history' and type = 'U')
  4104.     BEGIN
  4105.     /****************************************************************************/
  4106.     raiserror('Creating table MSqreader_history', 0,1)
  4107.     /****************************************************************************/    
  4108.  
  4109.     CREATE TABLE dbo.MSqreader_history
  4110.     (
  4111.     agent_id int NOT NULL,
  4112.     publication_id int NULL,
  4113.     runstatus int NOT NULL,
  4114.     start_time datetime NOT NULL,
  4115.     time datetime NOT NULL,
  4116.     duration int NOT NULL,
  4117.     comments nvarchar(255) NOT NULL,
  4118.     transaction_id nvarchar(40) NULL, 
  4119.     transaction_status int NULL,
  4120.     transactions_processed int NULL DEFAULT 0,
  4121.     commands_processed int NULL DEFAULT 0,
  4122.     delivery_rate float NOT NULL DEFAULT 0.0,
  4123.     transaction_rate float NOT NULL DEFAULT 0.0,
  4124.     subscriber sysname NULL,
  4125.     subscriberdb sysname NULL,
  4126.     error_id int NULL,    
  4127.     timestamp NOT NULL
  4128.     )
  4129.  
  4130.     EXEC dbo.sp_MS_marksystemobject 'MSqreader_history'
  4131.  
  4132.     raiserror('Creating clustered index ucMSqreader_history', 0,1)
  4133.     CREATE CLUSTERED INDEX ucMSqreader_history ON dbo.MSqreader_history
  4134.     (agent_id, timestamp, runstatus, start_time, time) 
  4135.     END
  4136.  
  4137.     -- alter column publication_id
  4138.     if not exists (select * from syscolumns where 
  4139.         id = object_id('MSqreader_history') and
  4140.         name = 'publication_id')
  4141.     begin
  4142.         alter table dbo.MSqreader_history alter column publication_id int NULL
  4143.     end
  4144.  
  4145.     -- add columns for existing table
  4146.     if not exists (select * from syscolumns where 
  4147.         id = object_id('MSqreader_history') and
  4148.         name = 'error_id')
  4149.     begin
  4150.         alter table dbo.MSqreader_history add error_id int NULL
  4151.     end 
  4152.  
  4153.     if not exists (select * from syscolumns where 
  4154.         id = object_id('MSqreader_history') and
  4155.         name = 'transactions_processed')
  4156.     begin
  4157.         alter table dbo.MSqreader_history add transactions_processed int NULL DEFAULT 0
  4158.     end 
  4159.  
  4160.     if not exists (select * from syscolumns where 
  4161.         id = object_id('MSqreader_history') and
  4162.         name = 'delivery_rate')
  4163.     begin
  4164.         alter table dbo.MSqreader_history add delivery_rate float NOT NULL DEFAULT 0.0
  4165.     end 
  4166.  
  4167.     if not exists (select * from syscolumns where 
  4168.         id = object_id('MSqreader_history') and
  4169.         name = 'transaction_rate')
  4170.     begin
  4171.         alter table dbo.MSqreader_history add transaction_rate float NOT NULL DEFAULT 0.0
  4172.     end 
  4173.  
  4174.     IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSrepl_backup_lsns' and type = 'U')
  4175.     BEGIN
  4176.         /****************************************************************************/
  4177.         raiserror('Creating table MSrepl_backup_lsns', 0,1)
  4178.         /****************************************************************************/    
  4179.  
  4180.         CREATE TABLE dbo.MSrepl_backup_lsns
  4181.         (
  4182.         publisher_database_id int NOT NULL,
  4183.         valid_xact_id varbinary(16) NULL,
  4184.         valid_xact_seqno varbinary (16 ) NULL,
  4185.         next_xact_id varbinary(16) NULL,
  4186.         next_xact_seqno varbinary (16 )  NULL
  4187.         )
  4188.  
  4189.         EXEC dbo.sp_MS_marksystemobject 'MSrepl_backup_lsns'
  4190.  
  4191.         raiserror('Creating clustered index ucMSrepl_backup_lsns', 0,1)
  4192.         CREATE UNIQUE CLUSTERED INDEX ucMSrepl_backup_lsns ON dbo.MSrepl_backup_lsns
  4193.             (publisher_database_id)
  4194.  
  4195.         if exists (select * from MSpublisher_databases)
  4196.         begin
  4197.             /****************************************************************************/
  4198.             raiserror('Upgrading MSrepl_backup_lsns', 0,1)
  4199.             /****************************************************************************/    
  4200.             insert into MSrepl_backup_lsns select d.id, 
  4201.                 NULL, NULL, NULL, NULL from MSpublisher_databases d
  4202.             -- No need to set the lsns in the table since the 'sync with backup' option is 
  4203.             -- new in 8.0
  4204.         end
  4205.  
  4206.     END
  4207. GO
  4208.  
  4209. dump tran master with no_log
  4210. go
  4211.  
  4212. raiserror('Creating procedure sp_MSadd_distributor_alerts_and_responses', 0,1)
  4213. go
  4214. create procedure sp_MSadd_distributor_alerts_and_responses
  4215.     @from_scripting bit = 0
  4216. as
  4217.  
  4218.     declare @description    nvarchar(500)
  4219.     declare @category_name  sysname
  4220.     declare @agent_name     sysname
  4221.     declare @response_job   nvarchar(100)
  4222.     declare @alert_name     nvarchar(100)
  4223.     declare @alert_id       int
  4224.     declare @retcode        int
  4225.  
  4226.     --
  4227.     -- Add replication alert response jobs
  4228.     --
  4229.     select @category_name = name FROM msdb.dbo.syscategories where category_id = 18
  4230.  
  4231.     -- Add Validation failure response job
  4232.     -- (20570,10,0,'Reinitialize Subscriptions On Validation Failure.', 1033)   -- Title of a alert response job
  4233.     -- (20571,10,0,'Reiniitializes all subscriptions that have failed due to data validation failures.', 1033)  -- Description of a alert response job
  4234.     set @response_job = formatmessage(20570)
  4235.     set @description = formatmessage(20571)
  4236.     
  4237.     if @from_scripting = 0
  4238.     begin
  4239.         -- Delete the job if it already exists
  4240.         if (exists (select * from msdb..sysjobs_view where name = @response_job collate database_default))
  4241.         begin
  4242.             exec @retcode = msdb.dbo.sp_delete_job @job_name = @response_job
  4243.             if @@ERROR <> 0 or @retcode <> 0
  4244.                 return (1)
  4245.         end
  4246.  
  4247.         execute @retcode = msdb.dbo.sp_MSadd_repl_job 
  4248.             @response_job,
  4249.             @subsystem = 'TSQL',
  4250.             @server = @@SERVERNAME,
  4251.             @databasename = 'master',
  4252.             @description = @description,
  4253.             @command = 'exec dbo.sp_MSreinit_failed_subscriptions @failure_level = 1',
  4254.             @enabled = 1,
  4255.             @loghistcompletionlevel = 0,
  4256.             @retryattempts = 0,
  4257.             @category_name = @category_name
  4258.         if @@ERROR <> 0 or @retcode <> 0
  4259.             return (1)
  4260.     end
  4261.  
  4262.     --
  4263.     -- Add replication alerts
  4264.     --
  4265.  
  4266.     -- Get Replication category name (assumes category_id = 20)
  4267.     select @category_name = name FROM msdb.dbo.syscategories where category_id = 20
  4268.  
  4269.     -- Add Failure Alert
  4270.     set @alert_name = formatmessage(20536)  
  4271.     set @alert_id = 14151 -- corresponding to formatmessage(20536),  Failure alert
  4272.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4273.     begin
  4274.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 14151
  4275.         if @@error <> 0 or @retcode <> 0
  4276.             return 1
  4277.     end
  4278.  
  4279.     -- Add Retry Alert
  4280.     set @alert_name=formatmessage(20537)
  4281.     set @alert_id = 14152 -- corresponding to formatmessage(20537),  Retry alert
  4282.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4283.     begin
  4284.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 14152
  4285.         if @@error <> 0 or @retcode <> 0
  4286.             return 1
  4287.     end
  4288.  
  4289.     -- Add Success Alert
  4290.     set @alert_name=formatmessage(20540)
  4291.     set @alert_id = 14150 -- corresponding to formatmessage(20540), 
  4292.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4293.     begin
  4294.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 14150
  4295.         if @@error <> 0 or @retcode <> 0
  4296.             return 1
  4297.     end
  4298.  
  4299.     -- Add Shutdown request Alert
  4300.     set @alert_name=formatmessage(20578)
  4301.     set @alert_id = 20578 --  Custom agent shutdown message
  4302.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4303.     begin
  4304.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 20578
  4305.         if @@error <> 0 or @retcode <> 0
  4306.             return 1
  4307.     end
  4308.  
  4309.     -- Add Validation Failure Alert
  4310.     set @alert_name=formatmessage(20565)
  4311.     set @alert_id = 20574 -- corresponding to formatmessage(20574), 
  4312.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4313.     begin
  4314.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 20574
  4315.         if @@error <> 0 or @retcode <> 0
  4316.             return 1
  4317.     end
  4318.  
  4319.     -- Add Validation Success Alert
  4320.     set @alert_name=formatmessage(20566)
  4321.     set @alert_id = 20575 -- corresponding to formatmessage(20575), 
  4322.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4323.     begin
  4324.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 20575
  4325.         if @@error <> 0 or @retcode <> 0
  4326.             return 1
  4327.     end
  4328.  
  4329.     -- Add Reinitialized after Validation Failure
  4330.     set @alert_name=formatmessage(20573)
  4331.     set @alert_id = 20572 -- corresponding to formatmessage(20566),  
  4332.     if not exists (select * from msdb.dbo.sysalerts where message_id = @alert_id)
  4333.     begin
  4334.         exec @retcode = msdb.dbo.sp_add_alert @enabled = 0, @name = @alert_name, @category_name = @category_name, @message_id = 20572
  4335.         if @@error <> 0 or @retcode <> 0
  4336.             return 1
  4337.     end
  4338.  
  4339. GO
  4340.  
  4341.  
  4342. raiserror('Creating procedure sp_MSdrop_distributor_alerts_and_responses', 0,1)
  4343. go
  4344. create proc sp_MSdrop_distributor_alerts_and_responses
  4345. as
  4346.  
  4347.     declare @name           nvarchar(100)
  4348.     declare @alert_id       int
  4349.     declare @retcode        int
  4350.  
  4351.     --
  4352.     -- Delete alerts and response jobs
  4353.     --
  4354.  
  4355.     -- Drop Replication Checkup Agent
  4356.     select @name = formatmessage(20533)
  4357.     IF EXISTS (SELECT * FROM msdb..sysjobs_view WHERE name = @name collate database_default and
  4358.         UPPER(originating_server) = UPPER(CONVERT(NVARCHAR(30), SERVERPROPERTY('ServerName'))))
  4359.     BEGIN
  4360.         EXEC @retcode = msdb.dbo.sp_delete_job  @job_name = @name
  4361.         IF @@ERROR <> 0 or @retcode <> 0
  4362.         BEGIN
  4363.             return (1)            
  4364.         END
  4365.     END
  4366.  
  4367.     -- Drop Reinit subscription response job
  4368.     set @name = formatmessage(20570)
  4369.     IF EXISTS (SELECT * FROM msdb..sysjobs_view WHERE name = @name collate database_default and
  4370.         UPPER(originating_server) = UPPER(CONVERT(NVARCHAR(30), SERVERPROPERTY('ServerName'))))
  4371.     BEGIN
  4372.         EXEC @retcode = msdb.dbo.sp_delete_job  @job_name = @name
  4373.         IF @@ERROR <> 0 or @retcode <> 0
  4374.         BEGIN
  4375.             return (1)            
  4376.         END
  4377.     END
  4378.  
  4379.     -- Drop the alerts
  4380.     set @alert_id = 14150 -- success alert
  4381.     set @name=formatmessage(20540)
  4382.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4383.     begin
  4384.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4385.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4386.         if @@error <> 0 or @retcode <> 0
  4387.             return (1)            
  4388.     end
  4389.     
  4390.     set @alert_id = 14151 -- failure alert
  4391.     set @name = formatmessage(20536)
  4392.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4393.     begin
  4394.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4395.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4396.         if @@error <> 0 or @retcode <> 0
  4397.             return (1)            
  4398.     end
  4399.     
  4400.     set @alert_id = 14152 -- retry alert
  4401.     set @name = formatmessage(20537)
  4402.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4403.     begin
  4404.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4405.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4406.         if @@error <> 0 or @retcode <> 0
  4407.             return (1)            
  4408.     end
  4409.  
  4410.     set @alert_id = 14153 -- warnning alert
  4411.     set @name = formatmessage(20540)
  4412.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4413.     begin
  4414.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4415.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4416.         if @@error <> 0 or @retcode <> 0
  4417.             return (1)            
  4418.     end
  4419.  
  4420.     -- Remove Validation Failure Alert
  4421.     set @alert_id = 20574 
  4422.     set @name = formatmessage(20565)
  4423.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4424.     begin
  4425.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4426.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4427.         if @@error <> 0 or @retcode <> 0
  4428.             return (1)            
  4429.     end
  4430.  
  4431.     -- Remove Validation Sucess Alert
  4432.     set @alert_id = 20575
  4433.     set @name = formatmessage(20566)
  4434.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4435.     begin
  4436.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4437.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4438.         if @@error <> 0 or @retcode <> 0
  4439.             return (1)            
  4440.     end
  4441.     
  4442.     -- Remove Reinitialized after Validation Failure
  4443.     set @alert_id = 20525 -- checksum alert
  4444.     set @name = formatmessage(20573)
  4445.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4446.     begin
  4447.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4448.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4449.         if @@error <> 0 or @retcode <> 0
  4450.             return (1)            
  4451.     end
  4452.  
  4453.     -- Remove subscription reinitialized after validation failure
  4454.     set @alert_id = 20572 -- corresponding to formatmessage(20566),  
  4455.     set @name=formatmessage(20573)
  4456.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4457.     begin
  4458.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4459.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4460.         if @@error <> 0 or @retcode <> 0
  4461.             return (1)            
  4462.     end
  4463.  
  4464.     -- Remove Shutdown request Alert
  4465.     set @alert_id = 20578 --  Custom agent shutdown message
  4466.     set @name=formatmessage(20578)
  4467.     if exists (select * from msdb.dbo.sysalerts where message_id=@alert_id)
  4468.     begin
  4469.         select @name=name from msdb.dbo.sysalerts where message_id=@alert_id
  4470.         exec @retcode = msdb.dbo.sp_delete_alert @name
  4471.         if @@error <> 0 or @retcode <> 0
  4472.             return (1)            
  4473.     end
  4474.  
  4475. GO
  4476. raiserror('Creating procedure sp_adddistributor', 0,1)
  4477. go
  4478.  
  4479. CREATE PROCEDURE sp_adddistributor (
  4480.     @distributor sysname,            /* distributor server name */
  4481.     @heartbeat_interval int = 10,    -- minutes
  4482.     @password sysname = NULL,
  4483.     @from_scripting bit = 0
  4484.  
  4485. ) AS
  4486.  
  4487.     SET NOCOUNT ON
  4488.  
  4489.     /*
  4490.     ** Declarations.
  4491.     */
  4492.     DECLARE @retcode int
  4493.     DECLARE @agentname nvarchar(100)
  4494.     DECLARE @command nvarchar(255)
  4495.     DECLARE @distribution_db sysname
  4496.     DECLARE @distproc nvarchar(255)
  4497.     DECLARE @dist_rpcname sysname
  4498.     DECLARE @server_added bit
  4499.     declare @login sysname
  4500.  
  4501.     select @server_added = 0 
  4502.     select @login = 'distributor_admin'
  4503.  
  4504.     /* 
  4505.     ** Check if replication components are installed on this server
  4506.     */
  4507.     exec @retcode = dbo.sp_MS_replication_installed
  4508.     if (@retcode <> 1)
  4509.     begin
  4510.         return (1)
  4511.     end
  4512.  
  4513.     -- Must be at master db.
  4514.     IF db_name() <> 'master'
  4515.     BEGIN
  4516.         RAISERROR(5001, 16,-1)
  4517.         return (1)
  4518.     END
  4519.     /*
  4520.     ** Parameter Check:  @distributor.
  4521.     ** Check to make sure that the distributor is not NULL and that it
  4522.     ** conforms to the rules for identifiers.
  4523.     */
  4524.     IF @distributor IS NULL
  4525.         BEGIN
  4526.             RAISERROR (14043, 16, -1, '@distributor')
  4527.             RETURN (1)
  4528.         END
  4529.  
  4530.     EXECUTE @retcode = dbo.sp_validname @distributor
  4531.  
  4532.     IF @@ERROR <> 0 OR @retcode <> 0
  4533.        RETURN (1)
  4534.  
  4535.     IF @password = N''
  4536.         select @password = NULL
  4537.     
  4538.     -- Seed default password with random value only for a local distributor.
  4539.     IF (@password is null) AND (UPPER(@@SERVERNAME) = UPPER(@distributor)) 
  4540.         select @password = convert(sysname, newid())
  4541.     /*
  4542.     ** Check to make sure that the distributor doesn't already exist.
  4543.     */
  4544.     SELECT @dist_rpcname = NULL
  4545.     SELECT @dist_rpcname = srvname FROM master..sysservers
  4546.               WHERE  srvstatus & 8 <> 0
  4547.     IF @dist_rpcname IS NOT NULL
  4548.     BEGIN
  4549.         RAISERROR (14099, 16, -1, @dist_rpcname)
  4550.         RETURN(1)
  4551.     END
  4552.  
  4553.     -- drop repl_distributor if it exists.
  4554.     if exists (select * from master..sysservers where lower(srvname) = 
  4555.         'repl_distributor' collate database_default)
  4556.     begin
  4557.         exec @retcode = dbo.sp_dropserver 'repl_distributor', 'droplogins'
  4558.         IF @@error <> 0 OR @retcode <> 0
  4559.         BEGIN
  4560.             RETURN(1)
  4561.         END
  4562.     end
  4563.  
  4564.     -- Add the linked server entry for the distributor
  4565.     -- Note we do this even for local server for consistancy
  4566.     EXECUTE @retcode = dbo.sp_addserver  'repl_distributor'
  4567.     IF @@error <> 0 OR @retcode <> 0
  4568.     BEGIN
  4569.         RETURN (1)
  4570.     END
  4571.  
  4572.     select @server_added = 1
  4573.  
  4574.     -- Mark system link
  4575.     EXECUTE @retcode = dbo.sp_serveroption  'repl_distributor', 'system','true'
  4576.     IF @@error <> 0 OR @retcode <> 0
  4577.     BEGIN
  4578.         RETURN (1)
  4579.     END
  4580.  
  4581.     EXECUTE @retcode = dbo.sp_setnetname  'repl_distributor', @distributor
  4582.     IF @@error <> 0 OR @retcode <> 0
  4583.     BEGIN
  4584.         goto UNDO
  4585.     END
  4586.         
  4587.     exec @retcode = dbo.sp_addlinkedsrvlogin 
  4588.         @rmtsrvname= 'repl_distributor',
  4589.         @useself = 'false',
  4590.         @locallogin = NULL,
  4591.         @rmtuser = @login,
  4592.         @rmtpassword = @password
  4593.     IF @@error <> 0 OR @retcode <> 0
  4594.     BEGIN
  4595.         goto UNDO
  4596.     END
  4597.  
  4598.  
  4599.     /*
  4600.     ** If this is not the local server, remote distributor must be set up first
  4601.     */
  4602.     IF UPPER(@distributor) <> UPPER(@@SERVERNAME)
  4603.     BEGIN
  4604.     /* Check distributor version, 7.0 distributor should error out*/
  4605.     declare @dist_ver int
  4606.     select @dist_ver = 0
  4607.     EXEC @retcode = repl_distributor.master.dbo.sp_executesql N'select @dist_ver = @@microsoftversion', 
  4608.                                     N'@dist_ver int output', @dist_ver output
  4609.     IF (@retcode <> 0 or @@ERROR <> 0)
  4610.     begin
  4611.             GOTO UNDO
  4612.     end
  4613.     if (@dist_ver < 0x07320000 )
  4614.     begin
  4615.             RAISERROR (21320,16,-1)
  4616.             GOTO UNDO
  4617.     end
  4618.         /*
  4619.         ** Test to see if the local server is defined as publisher
  4620.         ** at the remove distributor.
  4621.         ** Note: cannot call sp_helpdistributor locally since the server is not
  4622.         ** marked for distribution.
  4623.         ** We can not move the serveroption call before this RPC because RPC failure
  4624.         ** may cause the SP to terminate. Thus, we can not UNDO the server option.
  4625.         */
  4626.         SELECT @distproc = 'repl_distributor.master.dbo.sp_helpdistributor'
  4627.     
  4628.         DECLARE @loc_directory             nvarchar(255)
  4629.         DECLARE @loc_account             nvarchar(255)
  4630.         DECLARE @loc_mindistretention     int
  4631.         DECLARE @loc_maxdistretention     int
  4632.         DECLARE @loc_historyretention   int  
  4633.         DECLARE @loc_historycleanupagent nvarchar(100)
  4634.         DECLARE @loc_distribcleanupagent nvarchar(100)
  4635.         DECLARE @alert_name nvarchar(100)
  4636.         DECLARE @alert_id int
  4637.  
  4638.         EXECUTE @distproc
  4639.             @distributor OUTPUT,
  4640.             @distribution_db OUTPUT,
  4641.             @loc_directory OUTPUT,
  4642.             @loc_account OUTPUT,
  4643.             @loc_mindistretention OUTPUT,
  4644.             @loc_maxdistretention OUTPUT,
  4645.             @loc_historyretention OUTPUT,
  4646.             @loc_historycleanupagent OUTPUT,
  4647.             @loc_distribcleanupagent OUTPUT,
  4648.             @@SERVERNAME,
  4649.             @local = 'local'
  4650.  
  4651.         IF @@error <> 0 OR @retcode <> 0 OR @distribution_db is NULL
  4652.         BEGIN
  4653.             RAISERROR (21007,16,-1)
  4654.             GOTO UNDO
  4655.         END
  4656.  
  4657.         /* Activate the dist publisher at the remote distributor */
  4658.         SELECT @distproc = 'repl_distributor.master.dbo.sp_changedistpublisher'
  4659.             EXECUTE @retcode = @distproc @@SERVERNAME, 'active','true'
  4660.         IF @@error <> 0 OR @retcode <> 0
  4661.         BEGIN
  4662.             GOTO UNDO
  4663.         END
  4664.     END
  4665.     ELSE
  4666.     /* set the registry */
  4667.     BEGIN
  4668.         EXEC @retcode = dbo.sp_MScreate_distributor_tables 
  4669.         if @@error <> 0 or @retcode <> 0
  4670.             goto UNDO
  4671.  
  4672.         declare @distributor_login sysname
  4673.         select @distributor_login = 'distributor_admin'
  4674.  
  4675.         -- Add publisher rpc login
  4676.         if not exists (select * from master..syslogins where loginname = @distributor_login collate database_default)
  4677.         begin
  4678.             EXEC @retcode = dbo.sp_addlogin @loginame = @distributor_login,
  4679.                 @passwd = @password
  4680.             if @@error <> 0 or @retcode <> 0
  4681.                 goto UNDO
  4682.         end
  4683.         else
  4684.         begin
  4685.             -- Change the password if the distributor is local
  4686.             EXEC @retcode = dbo.sp_password NULL, @password, 'distributor_admin'
  4687.             if @@error <> 0 or @retcode <> 0
  4688.                 goto UNDO
  4689.         end
  4690.  
  4691.         -- Add the login to sysadmin
  4692.         -- Refer to sp_MSpublication_access in distribution db
  4693.         if is_srvrolemember('sysadmin', @distributor_login) <> 1
  4694.         begin
  4695.             exec @retcode = dbo.sp_addsrvrolemember @distributor_login, 'sysadmin'
  4696.             IF @@error <> 0 OR @retcode <> 0
  4697.                 GOTO UNDO
  4698.         end
  4699.  
  4700.         if @from_scripting <> 1
  4701.         begin
  4702.             -- Add Replication Agent Checkup Agent
  4703.             exec @retcode = dbo.sp_MScreate_replication_checkup_agent @heartbeat_interval = @heartbeat_interval
  4704.             if @@error <> 0 or @retcode <> 0
  4705.                 goto UNDO
  4706.         end
  4707.         
  4708.         delete msdb..MSdistributor where property = 'heartbeat_interval'
  4709.         if @@error <> 0
  4710.             goto UNDO
  4711.         insert into msdb..MSdistributor (property, value) values ('heartbeat_interval',
  4712.             convert(nvarchar(10), @heartbeat_interval))
  4713.         if @@error <> 0 
  4714.             goto UNDO
  4715.  
  4716.         -- Add Replication Alerts and Response Jobs
  4717.         exec @retcode = dbo.sp_MSadd_distributor_alerts_and_responses
  4718.             @from_scripting = @from_scripting
  4719.         if @@error <> 0 or @retcode <> 0
  4720.             goto UNDO
  4721.     
  4722.     END
  4723.  
  4724.  
  4725.     /*
  4726.     ** Set the server option to indicate that this is a distributor.
  4727.     ** 
  4728.     */
  4729.     EXECUTE @retcode = dbo.sp_serveroption 'repl_distributor', 'dist', true
  4730.     IF @@error <> 0 OR @retcode <> 0
  4731.     BEGIN
  4732.         GOTO UNDO
  4733.     END
  4734.  
  4735.     -- Set sp_MSrepl_startup to be a startup stored procedure
  4736.     -- Note: This needs to be after the marking the distribution server
  4737.     exec @retcode = dbo.sp_procoption 'sp_MSrepl_startup', 'startup', 'true' 
  4738.     if @@error <> 0 or @retcode <> 0
  4739.         goto UNDO1
  4740.  
  4741.     exec @retcode = dbo.sp_MSrepl_startup
  4742.     if @@error <> 0 or @retcode <> 0
  4743.         goto UNDO1
  4744.  
  4745.     RETURN (0)
  4746.  
  4747. UNDO1:
  4748.     exec dbo.sp_serveroption 'repl_distributor', 'dist', false
  4749.  
  4750. UNDO:
  4751.     IF @server_added = 1
  4752.     begin
  4753.         -- Drop the remote logins, otherwise, sp_dropserver will fail.
  4754.         EXECUTE dbo.sp_dropserver 'repl_distributor', 'droplogins'
  4755.     end
  4756.     
  4757.     RETURN (1)
  4758. GO
  4759.  
  4760.  
  4761. raiserror('Creating procedure sp_changedistributor_property', 0,1)
  4762. go
  4763.  
  4764. CREATE PROCEDURE sp_changedistributor_property (
  4765.     @property sysname     = NULL,       /* The property to change */
  4766.     @value nvarchar(255)  = NULL        /* The new property value */
  4767.     ) AS
  4768.  
  4769.     declare @retcode int
  4770.     declare @new_heartbeat_interval int 
  4771.  
  4772.     -- Check to make sure the local server is a distributor
  4773.     if not exists (SELECT * FROM master..sysservers
  4774.               WHERE  srvstatus & 8 <> 0 and
  4775.               UPPER(datasource) = UPPER(@@servername) collate database_default)
  4776.     begin
  4777.         RAISERROR (14114, 16, -1, @@SERVERNAME)
  4778.         return(1)
  4779.     end
  4780.  
  4781.     -- Return list of properties if @property is NULL
  4782.     if @property is NULL
  4783.     begin
  4784.         create table #tab1 (properties sysname collate database_default not null)
  4785.         insert into #tab1 values ('heartbeat_interval')
  4786.         select * from #tab1
  4787.         return (0)
  4788.     end
  4789.  
  4790.     if @property is NULL
  4791.     begin
  4792.         if exists (select name from msdb..sysobjects where name = 'MSdistributor')
  4793.         begin
  4794.             select property from msdb..MSdistributor
  4795.             return 0
  4796.         end
  4797.         return 1
  4798.     end
  4799.  
  4800.     -- Check for valid property
  4801.     IF LOWER(@property) NOT IN ('heartbeat_interval')
  4802.     BEGIN
  4803.         RAISERROR (14154, 16, -1)
  4804.         RETURN (1)
  4805.     END
  4806.  
  4807.     if LOWER(@property) = 'heartbeat_interval'
  4808.     begin
  4809.         if exists (select name from msdb..sysobjects where name = 'MSdistributor')  
  4810.         begin
  4811.             update msdb..MSdistributor set value = @value where property = @property
  4812.             if @@error <> 0
  4813.                 return 1
  4814.             select @new_heartbeat_interval = CONVERT(int, @value)
  4815.             exec @retcode = dbo.sp_MScreate_replication_checkup_agent @heartbeat_interval = 
  4816.                 @new_heartbeat_interval
  4817.             if @@error <> 0 or @retcode <> 0
  4818.                 return 1
  4819.         end
  4820.         else 
  4821.             return 1
  4822.     end
  4823.  
  4824.     return (0)
  4825.  
  4826. GO
  4827.  
  4828. raiserror('Creating procedure sp_helpdistributor_properties', 0,1)
  4829. go
  4830.  
  4831. CREATE PROCEDURE sp_helpdistributor_properties 
  4832.      AS
  4833.  
  4834.     if exists (select name from msdb..sysobjects where name = 'MSdistributor')
  4835.     begin
  4836.         -- There is currently only one property, so this will work
  4837.         select 'heartbeat_interval' = convert(int, value) from msdb..MSdistributor where
  4838.             property = 'heartbeat_interval'
  4839.         return (0)
  4840.     end
  4841.     return (1)
  4842. GO
  4843.  
  4844. raiserror('Creating procedure sp_dropdistributor', 0,1)
  4845. go
  4846.  
  4847. CREATE PROCEDURE sp_dropdistributor
  4848. @no_checks bit = 0,
  4849. @ignore_distributor bit = 0
  4850. AS
  4851.  
  4852.     SET NOCOUNT ON
  4853.  
  4854.     /*
  4855.     ** Declarations.
  4856.     */
  4857.     DECLARE @retcode int
  4858.     DECLARE @distributor sysname
  4859.     DECLARE @agentname nvarchar(100)
  4860.     DECLARE @distbit int
  4861.     DECLARE @distribdb sysname
  4862.     DECLARE @foundSubscriber int
  4863.     DECLARE @proc nvarchar(255) 
  4864.     declare @optname sysname
  4865.     declare @name sysname
  4866.     DECLARE @transpublishdb_bit int
  4867.     DECLARE @mergepublishdb_bit int
  4868.     declare @job_name nvarchar(100)
  4869.     declare @alert_name nvarchar(100)
  4870.  
  4871.     declare @dist_rpcname sysname
  4872.  
  4873.     declare @alert_id   int
  4874.    
  4875.     SELECT @transpublishdb_bit = 1
  4876.     SELECT @mergepublishdb_bit = 4
  4877.     SELECT @foundSubscriber = 0
  4878.     SELECT @distbit = 16
  4879.  
  4880.     -- Get distributor name
  4881.     select @distributor = datasource, @dist_rpcname = srvname from master..sysservers 
  4882.         WHERE srvstatus & 8 <> 0
  4883.     if @distributor is null
  4884.     BEGIN
  4885.         RAISERROR (21043, 16, -1)
  4886.         RETURN(1)
  4887.     END
  4888.  
  4889.     if @no_checks = 1
  4890.     begin
  4891.         -- We are in bruteforce cleanup mode, drop everything.
  4892.         DECLARE hCdropdistributor CURSOR LOCAL FAST_FORWARD FOR
  4893.                 SELECT name, N'publish' FROM master..sysdatabases      
  4894.                     WHERE (category & @transpublishdb_bit) <> 0 
  4895.                 UNION
  4896.                 select name, N'merge publish' from master..sysdatabases
  4897.                     WHERE (category & @mergepublishdb_bit) <> 0
  4898.                 FOR READ ONLY
  4899.  
  4900.         OPEN hCdropdistributor
  4901.         FETCH hCdropdistributor INTO @name, @optname
  4902.     
  4903.         WHILE (@@fetch_status <> -1)
  4904.         BEGIN
  4905.                         
  4906.             EXECUTE @retcode  = dbo.sp_replicationdboption 
  4907.               @dbname = @name,
  4908.               @optname = @optname,
  4909.               @value = 'false',
  4910.               @ignore_distributor = @ignore_distributor
  4911.             
  4912.             IF @@ERROR <> 0 OR @retcode <> 0
  4913.             BEGIN
  4914.                 CLOSE hCdropdistributor
  4915.                 DEALLOCATE hCdropdistributor
  4916.                 RETURN (1)
  4917.             END
  4918.             FETCH hCdropdistributor INTO @name, @optname
  4919.         end
  4920.  
  4921.         CLOSE hCdropdistributor
  4922.         DEALLOCATE hCdropdistributor
  4923.     
  4924.         -- Drop subscriber
  4925.         EXECUTE @retcode  = dbo.sp_dropsubscriber
  4926.           @subscriber = 'all',
  4927.           @ignore_distributor = @ignore_distributor
  4928.  
  4929.         IF @@ERROR <> 0 OR @retcode <> 0
  4930.             RETURN (1)
  4931.  
  4932.         IF UPPER(@distributor) = UPPER(@@SERVERNAME) 
  4933.         begin
  4934.             -- Clean up dist publishers
  4935.             DECLARE hCdropdistributor CURSOR LOCAL FAST_FORWARD FOR
  4936.                     SELECT name FROM msdb..MSdistpublishers
  4937.             FOR READ ONLY
  4938.  
  4939.             OPEN hCdropdistributor
  4940.             FETCH hCdropdistributor INTO @name
  4941.  
  4942.             WHILE (@@fetch_status <> -1)
  4943.             BEGIN
  4944.                 exec @retcode = dbo.sp_dropdistpublisher
  4945.                     @publisher = @name,
  4946.                     @no_checks = 1
  4947.             
  4948.                 IF @@ERROR <> 0 OR @retcode <> 0
  4949.                 BEGIN
  4950.                     CLOSE hCdropdistributor
  4951.                     DEALLOCATE hCdropdistributor
  4952.                     RETURN (1)
  4953.                 END
  4954.                 FETCH hCdropdistributor INTO @name
  4955.             end
  4956.  
  4957.             CLOSE hCdropdistributor
  4958.             DEALLOCATE hCdropdistributor
  4959.  
  4960.             -- Clean up distribution dbs
  4961.             DECLARE hCdropdistributor CURSOR LOCAL FAST_FORWARD FOR
  4962.                     SELECT name FROM msdb..MSdistributiondbs
  4963.             FOR READ ONLY
  4964.  
  4965.             OPEN hCdropdistributor
  4966.             FETCH hCdropdistributor INTO @name
  4967.     
  4968.             WHILE (@@fetch_status <> -1)
  4969.             BEGIN
  4970.                 exec @retcode = dbo.sp_dropdistributiondb
  4971.                     @database = @name
  4972.  
  4973.                 IF @@ERROR <> 0 OR @retcode <> 0
  4974.                 BEGIN
  4975.                     CLOSE hCdropdistributor
  4976.                     DEALLOCATE hCdropdistributor
  4977.                     RETURN (1)
  4978.                 END
  4979.                 FETCH hCdropdistributor INTO @name
  4980.             end
  4981.  
  4982.             CLOSE hCdropdistributor
  4983.             DEALLOCATE hCdropdistributor
  4984.         end
  4985.     end
  4986.     
  4987.     -- If everything should be cleaned up when we reach here with @no_checks = 1
  4988.     /*
  4989.     ** If local distributor, check if there are any distributor databases
  4990.     */
  4991.     IF UPPER(@distributor) = UPPER(@@SERVERNAME) 
  4992.     BEGIN
  4993.         IF EXISTS (SELECT * FROM msdb..MSdistributiondbs)
  4994.         BEGIN
  4995.             RAISERROR (14121, 16, -1, @distributor)
  4996.             RETURN(1)
  4997.         END
  4998.     END
  4999.     ELSE
  5000.     begin
  5001.         -- Check to see if there are database published.
  5002.         if exists (SELECT * FROM master..sysdatabases      
  5003.             WHERE (category & @transpublishdb_bit) <> 0 or 
  5004.             (category & @mergepublishdb_bit) <> 0)
  5005.         begin
  5006.             raiserror(21045, 16, -1)
  5007.             return(1)
  5008.         end
  5009.  
  5010.         -- Check to see if there are subscribers defined.
  5011.         if exists (SELECT *
  5012.                      FROM master..sysservers
  5013.                     WHERE srvstatus & 4 <> 0)
  5014.         begin
  5015.             raiserror(21008, 16, -1)
  5016.             return(1)
  5017.         end
  5018.     end
  5019.  
  5020.  
  5021.     /*
  5022.     ** if @ignore_distributor = 1, we are in bruteforce cleanup mode, don't do RPC.
  5023.     */
  5024.     if @ignore_distributor = 0 
  5025.     begin
  5026.         /*
  5027.         ** Get distribution server information
  5028.         */
  5029.         EXEC @retcode = dbo.sp_helpdistributor @publisher = @@SERVERNAME,
  5030.             @distribdb = @distribdb OUTPUT
  5031.         IF @@error <> 0 OR @retcode <> 0
  5032.         BEGIN
  5033.             RAISERROR (14071, 16, -1)
  5034.             RETURN (1)
  5035.         END
  5036.  
  5037.         IF @distribdb is NOT NULL
  5038.         BEGIN
  5039.             /* 
  5040.             ** Deactivate the dist publisher at the  distributor 
  5041.             ** Only do this if @distribdb is NOT NULL, which means the dist publisher
  5042.             ** if defined.
  5043.             */
  5044.             SELECT @proc = RTRIM(@dist_rpcname) + '.master.dbo.sp_changedistpublisher'
  5045.                 EXECUTE @retcode = @proc @@SERVERNAME, 'active','false'
  5046.             IF @@error <> 0 OR @retcode <> 0
  5047.             BEGIN
  5048.                 RETURN (1)
  5049.             END
  5050.         END
  5051.     end
  5052.  
  5053.  
  5054.     /*
  5055.     ** Clear the server option to indicate that this is a distributor.
  5056.     */
  5057.     EXECUTE @retcode = dbo.sp_serveroption @dist_rpcname, 'dist', false
  5058.     IF @@error <> 0 OR @retcode <> 0
  5059.         BEGIN
  5060.             RETURN(1)
  5061.         END
  5062.  
  5063.     -- Prevent dropping local server entry accidentally if user 
  5064.     -- set 'dist' server option on local server.
  5065.     if UPPER(@dist_rpcname) <> UPPER(@@servername)
  5066.     begin
  5067.         exec @retcode = dbo.sp_dropserver @dist_rpcname, 'droplogins'
  5068.         IF @@error <> 0 OR @retcode <> 0
  5069.         BEGIN
  5070.             RETURN(1)
  5071.         END
  5072.     end
  5073.  
  5074.  
  5075.     -- Drop table after unmark distributor to prevent 
  5076.     -- sp_helpdist* failures.
  5077.  
  5078.     /* If local, Drop replication category and alerts */
  5079.     IF UPPER(@distributor) = UPPER(@@SERVERNAME)
  5080.     BEGIN
  5081.  
  5082.     -- Attempts to drop distributor_login, no big deal if it's still in use and we can't drop, don't quit here.
  5083.  
  5084.            declare @distributor_login sysname
  5085.         select @distributor_login = 'distributor_admin'
  5086.  
  5087.         if exists (select * from master..syslogins where loginname = @distributor_login collate database_default)
  5088.         begin
  5089.             EXEC @retcode = dbo.sp_droplogin @loginame = @distributor_login
  5090.     end
  5091.  
  5092.         -- Drop Distributor Alerts and Jobs
  5093.         exec @retcode = dbo.sp_MSdrop_distributor_alerts_and_responses
  5094.         IF @@ERROR <> 0 or @retcode <> 0
  5095.         BEGIN
  5096.             return (1)            
  5097.         END
  5098.  
  5099.         -- Drop the two system tables.
  5100.         if exists (select * from msdb..sysobjects where name = 'MSdistpublishers'
  5101.             and xtype = 'U')
  5102.             drop table msdb..MSdistpublishers
  5103.     
  5104.         if @@error <> 0 
  5105.             return 1 ;
  5106.  
  5107.         if exists (select * from msdb..sysobjects where name = 'MSdistributiondbs'
  5108.             and xtype = 'U')
  5109.             drop table msdb..MSdistributiondbs
  5110.  
  5111.         if @@error <> 0
  5112.             return 1 ;
  5113.  
  5114.         if exists (select * from msdb..sysobjects where name = 'MSdistributor'
  5115.                 and xtype = 'U')
  5116.             drop table msdb..MSdistributor
  5117.  
  5118.         if @@error <> 0
  5119.             return 1 ;
  5120.  
  5121.         if exists (select * from msdb..sysobjects where name = 'sysreplicationalerts'
  5122.                 and xtype = 'U')
  5123.             drop table msdb..sysreplicationalerts
  5124.  
  5125.         if @@error <> 0
  5126.             return 1 ;
  5127.  
  5128.  
  5129.         if exists (select * from msdb..sysobjects where name = 'MSagent_profiles'
  5130.             and xtype = 'U')
  5131.             drop table msdb..MSagent_profiles
  5132.  
  5133.         if @@error <> 0
  5134.             return 1 ;
  5135.  
  5136.  
  5137.        if exists (select * from msdb..sysobjects where name = 'MSagent_parameters'
  5138.                 and xtype = 'U')
  5139.             drop table msdb..MSagent_parameters
  5140.  
  5141.         if @@error <> 0
  5142.             return 1 ;
  5143.  
  5144.     END
  5145.  
  5146.     -- Nnregister sp_MSrepl_startup as a startup stored procedure
  5147.     exec @retcode = dbo.sp_procoption 'sp_MSrepl_startup', 'startup', 'false' 
  5148.     if @@error <> 0 or @retcode <> 0
  5149.         return 1
  5150.  
  5151.     RETURN (0)        
  5152. GO
  5153.  
  5154. dump tran master with NO_LOG
  5155. go
  5156.  
  5157. raiserror('Creating procedure sp_helpdistributiondb', 0,1)
  5158. go
  5159.  
  5160. CREATE PROCEDURE sp_helpdistributiondb (
  5161.     @database sysname = '%'
  5162.     ) AS
  5163.  
  5164.     SET NOCOUNT ON
  5165.  
  5166.     declare @retcode int
  5167.     declare @cmd    nvarchar(500)
  5168.  
  5169.     /*
  5170.     ** Check to make sure this is a distributor
  5171.     */
  5172.     IF NOT EXISTS (select * from master..sysservers
  5173.               where UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  5174.                  AND srvstatus & 8 <> 0)
  5175.     begin
  5176.     if @database <> '%' 
  5177.     begin
  5178.             raiserror (14114, 16, -1, @@SERVERNAME)
  5179.             return(1)
  5180.     end
  5181.     else
  5182.        return(0)
  5183.     end
  5184.  
  5185.     IF NOT EXISTS (select * from msdb..sysobjects where name = 'MSdistributiondbs' and type = 'U')
  5186.     begin
  5187.         raiserror (14071, 16, -1)
  5188.         return(1)
  5189.     end    
  5190.  
  5191.     /*
  5192.     ** Check if database is configured as a distributor database
  5193.     */
  5194.     IF @database <> '%' AND NOT EXISTS (select * from msdb..MSdistributiondbs where name = @database collate database_default)
  5195.     begin
  5196.         raiserror (14117, 16, -1, @database)
  5197.         return(1)
  5198.     end    
  5199.  
  5200.     -- Begin from sp_helpdb
  5201.  
  5202.     /*  Create temp table before any DMP to enure dynamic
  5203.     **  Since we examine the status bits in sysdatabase and turn them
  5204.     **  into english, we need a temporary table to build the descriptions.
  5205.     */
  5206.     create table #spdbdesc
  5207.     (
  5208.         dbid    smallint    null,
  5209.         dbdesc  nvarchar(175)   collate database_default null
  5210.     )
  5211.     if @@error<>0
  5212.     begin
  5213.         return(1)
  5214.     end
  5215.  
  5216.     /* 
  5217.     ** Since we need to execute dynamic SQL to get the list of files, create a temp 
  5218.     ** table to keep file descriptions
  5219.     */
  5220.     create table #spfiledesc
  5221.     (
  5222.         dbid    smallint        not null,
  5223.         fileid  smallint        not null,
  5224.         status  int        not null,
  5225.         size    int             not null,
  5226.         name    sysname         collate database_default not null,
  5227.         filename nvarchar(260)   collate database_default not null
  5228.     )   
  5229.     if @@error<>0
  5230.     begin
  5231.         return(1)
  5232.     end
  5233.  
  5234.     /*
  5235.     **  Initialize #spdbdesc from sysdatabases
  5236.     */
  5237.     insert into #spdbdesc (dbid)
  5238.             select dbid 
  5239.               from master.dbo.sysdatabases d 
  5240.         inner join msdb.dbo.MSdistributiondbs dist
  5241.                 on dist.name = d.name collate database_default 
  5242.              where dist.name like @database collate database_default
  5243.                and has_dbaccess(d.name) = 1
  5244.  
  5245.     declare @name sysname
  5246.  
  5247.     /* 
  5248.     ** Insert the list of all files into #spfiledesc
  5249.     */
  5250.     declare c1 CURSOR LOCAL FAST_FORWARD FOR 
  5251.         select db_name (dbid) from #spdbdesc
  5252.     open c1
  5253.     fetch c1 into @name
  5254.     while @@fetch_status >= 0
  5255.     begin
  5256.  
  5257.         /* Insert row for each database */
  5258.         select @cmd =  ('insert into #spfiledesc
  5259.                 select db_id (N'+ QUOTENAME(@name,'''') + '), fileid, status, size, RTRIM(name), RTRIM(filename) from' 
  5260.                 + ' ' + QUOTENAME(@name) + '.dbo.sysfiles')
  5261.         exec (@cmd)
  5262.         fetch c1 into @name
  5263.     end
  5264.     deallocate c1
  5265.  
  5266.     SELECT dist.name, min_distretention, max_distretention, history_retention,
  5267.         'history_cleanup_agent' =  formatmessage (20567, dist.name),
  5268.         'distributor_cleanup_agent' = formatmessage(20568, dist.name),
  5269.         'status'= 0, 
  5270.  
  5271.         -- Refer to sp_helpdb for the following query.
  5272.         'data_folder' = substring(v_data.filename, 1, len(v_data.filename) - charindex('\', reverse(v_data.filename))),
  5273.         'data_file' = right(v_data.filename, charindex('\', reverse(v_data.filename))-1),
  5274.         'data_file_size' = CONVERT(int, (select low from master.dbo.spt_values
  5275.             where type = 'E'
  5276.                 and number = 1)
  5277.             * convert(dec(15), v_data.size)/ 1048576),
  5278.     
  5279.         'log_folder' = substring(v_log.filename, 1, len(v_log.filename) - charindex('\', reverse(v_log.filename))),
  5280.         'log_file' = right(v_log.filename, charindex('\', reverse(v_log.filename))-1),
  5281.         'log_file_size' = CONVERT(int, (select low from master.dbo.spt_values
  5282.             where type = 'E'
  5283.                 and number = 1)
  5284.             * convert(dec(15), v_log.size)/ 1048576)
  5285.         
  5286.         FROM msdb.dbo.MSdistributiondbs dist,
  5287.         master.dbo.sysdatabases d, #spfiledesc v_data,
  5288.         #spfiledesc v_log
  5289.         WHERE dist.name LIKE @database collate database_default
  5290.             
  5291.             and v_data.dbid = d.dbid 
  5292.             and v_data.dbid > 0 
  5293.             and v_data.status & 2 = 2
  5294.             and v_data.status & 0x40 = 0 -- data
  5295.             and v_data.fileid = (select min(v_data2.fileid) from #spfiledesc v_data2 where
  5296.                     v_data2.dbid = d.dbid 
  5297.                 and v_data2.dbid > 0    
  5298.                 and v_data2.status & 2 = 2
  5299.                 and v_data2.status & 0x40 = 0 ) -- data
  5300.  
  5301.             
  5302.             and v_log.dbid = d.dbid 
  5303.             and v_log.dbid > 0  
  5304.             and v_log.status & 2 = 2
  5305.             and v_log.status & 0x40 = 0x40 -- log
  5306.             and v_log.fileid = (select min(v_log2.fileid) from #spfiledesc v_log2 where
  5307.                     v_log2.dbid = d.dbid 
  5308.                 and v_log2.dbid > 0 
  5309.                 and v_log2.status & 2 = 2
  5310.                 and v_log2.status & 0x40 = 0x40 ) -- log
  5311.  
  5312.             and d.name = dist.name collate database_default
  5313. GO
  5314.  
  5315.  
  5316. dump tran master with no_log
  5317. GO
  5318.  
  5319. raiserror('Creating procedure sp_changedistributiondb', 0,1)
  5320. go
  5321.  
  5322. CREATE PROCEDURE sp_changedistributiondb (
  5323.     @database sysname,
  5324.     @property sysname     = NULL,     /* The property to change */
  5325.     @value nvarchar(255)     = NULL      /* The new property value */
  5326.     ) AS
  5327.  
  5328.     SET NOCOUNT ON
  5329.  
  5330.     /*
  5331.     ** Declarations.
  5332.     */
  5333.     DECLARE @distributor sysname
  5334.     DECLARE @min_distretention     int
  5335.     DECLARE @max_distretention     int
  5336.     DECLARE @retcode             int
  5337.     DECLARE @new_min_distretention     int
  5338.     DECLARE @new_max_distretention     int
  5339.     DECLARE @new_history_retention     int
  5340.     DECLARE @agentname nvarchar(100)
  5341.     DECLARE @command nvarchar(255)
  5342.     DECLARE @security_mode int
  5343.     DECLARE @distbit int
  5344.  
  5345.     SELECT @distbit = 16
  5346.  
  5347.     /*
  5348.     ** Parameter Check:  @property.
  5349.     ** If the @property parameter is NULL, print the options.
  5350.     */
  5351.  
  5352.     IF @property IS NULL
  5353.         BEGIN
  5354.             CREATE TABLE #tab1 (properties sysname collate database_default not null)
  5355.             INSERT INTO #tab1 VALUES ('min_distretention')
  5356.             INSERT INTO #tab1 VALUES ('max_distretention')
  5357.             INSERT INTO #tab1 VALUES ('history_retention')
  5358.             SELECT * FROM #tab1
  5359.             RETURN (0)
  5360.         END
  5361.  
  5362.     /*
  5363.     ** Parameter Check:  @property.
  5364.     ** Check to make sure that @property is a valid property in
  5365.     ** sysarticles.
  5366.     */
  5367.     IF @property IS NULL OR LOWER(@property) NOT IN ('min_distretention',
  5368.                                                      'max_distretention',
  5369.                                                      'history_retention')
  5370.              
  5371.         BEGIN
  5372.  
  5373.             RAISERROR (14115, 16, -1, 
  5374.             '''min_distretention'', ''max_distretention'' or ''history_retention''')
  5375.             RETURN (1)
  5376.         END
  5377.  
  5378.  
  5379.     /*
  5380.     ** Check to make sure this is a distributor
  5381.     */
  5382.     IF NOT EXISTS (SELECT * FROM master..sysservers
  5383.               WHERE UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  5384.                  AND srvstatus & 8 <> 0)
  5385.     BEGIN
  5386.         RAISERROR (14114, 16, -1, @@SERVERNAME)
  5387.         RETURN(1)
  5388.     END
  5389.  
  5390.     /*
  5391.     ** Check if database is configured as a distributor database
  5392.     */
  5393.     IF NOT EXISTS (SELECT * FROM master..sysdatabases
  5394.               WHERE name = @database collate database_default
  5395.                  AND category & @distbit <> 0)
  5396.     BEGIN
  5397.         RAISERROR (14117, 16, -1, @database)
  5398.         RETURN(1)
  5399.     END
  5400.     
  5401.     /*
  5402.     ** Change the property.
  5403.     */
  5404.     IF LOWER(@property) = 'min_distretention'
  5405.         BEGIN
  5406.             IF @value IS NULL
  5407.                 BEGIN
  5408.                     RAISERROR (14043, 16, -1, '@value') 
  5409.                     RETURN (1)
  5410.                 END
  5411.  
  5412.             /*
  5413.             ** Set the MinDistRetention registry key value
  5414.             */
  5415.             SELECT @new_min_distretention = CONVERT(int, @value)
  5416.  
  5417.             /*
  5418.             ** Get MaxDistRetention value
  5419.             */
  5420.             SELECT @max_distretention = max_distretention FROM msdb..MSdistributiondbs
  5421.                 WHERE name = @database collate database_default
  5422.                 
  5423.             /* 
  5424.             ** Check for invalid retention values 
  5425.             */
  5426.             IF @new_min_distretention < 0
  5427.                 BEGIN
  5428.                        RAISERROR(14106, 16, -1)
  5429.                     RETURN (1)
  5430.                 END
  5431.             IF @new_min_distretention > @max_distretention
  5432.                 BEGIN
  5433.                     RAISERROR(14107, 16, -1) 
  5434.                     RETURN (1)
  5435.                 END
  5436.  
  5437.             UPDATE msdb..MSdistributiondbs SET min_distretention = @new_min_distretention
  5438.                 WHERE name = @database collate database_default
  5439.             IF @@error <> 0 
  5440.                 BEGIN
  5441.                     RETURN (1)
  5442.                 END
  5443.  
  5444.             /*
  5445.             ** Update Distribution Cleanup agent 
  5446.             */
  5447.             select @agentname = name from msdb..sysjobs j, msdb..sysjobsteps s where 
  5448.             j.job_id = s.job_id and
  5449.             j.category_id = 11 and
  5450.             s.database_name = @database collate database_default
  5451.         
  5452.             SELECT @command =  'EXEC dbo.sp_MSdistribution_cleanup @min_distretention = ' + 
  5453.                 CONVERT(nvarchar(12), @new_min_distretention) + ', @max_distretention = ' +
  5454.                 CONVERT(nvarchar(12), @max_distretention)
  5455.             EXEC @retcode = msdb.dbo.sp_update_jobstep @job_name = @agentname, @step_id = 1, 
  5456.                 @command = @command
  5457.             IF @@error <> 0 OR @retcode <> 0
  5458.                RETURN(1)
  5459.  
  5460.         END
  5461.  
  5462.     IF LOWER(@property) = 'max_distretention'
  5463.         BEGIN
  5464.             IF @value IS NULL
  5465.                 BEGIN
  5466.                     RAISERROR (14043, 16, -1, '@value') 
  5467.                     RETURN (1)
  5468.                 END
  5469.  
  5470.             /*
  5471.             ** Set the MaxDistRetention registry key value
  5472.             */
  5473.             SELECT @new_max_distretention = CONVERT(int, @value)
  5474.  
  5475.             /*
  5476.             ** Get MinDistRetention value
  5477.             */
  5478.             SELECT @min_distretention = min_distretention FROM msdb..MSdistributiondbs
  5479.                 WHERE name = @database collate database_default
  5480.  
  5481.             /* 
  5482.             ** Check for invalid retention values 
  5483.             */
  5484.             IF @new_max_distretention < 0
  5485.                 BEGIN
  5486.                        RAISERROR(14106, 16, -1)
  5487.                     RETURN (1)
  5488.                 END
  5489.             IF @new_max_distretention < @min_distretention
  5490.                 BEGIN
  5491.                     RAISERROR(14107, 16, -1) 
  5492.                     RETURN (1)
  5493.                 END
  5494.  
  5495.             UPDATE msdb..MSdistributiondbs SET max_distretention = @new_max_distretention
  5496.                 WHERE name = @database collate database_default
  5497.             IF @@error <> 0 
  5498.                 BEGIN
  5499.                     RETURN (1)
  5500.                 END
  5501.             /*
  5502.             ** Update Distribution Cleanup agent 
  5503.             */
  5504.             select @agentname = name from msdb..sysjobs j, msdb..sysjobsteps s where 
  5505.                 j.job_id = s.job_id and
  5506.                 j.category_id = 11 and
  5507.                 s.database_name = @database collate database_default
  5508.             SELECT @command =  'EXEC dbo.sp_MSdistribution_cleanup @min_distretention = ' + 
  5509.                 CONVERT(nvarchar(12), @min_distretention) + ', @max_distretention = ' +
  5510.                 CONVERT(nvarchar(12), @new_max_distretention)
  5511.             EXEC @retcode = msdb.dbo.sp_update_jobstep @job_name = @agentname, @step_id = 1, 
  5512.                 @command = @command
  5513.             IF @@error <> 0 OR @retcode <> 0
  5514.                RETURN(1)
  5515.         END
  5516.  
  5517.     IF LOWER(@property) = 'history_retention'
  5518.         BEGIN
  5519.             IF @value IS NULL
  5520.                 BEGIN
  5521.                     RAISERROR (14043, 16, -1, '@value') 
  5522.                     RETURN (1)
  5523.                 END
  5524.  
  5525.             /*
  5526.             ** Set the HistoryRetention registry key value
  5527.             */
  5528.             SELECT @new_history_retention = CONVERT(int, @value)
  5529.  
  5530.             UPDATE msdb..MSdistributiondbs SET history_retention = @new_history_retention
  5531.                 WHERE name = @database collate database_default
  5532.             IF @@error <> 0 
  5533.                 BEGIN
  5534.                     RETURN (1)
  5535.                 END
  5536.  
  5537.             /*
  5538.             ** Update History Cleanup agent 
  5539.             */
  5540.             select @agentname = name from msdb..sysjobs j, msdb..sysjobsteps s where 
  5541.                 j.job_id = s.job_id and
  5542.                 j.category_id = 12 and
  5543.                 s.database_name = @database collate database_default
  5544.             SELECT @command =  'EXEC dbo.sp_MShistory_cleanup @history_retention = ' + 
  5545.                 CONVERT(nvarchar(12), @new_history_retention)
  5546.             EXEC @retcode = msdb.dbo.sp_update_jobstep @job_name = @agentname, @step_id = 1, 
  5547.                 @command = @command
  5548.             IF @@error <> 0 OR @retcode <> 0
  5549.                RETURN(1)
  5550.  
  5551.         END
  5552.  
  5553.  
  5554.  
  5555.  
  5556.     /*
  5557.     ** Return succeed.
  5558.     */
  5559.     RAISERROR (14105, 10, -1, @property)
  5560.     RETURN (0)
  5561. go
  5562.  
  5563. raiserror('Creating procedure sp_dropdistributiondb', 0,1)
  5564. go
  5565.  
  5566. CREATE PROCEDURE sp_dropdistributiondb (
  5567.     @database sysname        
  5568.     
  5569. ) AS
  5570.  
  5571.     SET NOCOUNT ON
  5572.     /*
  5573.     ** Declarations.
  5574.     */
  5575.     DECLARE @retcode int
  5576.     DECLARE @agentname nvarchar(100)
  5577.     DECLARE @reg_key nvarchar(255)
  5578.     DECLARE @security_mode int
  5579.     DECLARE    @distbit int
  5580.     DECLARE @distpublisher sysname
  5581.     DECLARE @distdb sysname
  5582.     DECLARE @device_name sysname
  5583.     DECLARE @command nvarchar(255)
  5584.  
  5585.     SELECT @distbit = 16
  5586.  
  5587.     /*
  5588.     ** Check to make sure this is a distributor
  5589.     */
  5590.     IF NOT EXISTS (SELECT * FROM master..sysservers
  5591.               WHERE UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  5592.                  AND srvstatus & 8 <> 0)
  5593.     BEGIN
  5594.         RAISERROR (14114, 16, -1, @@SERVERNAME)
  5595.         RETURN(1)
  5596.     END
  5597.  
  5598.     /*
  5599.     ** Check if database is configured as a distributor database
  5600.     */
  5601.     IF NOT EXISTS (SELECT * FROM msdb..MSdistributiondbs WHERE name = @database collate database_default)
  5602.     BEGIN
  5603.         RAISERROR (14117, 16, -1, @database)
  5604.         RETURN(1)
  5605.     END
  5606.  
  5607.     /*
  5608.     ** Check if any DistPublishers are using this database
  5609.     */
  5610.     IF EXISTS (SELECT * FROM msdb..MSdistpublishers WHERE
  5611.         distribution_db = @database collate database_default)
  5612.     BEGIN
  5613.         RAISERROR (14120, 16, -1, @database)
  5614.         RETURN (1)
  5615.     END
  5616.     
  5617.     /*
  5618.     ** Check if the DB is being currently used
  5619.     */
  5620.     IF EXISTS (SELECT * FROM master..sysprocesses WHERE
  5621.         dbid = DB_ID(@database))
  5622.     BEGIN
  5623.         RAISERROR (21122, 16, 1, @database)
  5624.         RETURN (1)
  5625.     END
  5626.        
  5627.  
  5628.     /*
  5629.     ** Drop the history cleanup agent.
  5630.     */
  5631.     -- Get agent name
  5632.     select @agentname = null
  5633.     select @agentname = name from msdb..sysjobs j, msdb..sysjobsteps s where 
  5634.         j.job_id = s.job_id and
  5635.         j.category_id = 12 and
  5636.         s.database_name = @database collate database_default
  5637.  
  5638.     if @agentname is not null
  5639.     BEGIN
  5640.         EXEC @retcode = msdb.dbo.sp_delete_job 
  5641.             @job_name = @agentname
  5642.         IF @@ERROR <> 0 or @retcode <> 0
  5643.         BEGIN
  5644.             RETURN(1)
  5645.         END
  5646.     END
  5647.  
  5648.     /*
  5649.     ** Drop the distribution cleanup agent.
  5650.     */
  5651.     select @agentname = null
  5652.     select @agentname = name from msdb..sysjobs j, msdb..sysjobsteps s where 
  5653.                 j.job_id = s.job_id and
  5654.                 j.category_id = 11 and
  5655.                 s.database_name = @database collate database_default
  5656.     if @agentname is not null
  5657.     BEGIN
  5658.         EXEC @retcode = msdb.dbo.sp_delete_job 
  5659.             @job_name = @agentname
  5660.         IF @@ERROR <> 0 or @retcode <> 0
  5661.         BEGIN
  5662.             RETURN(1)
  5663.         END
  5664.     END
  5665.  
  5666.     /*
  5667.     ** Update sysdatabase category bit before dropping the database
  5668.     ** Otherwise, the database can not be dropped.
  5669.     **
  5670.     */
  5671.     UPDATE master..sysdatabases SET category = category & ~@distbit WHERE name = @database collate database_default
  5672.     IF @@ERROR <> 0
  5673.         BEGIN
  5674.             RETURN (1)
  5675.         END
  5676.  
  5677.  
  5678.     -- Drop the distributor db if it exists
  5679.     IF EXISTS (SELECT * FROM master..sysdatabases WHERE name = @database collate database_default)
  5680.     BEGIN
  5681.  
  5682.         CREATE TABLE #db_existed
  5683.         (
  5684.         db_existed bit  NOT NULL
  5685.         )
  5686.  
  5687.         /* Get version stamp */
  5688.         SELECT @command = 'INSERT INTO #db_existed SELECT db_existed FROM ' +
  5689.             QUOTENAME(@database) + '..MSrepl_version'
  5690.     
  5691.         EXEC(@command)
  5692.         IF @@ERROR <> 0
  5693.         BEGIN
  5694.             RETURN(1)       
  5695.         END
  5696.  
  5697.         -- Drop the distribution db only if it is created in sp_adddistributiondb.
  5698.         IF NOT EXISTS (SELECT * FROM #db_existed where db_existed = 0x1)
  5699.         BEGIN
  5700.     
  5701.             -- we're dropping the database, so don't bother to clean up
  5702.             -- individual records.  Just make sure we blow away the synchronization
  5703.             -- files & directories hosted by the file system.
  5704.  
  5705.             SELECT @command = QUOTENAME(@database) + '.dbo.sp_MSdrop_snapshot_dirs'
  5706.             SELECT @command = 'EXEC ' + @command
  5707.             EXEC (@command)
  5708.             IF (@@ERROR <> 0)
  5709.             BEGIN
  5710.                 RETURN (1)
  5711.             END
  5712.  
  5713.             /* Save the device info before dropping the database */
  5714.             CREATE TABLE #distdbdevices (name sysname  collate database_default not null)
  5715.  
  5716.             /* Drop distributor devices */
  5717.             /* Query is copied from sp_helpdb */
  5718.             SELECT @command = 
  5719.                 'INSERT INTO #distdbdevices select DISTINCT name from ' + QUOTENAME(@database) + '.dbo.sysfiles'
  5720.             EXEC (@command)
  5721.             IF @@ERROR <>0
  5722.             BEGIN
  5723.                 RETURN(1)      
  5724.             END
  5725.  
  5726.             /*
  5727.             ** Drop the distribution database
  5728.             */
  5729.             SELECT @command = 'drop database ' + QUOTENAME(@database)
  5730.             EXEC (@command)
  5731.             IF @@ERROR <> 0
  5732.                 BEGIN
  5733.                     /* Mark the database as distribution database again 
  5734.                     ** Otherwise, this sp will fail when it is reentered.
  5735.                     ** It is often the case that if there's an open session
  5736.                     ** on the database, it can not be dropped.
  5737.                     */
  5738.                     RETURN(1)
  5739.                 END
  5740.  
  5741.             /* Drop distributor devices */
  5742.             /* Query is copied from sp_helpdb */
  5743.             /* SQL SERVER 7.0 may drop some auto generated device files, drop drop them here
  5744.                again
  5745.             */
  5746.             DECLARE hCdropdistributiondb CURSOR LOCAL FAST_FORWARD FOR
  5747.                 SELECT DISTINCT dd.name FROM #distdbdevices dd, master.dbo.sysdevices ss
  5748.                     WHERE ss.name = dd.name collate database_default
  5749.             FOR READ ONLY
  5750.     
  5751.             OPEN hCdropdistributiondb
  5752.             FETCH hCdropdistributiondb INTO @device_name
  5753.  
  5754.             WHILE (@@fetch_status <> -1)
  5755.             BEGIN
  5756.                 /* 
  5757.                 ** Device may be used by other databases
  5758.                 ** Ignore all errors 
  5759.                 */
  5760.                 EXEC dbo.sp_dropdevice @device_name, DELFILE
  5761.                 FETCH hCdropdistributiondb INTO @device_name
  5762.             END
  5763.  
  5764.             CLOSE hCdropdistributiondb
  5765.             DEALLOCATE hCdropdistributiondb
  5766.  
  5767.         END
  5768.         -- else, database did exist before it was made the distributor, 
  5769.         -- do full cleanup
  5770.         ELSE
  5771.         BEGIN
  5772.  
  5773.             -- run 'fast clean' routine first. this removes repldata files
  5774.             -- and truncates MSrepl_transactions/commands
  5775.  
  5776.             SELECT @command = QUOTENAME(@database) + '.dbo.sp_MSfast_delete_trans'
  5777.             SELECT @command = 'EXEC ' + @command
  5778.             EXEC (@command)
  5779.             IF (@@ERROR <> 0)
  5780.             BEGIN
  5781.                 RETURN (1)
  5782.             END
  5783.  
  5784.             -- Do distribution cleanup the final time
  5785.             -- this handles those fiddly agent tables & such
  5786.             -- ( and would delete commands/xacts if we hadn't already purged 'em )
  5787.  
  5788.             SELECT @command = QUOTENAME(@database) + 
  5789.                 '.dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 0'
  5790.             SELECT @command = 'EXEC ' + @command
  5791.             EXEC (@command)
  5792.             IF (@@ERROR <> 0)
  5793.             BEGIN
  5794.                 RETURN (1)
  5795.             END
  5796.         END
  5797.     END
  5798.     
  5799.  
  5800.     /*
  5801.     ** Delete the DistributionDB entry
  5802.     */
  5803.  
  5804.     DELETE msdb.dbo.MSdistributiondbs where name = @database collate database_default
  5805.     IF @@error <> 0
  5806.     BEGIN
  5807.         RETURN(1)
  5808.     END
  5809.     
  5810.  
  5811.     RETURN (0)
  5812.                 
  5813. GO
  5814.  
  5815. dump tran master with no_log
  5816. GO
  5817. raiserror('Creating procedure sp_adddistributiondb', 0,1)
  5818. go
  5819.  
  5820. CREATE PROCEDURE sp_adddistributiondb (
  5821.     @database sysname,
  5822.     @data_folder nvarchar(255) = NULL,
  5823.     @data_file nvarchar(255) = NULL,            /* physical file name */
  5824.     @data_file_size int = 2,                    /* Default: 2MB */            
  5825.     @log_folder nvarchar(255) = NULL,
  5826.     @log_file nvarchar(255) = NULL,             /* physical file name */
  5827.     @log_file_size int = 0,
  5828.     @min_distretention int = 0,                 /* min distribution retention period in hours */
  5829.     @max_distretention int = 72,                /* max distribution retention period in hours */
  5830.     @history_retention int = 48,                /* history retention period in hours */
  5831.     @security_mode int = 0,                     /* distributor login security 0 standard 1 integrated */
  5832.     @login sysname = 'sa',                      /* standard login name */
  5833.     @password sysname = NULL,                   /* standard login password */
  5834.     @createmode int = 0,  /* 0: use create db for attach (recommended), 
  5835.                             1: create db or use existing but no attach (this is the old way), 
  5836.                             2: create for instdist and detach only */
  5837.     @from_scripting bit = 0
  5838.     ) AS
  5839.  
  5840.     SET NOCOUNT ON
  5841.  
  5842.     /*
  5843.     ** Declarations.
  5844.     */
  5845.     DECLARE @data_path nvarchar(512)
  5846.     DECLARE @log_path nvarchar(512)
  5847.     
  5848.     DECLARE @data_path_quoted_for_copy nvarchar(512)
  5849.     DECLARE @log_path_quoted_for_copy nvarchar(512)
  5850.  
  5851.     DECLARE @logical_data_file nvarchar(255)
  5852.     DECLARE @logical_log_file nvarchar(255)
  5853.     DECLARE @canneddbdata_file nvarchar(255)
  5854.     DECLARE @canneddblog_file nvarchar(255)
  5855.     DECLARE @filecopy_cmd nvarchar(255)
  5856.     DECLARE @file_exists bit
  5857.     DECLARE @data_file_preexists int
  5858.     DECLARE @log_file_preexists int
  5859.     DECLARE @osql_path nvarchar(260)
  5860.     DECLARE @osql_cmd nvarchar(1000)
  5861.     DECLARE @osql_for_nt int
  5862.     DECLARE @devnum int
  5863.     --DECLARE @num_pages int
  5864.     DECLARE @retcode int
  5865.     DECLARE @reg_key nvarchar(255)
  5866.     DECLARE @agentname nvarchar(100)
  5867.     DECLARE @command nvarchar (2048)
  5868.     DECLARE @distbit int
  5869.     DECLARE @install_path nvarchar(255)
  5870.     DECLARE @mssql_data_path nvarchar(255)
  5871.     DECLARE @on_clause nvarchar(512)
  5872.     DECLARE @logon_clause nvarchar(512)
  5873.     DECLARE @distproc nvarchar(255)
  5874.     DECLARE @major_version int
  5875.     DECLARE @db_exists bit
  5876.     DECLARE @trunc_log_bit int
  5877.     DECLARE @description nvarchar(100)
  5878.     DECLARE @category_name sysname
  5879.     DECLARE @createmode_attach int
  5880.     DECLARE @createmode_noattach int
  5881.     DECLARE @createmode_fordetach int
  5882.  
  5883.     --DECLARE @filegrowth nvarchar(10)
  5884.     DECLARE @data_file_size_str nvarchar(10)
  5885.     DECLARE @log_file_size_str nvarchar(10)
  5886.     DECLARE @platform_nt binary
  5887.  
  5888.     --DECLARE @max_datafile_size int
  5889.     --DECLARE @max_logfile_size int
  5890.     
  5891.     IF @password = N''
  5892.         select @password = NULL
  5893.  
  5894.     select @platform_nt = 0x1
  5895.     --select @filegrowth = N'512KB'
  5896.  
  5897.     -- on error, delete the data and log files only if they didn't pre-exist.
  5898.     -- by default, assume they pre-exist.
  5899.     select @data_file_preexists = 1
  5900.     select @log_file_preexists = 1
  5901.     select @file_exists = 0
  5902.  
  5903.     if (@data_file_size IS NULL) or (@data_file_size = 0)
  5904.         select @data_file_size_str = N'512KB'
  5905.     else
  5906.         select @data_file_size_str = convert(nvarchar(10), @data_file_size)
  5907.  
  5908.     if (@log_file_size IS NULL) or (@log_file_size = 0)
  5909.         select @log_file_size_str = N'512KB'
  5910.     else
  5911.         select @log_file_size_str = convert(nvarchar(10), @log_file_size)
  5912.     
  5913.     --if (@data_file_size > 16)
  5914.     --  select @max_datafile_size = @data_file_size
  5915.     --else
  5916.     --  select @max_datafile_size = 16
  5917.     
  5918.     --if (@log_file_size > 16)
  5919.     --  select @max_logfile_size = @log_file_size
  5920.     --else
  5921.     --  select @max_logfile_size = 16
  5922.  
  5923.     select @createmode_attach = 0, @createmode_noattach = 1, @createmode_fordetach = 2
  5924.     SELECT @trunc_log_bit = 8
  5925.     SELECT @distbit = 16
  5926.  
  5927.     if (@createmode <> @createmode_fordetach)
  5928.     begin
  5929.     
  5930.         /* 
  5931.         ** Check if replication components are installed on this server
  5932.         */
  5933.         exec @retcode = dbo.sp_MS_replication_installed
  5934.         if (@retcode <> 1)
  5935.         begin
  5936.             return (1)
  5937.         end
  5938.     
  5939.         /* 
  5940.         ** Check for invalid security modes
  5941.         */
  5942.         IF @security_mode < 0 OR @security_mode > 1
  5943.         BEGIN
  5944.             RAISERROR(14109, 16, -1)
  5945.             RETURN (1)
  5946.         END
  5947.  
  5948.         IF ( ( @platform_nt != platform() & @platform_nt ) and @security_mode = 1)
  5949.         BEGIN
  5950.             RAISERROR(21038, 16, -1)
  5951.             RETURN (1)
  5952.         END
  5953.     
  5954.         /* 
  5955.         ** Check for invalid retention values 
  5956.         */
  5957.         IF @min_distretention < 0 OR @max_distretention < 0 
  5958.         BEGIN
  5959.             RAISERROR(14106, 16, -1)
  5960.             RETURN (1)
  5961.         END
  5962.         IF @min_distretention > @max_distretention
  5963.         BEGIN
  5964.             RAISERROR(14107, 16, -1) 
  5965.             RETURN (1)
  5966.         END
  5967.  
  5968.         /*
  5969.         ** Check to make sure this is a distributor
  5970.         */
  5971.         IF NOT EXISTS (SELECT * FROM master..sysservers
  5972.               WHERE UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  5973.                  AND srvstatus & 8 <> 0)
  5974.         BEGIN
  5975.             RAISERROR (14114, 16, -1, @@SERVERNAME)
  5976.             RETURN(1)
  5977.         END
  5978.     
  5979.         /*
  5980.         ** Check if database is already configured as a distributor database
  5981.         */
  5982.         IF EXISTS (SELECT * FROM msdb..MSdistributiondbs WHERE name = @database collate database_default)
  5983.         BEGIN
  5984.             RAISERROR (14119, 16, -1, @database)
  5985.             RETURN(1)
  5986.         END    
  5987.     end
  5988.  
  5989.     /* 
  5990.     ** Get path to osql client (TOOLS) directory
  5991.     */
  5992.     EXECUTE @retcode = master.dbo.sp_MSgettools_path @osql_path OUTPUT
  5993.     IF ( @retcode <> 0 ) or ( @@ERROR <> 0 ) or ( @osql_path is NULL ) or ( @osql_path = '' )
  5994.     BEGIN
  5995.         GOTO UNDO       
  5996.     END
  5997.  
  5998.     /* 
  5999.     ** Get path to version specific INSTALL directory
  6000.     */
  6001.     exec @retcode = master.dbo.sp_MSget_setup_paths
  6002.         @sql_path = @install_path output,
  6003.         @data_path = @mssql_data_path output
  6004.     IF @retcode <> 0 or @install_path is NULL or @install_path='' or @mssql_data_path = ''
  6005.     BEGIN
  6006.         GOTO UNDO       
  6007.     END
  6008.  
  6009.     IF @data_folder IS NULL or @data_folder = ''
  6010.         select @data_folder = @mssql_data_path + '\DATA'
  6011.  
  6012.     IF @log_folder IS NULL or @log_folder = ''
  6013.         select @log_folder = @mssql_data_path + '\DATA'
  6014.  
  6015.     IF @data_file IS NULL
  6016.         SELECT @data_file = @database + '.MDF'
  6017.  
  6018.     IF @log_file IS NULL
  6019.         SELECT @log_file = @database + '.LDF'
  6020.  
  6021.     if substring(@data_folder, len(@data_folder), 1) = '\'
  6022.     select @data_folder = substring (@data_folder, 1, len(@data_folder) -1)
  6023.     if substring(@log_folder, len(@log_folder), 1) = '\'
  6024.     select @log_folder = substring (@log_folder, 1, len(@log_folder) -1)
  6025.  
  6026.     SELECT @data_path = @data_folder + '\' + @data_file
  6027.     SELECT @log_path = @log_folder + '\' + @log_file
  6028.  
  6029.     SELECT @data_path_quoted_for_copy = '"' + @data_folder + '\' + @data_file + '"'
  6030.     SELECT @log_path_quoted_for_copy = '"' + @log_folder + '\' + @log_file + '"'
  6031.  
  6032.     select @logical_data_file = @database
  6033.  
  6034.     /* 
  6035.     ** Truncate the logical log file name back to 128 characters
  6036.     ** long so the 'CREATE DATABASE' statement won't complain.
  6037.     */
  6038.     /* LEN(@logical_log_file) = LEN(@database) + LEN('_log') and
  6039.        LEN(@logical_log_file) <= 128 implies 
  6040.        LEN(@database) <=124 */
  6041.     IF (LEN(@database) > 124)
  6042.         SELECT @logical_log_file = SUBSTRING(@database, 1, 124) + '_log'  
  6043.     ELSE 
  6044.         SELECT @logical_log_file = @database + '_log'
  6045.  
  6046.     if (@createmode = @createmode_attach)
  6047.     begin
  6048.         select @canneddbdata_file = @mssql_data_path + '\DATA\DISTMDL.MDF'
  6049.         select @canneddblog_file = @mssql_data_path + '\DATA\DISTMDL.LDF'
  6050.  
  6051.         exec dbo.sp_MSget_file_existence @canneddbdata_file, @file_exists OUTPUT
  6052.         if (@file_exists = 0)
  6053.         begin
  6054.             /* Fallback to mode where instdist.sql needs to be run */
  6055.             select @createmode = @createmode_noattach
  6056.         end
  6057.  
  6058.         exec dbo.sp_MSget_file_existence @canneddblog_file, @file_exists OUTPUT
  6059.         if (@file_exists = 0)
  6060.         begin
  6061.             /* Fallback to mode where instdist.sql needs to be run */
  6062.             select @createmode = @createmode_noattach
  6063.         end
  6064.     end
  6065.  
  6066.     /*
  6067.     ** Create the distributor database if it does not exist
  6068.     */
  6069.     IF NOT EXISTS (SELECT * from master..sysdatabases WHERE name = @database collate database_default) AND (@createmode <> @createmode_attach)
  6070.     BEGIN
  6071.  
  6072.         -- Note: Use system's default file growth.
  6073.         IF @logical_data_file IS NOT NULL AND NOT EXISTS (SELECT * FROM master..sysdevices WHERE name = @logical_data_file collate database_default)
  6074.         BEGIN
  6075.             SELECT @on_clause = ' ON (NAME =''' + @logical_data_file + ''',FILENAME=''' + REPLACE( @data_path, '''', '''''' ) + 
  6076.                 ''', SIZE=' + @data_file_size_str + ', MAXSIZE = UNLIMITED)'
  6077.         END
  6078.  
  6079.         IF @logical_log_file IS NOT NULL AND NOT EXISTS (SELECT * FROM master..sysdevices WHERE name = @logical_log_file collate database_default)
  6080.         BEGIN
  6081.             SELECT @logon_clause = ' LOG ON (NAME =''' + @logical_log_file + ''',FILENAME=''' + REPLACE( @log_path, '''', '''''' ) + 
  6082.                 ''', SIZE=' + @log_file_size_str + ', MAXSIZE= UNLIMITED)'          
  6083.         END
  6084.  
  6085.         /*
  6086.         ** Create distributor database
  6087.         */
  6088.         SELECT @command = 'USE master  CREATE DATABASE ' +  QUOTENAME(@database) + 
  6089.             + isnull(@on_clause, ' ') + isnull(@logon_clause, ' ')
  6090.  
  6091.         EXEC (@command)
  6092.         IF @@ERROR <> 0
  6093.             RETURN (1)
  6094.         SELECT @db_exists = 0
  6095.     END
  6096.     ELSE IF NOT EXISTS (SELECT * from master..sysdatabases WHERE name = @database collate database_default) AND (@createmode = @createmode_attach)
  6097.     BEGIN
  6098.     /* DO THE CREATE DATABASE FOR ATTACH STUFF */
  6099.         
  6100.         exec dbo.sp_MSget_file_existence @data_path, @data_file_preexists OUTPUT
  6101.         if (@data_file_preexists = 1)
  6102.         begin
  6103.             raiserror(5170, 16, -1, @data_path)
  6104.             return 1
  6105.         end
  6106.     
  6107.         SELECT @on_clause = ' ON (NAME = ''' + @logical_data_file + ''', FILENAME=''' + REPLACE( @data_path, '''', '''''' ) + ''')'
  6108.         
  6109.         exec dbo.sp_MSget_file_existence @log_path, @log_file_preexists OUTPUT
  6110.         if (@log_file_preexists = 1)
  6111.         begin
  6112.             raiserror(5170, 16, -1, @log_path)
  6113.             return 1
  6114.         end
  6115.  
  6116.         SELECT @logon_clause = ' LOG ON (NAME = ''' + @logical_log_file + ''', FILENAME=''' + REPLACE( @log_path, '''', '''''' ) + ''')'
  6117.  
  6118.         select @filecopy_cmd = 'copy "' + @canneddbdata_file + '" ' + @data_path_quoted_for_copy
  6119.         EXEC @retcode = master..xp_cmdshell @filecopy_cmd, NO_OUTPUT
  6120.         IF @retcode <> 0 OR @@ERROR <> 0
  6121.         BEGIN
  6122.             RAISERROR (14113, 16, -1, @filecopy_cmd, 'instdist.out')
  6123.             return (1)
  6124.         END
  6125.  
  6126.         select @filecopy_cmd = 'copy "' + @canneddblog_file + '" ' + @log_path_quoted_for_copy
  6127.         EXEC @retcode = master..xp_cmdshell @filecopy_cmd, NO_OUTPUT
  6128.         IF @retcode <> 0 OR @@ERROR <> 0
  6129.         BEGIN
  6130.             RAISERROR (14113, 16, -1, @filecopy_cmd, 'instdist.out')
  6131.             return (1)
  6132.         END
  6133.  
  6134.         /*
  6135.         ** Create distributor database
  6136.         */
  6137.         SELECT @command = 'USE master  CREATE DATABASE ' +  QUOTENAME(@database) + 
  6138.             + @on_clause + @logon_clause + ' FOR ATTACH'
  6139.  
  6140.         EXEC (@command)
  6141.         IF @@ERROR <> 0
  6142.         begin
  6143.             RETURN (1)
  6144.         end
  6145.         dbcc dbreindexall(@database, 240) with no_infomsgs
  6146.  
  6147.         SELECT @db_exists = 0
  6148.     END
  6149.     ELSE
  6150.     BEGIN
  6151.         SELECT @db_exists = 1
  6152.     END
  6153.  
  6154.     -- Must make the dist db owned by sa so that the sps in it can select from
  6155.     -- security cache tables in tempdb by owership chain rule.
  6156.     declare @retcode2 int
  6157.     select @retcode2 = 0
  6158.     select @distproc = QUOTENAME(@database) + '.dbo.sp_executesql'
  6159.     SELECT @command = 
  6160.         -- If the db is created by sa or from attach, sa is dbo already.
  6161.         -- sp_changedbowner will fail is the new owner is an user in the db already.
  6162.         ' if not exists (select * from sysusers where sid = 0x01) ' +
  6163.         ' exec @retcode2 = dbo.sp_changedbowner ''sa'''
  6164.     EXEC @retcode = @distproc @command, N'@retcode2 int output', @retcode2 output
  6165.     IF @retcode <> 0 or @retcode2 <> 0 or @@ERROR <> 0
  6166.     BEGIN
  6167.         GOTO UNDO
  6168.     END
  6169.  
  6170.     /* Set the database option truncate log on checkpoint & turn off autoclose which is default of win9x*/
  6171.     IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE 
  6172.         name = @database collate database_default AND
  6173.         (status & @trunc_log_bit) = 0 )   -- if its not already marked
  6174.     BEGIN
  6175.         EXEC @retcode = dbo.sp_dboption @database, 'trunc. log on chkpt.', 'true'
  6176.         IF @retcode <> 0 OR @@ERROR <> 0
  6177.         BEGIN
  6178.             GOTO UNDO
  6179.         END
  6180.     END
  6181.  
  6182.     EXEC @retcode = dbo.sp_dboption @database, 'autoclose', 'false'
  6183.         IF @retcode <> 0 OR @@ERROR <> 0
  6184.         BEGIN
  6185.             GOTO UNDO
  6186.         END
  6187.  
  6188.     /*
  6189.     **
  6190.     ** Update sysdatabase category bit
  6191.     ** This is to prevent user from dropping the database.
  6192.     **/
  6193.     if (@createmode <> @createmode_fordetach)
  6194.     begin
  6195.         UPDATE master..sysdatabases SET category = category | @distbit WHERE name = @database collate database_default
  6196.         IF @@ERROR <> 0
  6197.         BEGIN
  6198.             GOTO UNDO
  6199.         END
  6200.     end
  6201.  
  6202.     /* 
  6203.     ** Install instdist.sql
  6204.     */
  6205.  
  6206.     if (@createmode <> @createmode_attach) OR (@db_exists = 1)
  6207.     begin
  6208.         if (( platform() & @platform_nt = @platform_nt ))
  6209.             select @osql_for_nt = 1
  6210.         else
  6211.             select @osql_for_nt = 0
  6212.  
  6213.         -- Always use integrated security on WINNT since @login passed-in is for remote 
  6214.         -- subscriber and may not have enough privilege to apply the script
  6215.         IF (@security_mode = 1 or @osql_for_nt = 1) AND NOT (@security_mode = 0 AND @createmode = 2)
  6216.         BEGIN
  6217.             SELECT @osql_cmd = '" "' + @osql_path + '\binn\osql" -E '  
  6218.             if serverproperty('instancename') is not null
  6219.                 SELECT @osql_cmd = @osql_cmd + ' -S"' + @@SERVERNAME + '" '
  6220.         END
  6221.         ELSE
  6222.         BEGIN
  6223.         -- cannot specify -S w/ -E for local execution, SID does not map 
  6224.         if (@osql_for_nt = 1)
  6225.             SELECT @osql_cmd = '" "' + @osql_path + '\binn\osql" -U"' + @login + '" -P"' + 
  6226.                 isnull(@password,'') + '" -S"' + @@SERVERNAME + '" '
  6227.         else
  6228.             SELECT @osql_cmd = '"'   + @osql_path + '\binn\osql" -U"' + @login + '" -P"' + 
  6229.                 isnull(@password,'') + '" -S"' + @@SERVERNAME + '" '
  6230.         END
  6231.     
  6232.         select @osql_cmd = @osql_cmd + '-l60 -t60 '
  6233.  
  6234.         -- We must use -b option to make osql return error code !!
  6235.         SELECT @osql_cmd = @osql_cmd + 
  6236.             ' -d"' + @database + '" -b ' +
  6237.             ' -i' + '"' + @install_path + '\install\instdist.sql"' + 
  6238.             ' -o' + '"' + @install_path + '\install\instdist.out"'
  6239.  
  6240.         if (@osql_for_nt = 1)
  6241.         BEGIN
  6242.             SELECT @osql_cmd = @osql_cmd + ' "'
  6243.         END
  6244.     
  6245.         EXEC @retcode = master..xp_cmdshell @osql_cmd
  6246.         IF @retcode <> 0 OR @@ERROR <> 0
  6247.         BEGIN
  6248.             RAISERROR (14113, 16, -1, @osql_cmd, 'instdist.out')
  6249.             GOTO UNDO       
  6250.         END
  6251.     end
  6252.     
  6253.     if (@createmode <> @createmode_fordetach)
  6254.     begin
  6255.         /* Set db_existed bit in MSrepl_version */
  6256.         IF @db_exists = 1
  6257.         BEGIN
  6258.             SELECT @distproc = 'UPDATE ' +
  6259.                 @database + '..MSrepl_version SET db_existed = 0x1'
  6260.     
  6261.             EXEC(@distproc)
  6262.             IF @@ERROR <> 0
  6263.             BEGIN
  6264.                 GOTO UNDO       
  6265.             END
  6266.         END
  6267.  
  6268.         DELETE msdb.dbo.MSdistributiondbs WHERE name = @database collate database_default
  6269.         IF @@ERROR <> 0
  6270.         BEGIN
  6271.             GOTO UNDO       
  6272.         END
  6273.  
  6274.         INSERT INTO msdb.dbo.MSdistributiondbs VALUES (
  6275.             @database, @min_distretention, @max_distretention, @history_retention
  6276.             )
  6277.         IF @@ERROR <> 0
  6278.         BEGIN
  6279.             GOTO UNDO       
  6280.         END
  6281.  
  6282.         -- This login need db_owner priviledge to call sps in distribution db
  6283.         declare @distributor_login sysname
  6284.         select @distributor_login = 'distributor_admin'
  6285.  
  6286.         select @command = quotename(@database) + '.dbo.sp_MSrepl_dbrole'
  6287.         exec @retcode = @command 'db_owner', @distributor_login, 'add'
  6288.         IF @@error <> 0 OR @retcode <> 0
  6289.             GOTO UNDO
  6290.  
  6291.         if @from_scripting = 0
  6292.         begin
  6293.             /*
  6294.             ** Create the history cleanup agent.
  6295.             */
  6296.             SELECT @agentname = formatmessage (20567, @database)
  6297.             SELECT @command =  'EXEC dbo.sp_MShistory_cleanup @history_retention = ' + 
  6298.                 CONVERT(nvarchar(12), @history_retention)
  6299.  
  6300.             IF EXISTS (SELECT * FROM msdb..sysjobs_view WHERE name = @agentname collate database_default and
  6301.                 UPPER(originating_server) = UPPER(CONVERT(NVARCHAR(30), SERVERPROPERTY('ServerName'))))
  6302.             BEGIN
  6303.                 EXEC @retcode = msdb.dbo.sp_delete_job 
  6304.                     @job_name = @agentname
  6305.                 IF @@ERROR <> 0 or @retcode <> 0
  6306.                 BEGIN
  6307.                     GOTO UNDO
  6308.                 END
  6309.             END
  6310.  
  6311.             set @description = formatmessage(20535)
  6312.  
  6313.             -- Get History Cleanup category name (assumes category_id = 12)
  6314.             select @category_name = name FROM msdb.dbo.syscategories where category_id = 12
  6315.  
  6316.             EXECUTE @retcode = dbo.sp_MSadd_repl_job @agentname,
  6317.             @subsystem = 'TSQL',
  6318.             @server = @@SERVERNAME,
  6319.             @databasename = @database,
  6320.             @description = @description,
  6321.             @freqtype = 4,    
  6322.             @freqsubtype = 4,         
  6323.             @freqsubinterval = 10,    /* Number of minutes between runs */ 
  6324.             @command = @command,
  6325.             @enabled = 1,
  6326.             @retryattempts = 0,
  6327.             @loghistcompletionlevel = 0,
  6328.             @category_name = @category_name
  6329.     
  6330.             IF @@ERROR <> 0 or @retcode <> 0
  6331.             BEGIN
  6332.                 GOTO UNDO
  6333.             END
  6334.  
  6335.             /*
  6336.             ** Create the distribution cleanup agent.
  6337.             */
  6338.             SELECT @agentname = formatmessage (20568, @database)
  6339.             SELECT @command =  'EXEC dbo.sp_MSdistribution_cleanup @min_distretention = ' + 
  6340.                 CONVERT(nvarchar(12), @min_distretention) + ', @max_distretention = ' +
  6341.                 CONVERT(nvarchar(12), @max_distretention)
  6342.  
  6343.             IF EXISTS (SELECT * FROM msdb..sysjobs_view WHERE name = @agentname collate database_default and
  6344.                 UPPER(originating_server) = UPPER(CONVERT(NVARCHAR(30), SERVERPROPERTY('ServerName'))))
  6345.             BEGIN
  6346.                 EXEC @retcode = msdb.dbo.sp_delete_job 
  6347.                     @job_name = @agentname
  6348.                 IF @@ERROR <> 0 or @retcode <> 0
  6349.                 BEGIN
  6350.                     GOTO UNDO
  6351.                 END
  6352.             END
  6353.  
  6354.             set @description = formatmessage(20541)
  6355.             -- Get Distribution Cleanup category name (assumes category_id = 11)
  6356.             select @category_name = name FROM msdb.dbo.syscategories where category_id = 11
  6357.     
  6358.             EXECUTE @retcode = msdb.dbo.sp_MSadd_repl_job @agentname,
  6359.             @subsystem = 'TSQL',
  6360.             @server = @@SERVERNAME,
  6361.             @databasename = @database,
  6362.             @description = @description,
  6363.             @freqtype = 4,    
  6364.             @freqsubtype = 4,         
  6365.             @freqsubinterval = 10,    /* Number of minutes between runs */ 
  6366.             @command = @command,
  6367.             @retryattempts = 0,
  6368.             @enabled = 0,
  6369.             @loghistcompletionlevel = 0,
  6370.             @category_name = @category_name,
  6371.             -- Start  and end time is 5 min off from the history cleanup, which use the default.
  6372.             @activestarttimeofday = 000500,
  6373.             @activeendtimeofday   = 000459
  6374.  
  6375.             IF @@ERROR <> 0 or @retcode <> 0
  6376.             BEGIN
  6377.                 GOTO UNDO
  6378.             end
  6379.         end
  6380.     end
  6381.     else
  6382.     begin
  6383.         /*detach */
  6384.         dbcc detachdb(@database)
  6385.     end
  6386.     
  6387.     RETURN(0)
  6388.  
  6389. UNDO:
  6390.  
  6391.     IF @db_exists = 0
  6392.         EXECUTE dbo.sp_dropdistributiondb @database
  6393.  
  6394.     /* Need to do it since sp_dropdistributiondb will fail in some cases */
  6395.     UPDATE master..sysdatabases SET category = category & ~@distbit WHERE name = @database collate database_default
  6396.     
  6397.     DELETE msdb.dbo.MSdistributiondbs where name = @database collate database_default
  6398.  
  6399.     /* drop the database and ignore error */
  6400.     IF @db_exists = 0 AND
  6401.         EXISTS (SELECT * from master..sysdatabases WHERE name = @database collate database_default)
  6402.     BEGIN
  6403.         SELECT @command = 'USE master  DROP DATABASE ' +  QUOTENAME(@database) 
  6404.         EXEC (@command)
  6405.     END
  6406.  
  6407.     if (@createmode = @createmode_attach)
  6408.     begin
  6409.         if (@data_file_preexists = 0)
  6410.         begin
  6411.             select @command = 'del ' + @data_path_quoted_for_copy
  6412.             exec master..xp_cmdshell @command
  6413.             --ignore errors
  6414.         end
  6415.         if (@log_file_preexists = 0)
  6416.         begin
  6417.             select @command = 'del ' + @log_path_quoted_for_copy
  6418.             exec master..xp_cmdshell @command
  6419.             --ignore errors
  6420.         end
  6421.     end
  6422.         
  6423.     RETURN(1)        
  6424. GO
  6425.  
  6426. dump tran master with no_log
  6427. GO
  6428.  
  6429. raiserror('Creating procedure sp_dropdistpublisher', 0,1)
  6430. go
  6431.  
  6432. CREATE PROCEDURE sp_dropdistpublisher (
  6433.     @publisher sysname,         /* publisher server name */
  6434.     @no_checks bit = 0
  6435.         ) AS
  6436.  
  6437.     SET NOCOUNT ON
  6438.  
  6439.     DECLARE @distributor sysname
  6440.     DECLARE @distaccount nvarchar(127)
  6441.     DECLARE @proc nvarchar (255)
  6442.     DECLARE @retcode int
  6443.     DECLARE @privilege sysname
  6444.     DECLARE @reg_key nvarchar(255)
  6445.     DECLARE @return_status int
  6446.     DECLARE @foundSubscriber int 
  6447.     DECLARE @distribdb sysname
  6448.     DECLARE @command nvarchar(255)
  6449.     DECLARE @active_value int
  6450.     DECLARE @publish_bit int
  6451.     DECLARE @mergepub_bit int
  6452.  
  6453.  
  6454.     SELECT @return_status = 0
  6455.     SELECT @foundSubscriber = 0
  6456.  
  6457.     SELECT @publish_bit = 1
  6458.     SELECT @mergepub_bit = 4
  6459.  
  6460.     /*
  6461.     ** Parameter Check:  @publisher.
  6462.     ** Check to make sure that the publisher exists, that the name isn't
  6463.     ** NULL, and that the name conforms to the rules for identifiers.
  6464.     */
  6465.  
  6466.     IF @publisher IS NULL
  6467.         BEGIN
  6468.             RAISERROR (14043, 16, -1, '@publisher')
  6469.             RETURN (1)
  6470.         END
  6471.  
  6472.     EXECUTE @retcode = dbo.sp_validname @publisher
  6473.  
  6474.     IF @retcode <> 0
  6475.         RETURN (1)
  6476.  
  6477.     /*
  6478.     ** Get distribution server information for remote RPC
  6479.     ** agent verification.
  6480.     */
  6481.     EXEC @retcode = dbo.sp_helpdistributor @publisher = @publisher,
  6482.         @distributor = @distributor OUTPUT,
  6483.         @distribdb = @distribdb OUTPUT
  6484.     IF @@error <> 0 OR @retcode <> 0
  6485.         BEGIN
  6486.         RAISERROR (14071, 16, -1)
  6487.            RETURN (1)
  6488.     END
  6489.  
  6490.     /*
  6491.     ** Only a local distributor can be modified.
  6492.     */
  6493.     IF UPPER(@distributor) <> UPPER(@@SERVERNAME)
  6494.         BEGIN
  6495.         RAISERROR (14114, 16, -1, @@SERVERNAME)
  6496.         RETURN (1)
  6497.         END
  6498.  
  6499.     IF NOT EXISTS (SELECT *
  6500.     FROM msdb..MSdistpublishers
  6501.             WHERE UPPER(name) = UPPER(@publisher) collate database_default)
  6502.     BEGIN
  6503.         RAISERROR (14080, 11, -1)
  6504.         RETURN (1)
  6505.     END
  6506.  
  6507.  
  6508.     IF UPPER(@publisher) = UPPER(@@SERVERNAME)
  6509.     BEGIN
  6510.         /* 
  6511.         ** If @publisher is local, 
  6512.         ** 1. check to make sure there is no subscriber 
  6513.         ** for the publisher in the distribution database
  6514.         ** 2. check to make sure there are not database enabled for replication
  6515.         */
  6516.         -- Check to see if there are subscribers defined.
  6517.         if exists (SELECT *
  6518.                      FROM master..sysservers
  6519.                     WHERE srvstatus & 4 <> 0)
  6520.         begin
  6521.             raiserror(21047, 16, -1)
  6522.             return(1)
  6523.         end
  6524.         
  6525.         IF EXISTS (SELECT * FROM master..sysdatabases WHERE 
  6526.             (category & @publish_bit) <> 0 OR
  6527.             (category & @mergepub_bit) <> 0)
  6528.         BEGIN 
  6529.             RAISERROR (21033, 16, -1, @@SERVERNAME)
  6530.             RETURN (1)
  6531.         END
  6532.     END
  6533.     ELSE
  6534.     BEGIN
  6535.         if @no_checks = 0
  6536.         begin
  6537.             /* 
  6538.             ** If the publisher is remote, check the status of the distpublisher 
  6539.             ** The status will be inactive if the remote publisher dropped the
  6540.             ** distributor.
  6541.             */
  6542.  
  6543.             IF EXISTS (SELECT * FROM msdb.dbo.MSdistpublishers WHERE
  6544.                 UPPER(name) = UPPER(@publisher) collate database_default and active = 1)
  6545.             BEGIN
  6546.                 RAISERROR (14098, 16, -1, @publisher, @@SERVERNAME)
  6547.                 RETURN (1)
  6548.             END
  6549.         end
  6550.         else
  6551.         begin
  6552.             SELECT @command = @distribdb + '.dbo.sp_MSdistpublisher_cleanup'
  6553.             exec @retcode = @command @publisher
  6554.             if @retcode <> 0 or @@error <> 0
  6555.                 return 1
  6556.         end
  6557.     END
  6558.  
  6559.     DELETE msdb..MSdistpublishers where UPPER(name) = UPPER(@publisher) collate database_default
  6560.     IF @@ERROR <> 0  RETURN (1)
  6561.  
  6562.  
  6563.     declare @fExists int
  6564.     exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'distributor_admin', 'sa'
  6565.     if (@fExists = 1)
  6566.     BEGIN
  6567.        EXECUTE @retcode = dbo.sp_dropremotelogin @publisher, 'distributor_admin', sa
  6568.        IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
  6569.     END
  6570.  
  6571.     exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'distributor_admin', 
  6572.         'distributor_admin'
  6573.     if (@fExists = 1)
  6574.     BEGIN
  6575.        EXECUTE @retcode = dbo.sp_dropremotelogin @publisher, 'distributor_admin',
  6576.             'distributor_admin'
  6577.        IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
  6578.     END
  6579.  
  6580. /* SECURITY ********************************
  6581.     IF EXISTS (SELECT * FROM master..sysremotelogins
  6582.        WHERE remoteserverid = (SELECT srvid FROM master..sysservers
  6583.        WHERE UPPER(srvname) = UPPER(@publisher) collate database_default)
  6584.        AND remoteusername = 'sa'
  6585.        AND suid = 1)     --'sa' 
  6586. *********************************/
  6587.  
  6588.  
  6589. /* SECURITY ********************************
  6590.     IF EXISTS (SELECT * FROM master..sysremotelogins
  6591.        WHERE remoteserverid = (SELECT srvid FROM master..sysservers
  6592.        WHERE UPPER(srvname) = UPPER(@publisher) collate databsae_default)
  6593.        AND remoteusername = 'probe'
  6594.        AND suid = 10)     -- 'probe' 
  6595.     exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'probe', 'probe'
  6596.     if (@fExists = 1)
  6597.     BEGIN
  6598.        EXECUTE @retcode = dbo.sp_remoteoption @publisher, probe, probe, trusted, false
  6599.        IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
  6600.     END
  6601. *********************************/
  6602.  
  6603.     return(@return_status)
  6604. GO
  6605.  
  6606. raiserror('Creating procedure sp_adddistpublisher', 0,1)
  6607. go
  6608.  
  6609. CREATE PROCEDURE sp_adddistpublisher (
  6610.     @publisher sysname,      /* publisher server name */
  6611.     @distribution_db sysname,
  6612.     @security_mode int = NULL,
  6613.     @login sysname = 'sa',
  6614.     @password sysname = NULL,
  6615.     @working_directory nvarchar(255),
  6616.     @trusted nvarchar(5) = NULL,
  6617.     @encrypted_password bit = 0,
  6618.     @thirdparty_flag bit = 0
  6619.         ) AS
  6620.  
  6621.     SET NOCOUNT ON
  6622.  
  6623.     /*
  6624.     ** Declarations.
  6625.     */
  6626.  
  6627.     DECLARE @retcode int
  6628.     DECLARE @reg_key nvarchar(255)
  6629.     DECLARE @distbit int
  6630.     DECLARE @active_value int
  6631.     DECLARE @server_added bit
  6632.     DECLARE @proc nvarchar(255)
  6633.     declare @fExists int
  6634.     declare @command nvarchar(255)
  6635.     declare @trusted_id bit
  6636.     declare @platform_nt binary
  6637.     declare @qv_replication varchar(10)
  6638.     declare @qv_replication_unlimited integer
  6639.     declare @qv_value_replication integer
  6640.     declare @enc_password nvarchar(524)
  6641.  
  6642.     select @platform_nt = 0x1
  6643.     select @qv_replication = '2745196162', @qv_replication_unlimited = 0
  6644.  
  6645.     SELECT @distbit = 16
  6646.     SELECT @server_added = 0
  6647.  
  6648.     /* 
  6649.     ** Check if replication components are installed on this server
  6650.     */
  6651.     exec @retcode = dbo.sp_MS_replication_installed
  6652.     if (@retcode <> 1)
  6653.     begin
  6654.         return (1)
  6655.     end
  6656.  
  6657.     IF @working_directory IS NULL or ltrim(rtrim(@working_directory)) = ' '
  6658.     BEGIN
  6659.         RAISERROR (14043, 16, -1, '@working_directory')
  6660.         return (1)
  6661.     END
  6662.  
  6663.  
  6664.     /*
  6665.     ** Parameter Check:  @publisher.
  6666.     ** Check to make sure that the publisher is not NULL and that it
  6667.     ** conforms to the rules for identifiers.
  6668.     */
  6669.  
  6670.     IF @publisher IS NULL
  6671.         BEGIN
  6672.             RAISERROR (14043, 16, -1, '@publisher')
  6673.             return (1)
  6674.         END
  6675.  
  6676.     EXECUTE @retcode = dbo.sp_validname @publisher
  6677.  
  6678.     IF @@ERROR <> 0 OR @retcode <> 0
  6679.         return (1)
  6680.  
  6681.     IF @password = N''
  6682.         select @password = NULL
  6683.  
  6684.     /* On REPLICATION_LIMITED server, only local publisher is supported.
  6685.      * Note: The login and password registered for local publisher will be used for 
  6686.      * local agents to login to distributor, thus local publisher has to be installed first.
  6687.      * We choose not to support remote dist publshers on REPLICATION_LIMITED server altogether.
  6688.      * On NT, local agents will always use integrated security to log into 
  6689.      * distributor
  6690.      * Today, REPLICATION_LIMITED means desktop but we check specific sku entry just in case
  6691.     */
  6692.     exec @qv_value_replication = master.dbo.sp_MSinstance_qv @qv_replication    
  6693.  
  6694.     if ( @qv_value_replication != @qv_replication_unlimited ) and ( UPPER(@publisher) <> UPPER(@@servername) )
  6695.     begin
  6696.         -- remote dist publisher is not supported on this server version
  6697.         raiserror(21041,16,-1)
  6698.         return (1)
  6699.     end
  6700.  
  6701.  
  6702.     -- Set default security
  6703.     IF @security_mode IS NULL
  6704.     BEGIN
  6705.         IF (UPPER(@publisher) = UPPER(@@SERVERNAME) and ( platform() & @platform_nt = @platform_nt ) )
  6706.             SELECT @security_mode = 1
  6707.         ELSE
  6708.             SELECT @security_mode = 0
  6709.     END
  6710.  
  6711.     /* 
  6712.     ** Check for invalid security mode
  6713.     */
  6714.     IF @security_mode < 0 OR @security_mode > 1
  6715.         BEGIN
  6716.             RAISERROR(14109, 16, -1)
  6717.             return (1)
  6718.         END
  6719.  
  6720.     IF (UPPER(@publisher) = UPPER(@@SERVERNAME) and ( @platform_nt != platform() & @platform_nt ) and @security_mode = 1)
  6721.     BEGIN
  6722.         RAISERROR(21038, 16, -1)
  6723.         RETURN (1)
  6724.     END
  6725.  
  6726.     -- Encrypt the password
  6727.     select @enc_password = @password
  6728.     IF @encrypted_password = 0
  6729.     BEGIN
  6730.         EXEC @retcode = master.dbo.xp_repl_encrypt @enc_password OUTPUT
  6731.         IF @@error <> 0 OR @retcode <> 0
  6732.             return 1
  6733.     END
  6734.  
  6735.     -- Validate the working directory 
  6736.     -- Remove heading and trailing spaces
  6737.     select @working_directory = RTRIM(LTRIM(@working_directory))
  6738.     
  6739.     -- if the last char is '\', remove it.
  6740.     if substring(@working_directory, len(@working_directory),1) = '\'
  6741.         select @working_directory = substring(@working_directory, 1,
  6742.             len(@working_directory)-1)
  6743.  
  6744.     -- Don't do validation if it is a UNC path due to security problem.
  6745.     -- If the server is started as a service using local system account, we
  6746.     -- don't have access to the UNC path.
  6747.     if substring(@working_directory, 1,2) <> '\\'
  6748.     begin
  6749.         select @command = 'dir "' + @working_directory + '"'
  6750.         exec @retcode = master..xp_cmdshell @command, 'no_output'
  6751.         if @@error <> 0
  6752.             return (1)
  6753.         if @retcode <> 0 
  6754.         begin
  6755.             raiserror (21037, 16, -1, @working_directory)
  6756.             return (1)
  6757.         end
  6758.     end
  6759.  
  6760.     /*
  6761.     ** Parameter Check:  @trusted
  6762.     */
  6763.  
  6764.     if @trusted is null
  6765.     begin
  6766.         if UPPER(@publisher) = UPPER(@@servername)
  6767.             select @trusted = 'false'
  6768.         else
  6769.             select @trusted = 'true'
  6770.     end
  6771.  
  6772.     IF LOWER(@trusted) NOT IN ('true', 'false')
  6773.         BEGIN
  6774.             RAISERROR (14148, 16, -1, '@trusted')
  6775.             RETURN (1)
  6776.         END
  6777.  
  6778.     IF LOWER(@trusted) = 'true' SELECT @trusted_id = 1
  6779.     ELSE SELECT @trusted_id = 0
  6780.  
  6781.     /*
  6782.     ** Check to make sure this is a distributor
  6783.     */
  6784.     IF NOT EXISTS (SELECT * FROM master..sysservers
  6785.               WHERE UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  6786.                  AND srvstatus & 8 <> 0)
  6787.     BEGIN
  6788.         RAISERROR (14114, 16, -1, @@SERVERNAME)
  6789.         return (1)
  6790.     END
  6791.  
  6792.     /*
  6793.     ** Check if database is configured as a distributor database
  6794.     */
  6795.     IF NOT EXISTS (SELECT * FROM msdb..MSdistributiondbs WHERE name = @distribution_db collate database_default)
  6796.     BEGIN
  6797.         RAISERROR (14117, 16, -1, @distribution_db)
  6798.         return (1)
  6799.     END
  6800.  
  6801.     /* Check if publisher is already defined. */
  6802.     IF EXISTS (SELECT *
  6803.          FROM msdb..MSdistpublishers
  6804.         WHERE UPPER(name) = UPPER(@publisher) collate database_default)
  6805.  
  6806.     BEGIN
  6807.         RAISERROR (14074, 16, -1, @publisher)
  6808.         RETURN (1)
  6809.     END
  6810.  
  6811.  
  6812.  
  6813.     IF NOT EXISTS (SELECT *
  6814.              FROM master..sysservers
  6815.             WHERE UPPER(srvname) = UPPER(@publisher) collate database_default)
  6816.  
  6817.     /* Add the server if it does not exist. */
  6818.     BEGIN
  6819.         EXECUTE @retcode = dbo.sp_addserver @publisher
  6820.         IF @@error <> 0 OR @retcode <> 0
  6821.         BEGIN
  6822.             RAISERROR (14075, 16, -1)
  6823.             GOTO UNDO
  6824.         END
  6825.         SELECT @server_added = 1
  6826.     END
  6827.     ELSE
  6828.     BEGIN
  6829.         SELECT @publisher = fn_getpersistedservernamecasevariation(@publisher) collate database_default
  6830.     END
  6831.      
  6832.     /*
  6833.     ** Set the Active  value.
  6834.     ** If the @publisher is local, set it to true.
  6835.     ** Otherwise, set it to false
  6836.     */
  6837.     IF UPPER(@publisher) = UPPER(@@SERVERNAME)
  6838.         SELECT @active_value = 1
  6839.     ELSE
  6840.         SELECT @active_value = 0
  6841.  
  6842.  
  6843.     DELETE msdb.dbo.MSdistpublishers where UPPER(name) = UPPER(@publisher) collate database_default
  6844.     IF @@ERROR <> 0
  6845.     BEGIN
  6846.         GOTO UNDO       
  6847.     END
  6848.  
  6849.     INSERT INTO msdb.dbo.MSdistpublishers VALUES (
  6850.         @publisher, @distribution_db, @working_directory,
  6851.         @security_mode, @login, @enc_password, @active_value, @trusted_id, @thirdparty_flag)
  6852.     IF @@ERROR <> 0
  6853.     BEGIN
  6854.         GOTO UNDO       
  6855.     END
  6856.  
  6857.     -- Add distributor_admin to distribution_admin non trusted mapping
  6858.     exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, null, 
  6859.         'distributor_admin'
  6860.     if( @fExists = 0 )
  6861.     BEGIN
  6862.  
  6863.         EXECUTE @retcode = dbo.sp_addremotelogin @publisher, 'distributor_admin', 
  6864.             'distributor_admin'
  6865.         IF @@error <> 0 OR @retcode <> 0
  6866.         BEGIN
  6867.             RAISERROR (14075, 16, -1)
  6868.             GOTO UNDO
  6869.         END
  6870.     END
  6871.  
  6872.     -- For 6x publisher, we still need the trusted sa to sa.
  6873.     -- For 6x publisher upgrading to 7.0, distributor_admin to distributor_admin need to be trusted.
  6874.     -- add remotelogin of SA if it doesn't already exist
  6875.     -- If there's a mapping for remote login sa already, we cannot map it to distributor_admin
  6876.     -- this is the case of server upgraded from 6.5.
  6877.     exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, null, 'sa'
  6878.     if( @fExists = 0 )
  6879.     BEGIN
  6880.         EXECUTE @retcode = dbo.sp_addremotelogin @publisher, 'distributor_admin', 'sa'
  6881.         IF @@error <> 0 OR @retcode <> 0
  6882.         BEGIN
  6883.             RAISERROR (14075, 16, -1)
  6884.             GOTO UNDO
  6885.         END
  6886.     END
  6887.     if @trusted_id = 1
  6888.     begin
  6889.         exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'distributor_admin', 'sa'
  6890.         if( @fExists = 1 )
  6891.         BEGIN
  6892.             EXECUTE @retcode = dbo.sp_remoteoption @publisher, 'distributor_admin', 'sa', trusted, true
  6893.             IF @@error <> 0 OR @retcode <> 0
  6894.             BEGIN
  6895.                 RAISERROR (14075, 16, -1)
  6896.                 GOTO UNDO
  6897.             END
  6898.         END
  6899.  
  6900.         EXECUTE @retcode = dbo.sp_remoteoption @publisher, 'distributor_admin', 'distributor_admin', trusted, true
  6901.         IF @@error <> 0 OR @retcode <> 0
  6902.         BEGIN
  6903.             RAISERROR (14075, 16, -1)
  6904.             GOTO UNDO
  6905.         END
  6906.     END
  6907.  
  6908.  
  6909.     /* Add remotelogin enabling the 'probe' of the publisher to
  6910.     ** RPC for distribution counter information.
  6911.     */
  6912. /* SECURITY ********************************
  6913.     IF NOT EXISTS (SELECT *
  6914.               FROM master..sysremotelogins srl,
  6915.                master..sysservers ss
  6916.              WHERE UPPER(ss.srvname) = UPPER(@publisher) collate database_default
  6917.            AND srl.remoteserverid = ss.srvid
  6918.            AND srl.remoteusername = 'probe'
  6919.        AND srl.suid = 10)    -- 'probe' 
  6920.     exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'probe', 'probe'
  6921.     if (@fExists = 0)
  6922.     BEGIN
  6923.        EXECUTE @retcode = dbo.sp_addremotelogin @publisher, 'probe', 'probe'
  6924.        IF @@error <> 0 OR @retcode <> 0
  6925.        BEGIN
  6926.         RAISERROR (14075, 16, -1)
  6927.         GOTO UNDO
  6928.        END
  6929.     END
  6930. *********************************/
  6931.     
  6932.     RETURN(0)
  6933.  
  6934. UNDO:
  6935.     -- If the server is marked, drop it
  6936.     IF EXISTS (SELECT *
  6937.          FROM msdb..MSdistpublishers
  6938.         WHERE UPPER(name) = UPPER(@publisher) collate database_default)
  6939.         EXEC dbo.sp_dropdistpublisher @publisher
  6940.  
  6941.     IF @server_added = 1
  6942.         EXEC dbo.sp_dropserver @publisher
  6943.  
  6944.     RETURN(1)
  6945. GO
  6946.  
  6947.  
  6948. raiserror('Creating procedure sp_changedistpublisher', 0,1)
  6949. go
  6950.  
  6951. CREATE PROCEDURE sp_changedistpublisher (
  6952.     @publisher sysname,
  6953.     @property sysname     = NULL,     /* The property to change */
  6954.     @value nvarchar(255)     = NULL      /* The new property value */
  6955.     ) AS
  6956.  
  6957.     SET NOCOUNT ON
  6958.  
  6959.     /*
  6960.     ** Declarations.
  6961.     */
  6962.     DECLARE @retcode int
  6963.     DECLARE @new_database sysname
  6964.     DECLARE @new_security_mode int
  6965.     DECLARE @new_login sysname
  6966.     DECLARE @new_password nvarchar(524)
  6967.     DECLARE @distbit int
  6968.     DECLARE @new_active int
  6969.     DECLARE @new_trusted bit
  6970.     DECLARE @command nvarchar(255)
  6971.     declare @distribdb sysname
  6972.     DECLARE @platform_nt binary
  6973.  
  6974.     SELECT @platform_nt = 0x1
  6975.     SELECT @distbit = 16
  6976.     
  6977.     /*
  6978.     ** Parameter Check:  @property.
  6979.     ** If the @property parameter is NULL, print the options.
  6980.     */
  6981.  
  6982.     IF @property IS NULL
  6983.         BEGIN
  6984.             CREATE TABLE #tab1 (properties sysname collate database_default not null)
  6985.             INSERT INTO #tab1 VALUES ('distribution_db')
  6986.             INSERT INTO #tab1 VALUES ('working_directory')
  6987.             INSERT INTO #tab1 VALUES ('security_mode')
  6988.             INSERT INTO #tab1 VALUES ('login')
  6989.             INSERT INTO #tab1 VALUES ('password')
  6990.             INSERT INTO #tab1 VALUES ('active')
  6991.             INSERT INTO #tab1 VALUES ('trusted')
  6992.             SELECT * FROM #tab1
  6993.             RETURN (0)
  6994.         END
  6995.  
  6996.     /*
  6997.     ** Parameter Check:  @property.
  6998.     ** Check to make sure that @property is a valid property in
  6999.     ** msdb.dbo.MSdistpublishers.
  7000.     */
  7001.     IF @property IS NULL OR LOWER(@property) NOT IN ('distribution_db',
  7002.          'working_directory',
  7003.          'security_mode',
  7004.          'login',
  7005.          'password',
  7006.          'active',
  7007.          'trusted')
  7008.         BEGIN
  7009.             RAISERROR (14115, 16, -1, 
  7010.             '''distribution_db'', ''working_directory'', ''security_mode'', ''login'', ''password'', ''active'', or ''trusted''')
  7011.             RETURN (1)
  7012.         END
  7013.  
  7014.     /*
  7015.     ** Check to make sure this is a distributor
  7016.     */
  7017.     IF NOT EXISTS (SELECT * FROM master..sysservers
  7018.               WHERE UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  7019.                  AND srvstatus & 8 <> 0)
  7020.     BEGIN
  7021.         RAISERROR (14114, 16, -1, @@SERVERNAME)
  7022.         RETURN(1)
  7023.     END
  7024.  
  7025.     -- Get the distribution db name.
  7026.     select @distribdb = distribution_db from msdb..MSdistpublishers where
  7027.         UPPER(name) = UPPER(@publisher) collate database_default
  7028.  
  7029.     /*
  7030.     ** Change the property.
  7031.     */
  7032.     IF LOWER(@property) = 'distribution_db'
  7033.         BEGIN
  7034.             IF @value IS NULL
  7035.                 BEGIN
  7036.                     RAISERROR (14043, 16, -1, '@value') 
  7037.                     RETURN (1)
  7038.                 END
  7039.  
  7040.             IF @value <> @distribdb and 
  7041.                 EXISTS (SELECT * FROM msdb.dbo.MSdistpublishers WHERE
  7042.                 UPPER(name) = UPPER(@publisher) collate database_default and active = 1)
  7043.             BEGIN
  7044.                 RAISERROR (21046, 16, -1)
  7045.                 RETURN (1)
  7046.             END
  7047.  
  7048.             /*
  7049.             ** Check if database is configured as a distributor database
  7050.             */
  7051.             IF NOT EXISTS (SELECT * FROM master..sysdatabases
  7052.               WHERE name = @value collate database_default
  7053.                  AND category & @distbit <> 0)
  7054.                 BEGIN
  7055.                     RAISERROR (14117, 16, -1, @new_database)
  7056.                     RETURN(1)
  7057.                 END
  7058.  
  7059.             UPDATE msdb..MSdistpublishers SET distribution_db = @value
  7060.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7061.             IF @@error <> 0 
  7062.                 BEGIN
  7063.                     RETURN (1)
  7064.                 END
  7065.         END
  7066.    
  7067.     IF LOWER(@property) = 'working_directory'
  7068.         BEGIN
  7069.             IF @value IS NULL
  7070.                 BEGIN
  7071.                     RAISERROR (14043, 16, -1, '@value') 
  7072.                     RETURN (1)
  7073.                 END
  7074.  
  7075.             
  7076.             -- Validate the working directory 
  7077.             -- Remove heading and trailing spaces
  7078.             select @value = RTRIM(LTRIM(@value))
  7079.  
  7080.             -- if the last char is '\', remove it.
  7081.  
  7082.             if substring(@value, len(@value),1) = '\'
  7083.                 select @value = substring(@value, 1,
  7084.                     len(@value)-1)
  7085.  
  7086.             -- Don't do validation if it is a UNC path due to security problem.
  7087.             -- If the server is started as a service using local system account, we
  7088.             -- don't have access to the UNC path.
  7089.             if substring(@value, 1,2) <> '\\'
  7090.             begin
  7091.                 select @command = 'dir ' + @value
  7092.                 exec @retcode = master..xp_cmdshell @command, 'no_output'
  7093.                 if @@error <> 0
  7094.                     return 1
  7095.                 if @retcode <> 0 
  7096.                 begin
  7097.                     raiserror (21037, 16, -1, @value)
  7098.                     return 1
  7099.                 end
  7100.             end
  7101.  
  7102.             UPDATE msdb..MSdistpublishers SET working_directory = @value
  7103.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7104.             IF @@error <> 0 
  7105.                 BEGIN
  7106.                     RETURN (1)
  7107.                 END
  7108.         END
  7109.  
  7110.     IF LOWER(@property) = 'security_mode'
  7111.         BEGIN
  7112.             IF @value IS NULL
  7113.                 BEGIN
  7114.                     RAISERROR (14043, 16, -1, '@value') 
  7115.                     RETURN (1)
  7116.                 END
  7117.  
  7118.             /*
  7119.             ** Set the SecurityMode registry key value
  7120.             */
  7121.             SELECT @new_security_mode = CONVERT(int, @value)
  7122.  
  7123.             /* 
  7124.             ** Check for invalid values 
  7125.             */
  7126.             IF @new_security_mode < 0 OR @new_security_mode > 1
  7127.                 BEGIN
  7128.                     RAISERROR(14109, 16, -1)
  7129.                     RETURN (1)
  7130.                 END
  7131.  
  7132.             IF (UPPER(@publisher) = UPPER(@@SERVERNAME) and ( @platform_nt != platform() & @platform_nt ) and @new_security_mode = 1)
  7133.             BEGIN
  7134.                 RAISERROR(21038, 16, -1)
  7135.                 RETURN (1)
  7136.             END
  7137.  
  7138.             UPDATE msdb..MSdistpublishers SET security_mode = @new_security_mode
  7139.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7140.             IF @@error <> 0 
  7141.                 BEGIN
  7142.                     RETURN (1)
  7143.                 END
  7144.         END
  7145.  
  7146.     IF LOWER(@property) = 'login'
  7147.         BEGIN
  7148.             IF @value IS NULL
  7149.                 BEGIN
  7150.                     RAISERROR (14043, 16, -1, '@value') 
  7151.                     RETURN (1)
  7152.                 END
  7153.  
  7154.             /*
  7155.             ** Set the Login registry key value
  7156.             */
  7157.             SELECT @new_login = CONVERT(sysname, @value)
  7158.  
  7159.             UPDATE msdb..MSdistpublishers SET login = @new_login
  7160.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7161.             IF @@error <> 0 
  7162.                 BEGIN
  7163.                     RETURN (1)
  7164.                 END
  7165.         END
  7166.  
  7167.     IF LOWER(@property) = 'password'
  7168.         BEGIN
  7169.             /*
  7170.             ** Set the Password registry key value
  7171.             */
  7172.             SELECT @new_password = CONVERT(nvarchar(524), @value)
  7173.  
  7174.             -- Encrypt the password
  7175.             EXEC @retcode = master.dbo.xp_repl_encrypt @new_password OUTPUT
  7176.             IF @@error <> 0 OR @retcode <> 0
  7177.                 RETURN (1)
  7178.  
  7179.             UPDATE msdb..MSdistpublishers SET password = @new_password
  7180.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7181.             IF @@error <> 0 
  7182.                 BEGIN
  7183.                     RETURN (1)
  7184.                 END
  7185.          END
  7186.  
  7187.     IF LOWER(@property) = 'active'
  7188.         BEGIN
  7189.             /*
  7190.             ** Check for a valid  value.
  7191.             */
  7192.  
  7193.             IF LOWER(@value) NOT IN ('true', 'false')
  7194.             BEGIN
  7195.                 RAISERROR (14137, 16, -1)
  7196.                 RETURN (1)
  7197.             END
  7198.  
  7199.             IF LOWER(@value) = 'true'
  7200.             begin
  7201.                 -- Clean up the database in case of the remote publisher is reinstalling publishing.
  7202.                 SELECT @command = @distribdb + '.dbo.sp_MSdistpublisher_cleanup'
  7203.                 exec @retcode = @command @publisher
  7204.                 if @retcode <> 0 or @@error <> 0
  7205.                     return 1
  7206.                 SELECT @new_active = 1
  7207.             end
  7208.             ELSE
  7209.             BEGIN
  7210.                 SELECT @new_active = 0
  7211.             END
  7212.  
  7213.             /*
  7214.             ** Set the Active registry key value
  7215.             */
  7216.             UPDATE msdb..MSdistpublishers SET active = @new_active
  7217.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7218.             IF @@error <> 0
  7219.                 BEGIN
  7220.                     RETURN (1)
  7221.                 END
  7222.  
  7223.         END
  7224.  
  7225.     IF LOWER(@property) = 'trusted'
  7226.         BEGIN
  7227.             /*
  7228.             ** Check for a valid  value.
  7229.             */
  7230.  
  7231.             IF LOWER(@value) NOT IN ('true', 'false')
  7232.             BEGIN
  7233.                 RAISERROR (14137, 16, -1)
  7234.                 RETURN (1)
  7235.             END
  7236.  
  7237.             declare @fExists int
  7238.  
  7239.             IF LOWER(@value) = 'true'
  7240.             begin
  7241.                 SELECT @new_trusted = 1
  7242.                 exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'distributor_admin', 'sa'
  7243.                 if( @fExists = 1 )
  7244.                 BEGIN
  7245.                     EXECUTE @retcode = dbo.sp_remoteoption @publisher, 'distributor_admin', 'sa', trusted, true
  7246.                     IF @@error <> 0 OR @retcode <> 0
  7247.                     BEGIN
  7248.                         RAISERROR (14075, 16, -1)
  7249.                         RETURN (1)
  7250.                     END
  7251.                 END
  7252.  
  7253.  
  7254.                 EXECUTE @retcode = dbo.sp_remoteoption @publisher, 'distributor_admin', 
  7255.                     'distributor_admin', trusted, true
  7256.                 IF @@error <> 0 OR @retcode <> 0
  7257.                 BEGIN
  7258.                     RAISERROR (14075, 16, -1)
  7259.                     RETURN (1)
  7260.                 END
  7261.             end
  7262.             ELSE
  7263.             BEGIN
  7264.                 SELECT @new_trusted = 0
  7265.      
  7266.                 exec @fExists = dbo.sp_MSIfExistsRemoteLogin @publisher, 'distributor_admin', 'sa'
  7267.                 if( @fExists = 1 )
  7268.                 BEGIN
  7269.                     EXECUTE @retcode = dbo.sp_remoteoption @publisher, 'distributor_admin', 'sa', trusted, false
  7270.                     IF @@error <> 0 OR @retcode <> 0
  7271.                     BEGIN
  7272.                         RAISERROR (14075, 16, -1)
  7273.                         RETURN (1)
  7274.                     END
  7275.                 END
  7276.  
  7277.  
  7278.                 EXECUTE @retcode = dbo.sp_remoteoption @publisher, 'distributor_admin',
  7279.                     'distributor_admin', trusted, 'false'
  7280.                 IF @@error <> 0 OR @retcode <> 0
  7281.                 BEGIN
  7282.                     RAISERROR (14075, 16, -1)
  7283.                     RETURN (1)
  7284.                 END
  7285.             END
  7286.  
  7287.             /*
  7288.             ** Set the trusted property
  7289.             */
  7290.             UPDATE msdb..MSdistpublishers SET trusted = @new_trusted
  7291.                 WHERE UPPER(name) = UPPER(@publisher) collate database_default
  7292.             IF @@error <> 0
  7293.                 BEGIN
  7294.                     RETURN (1)
  7295.                 END
  7296.         END
  7297.  
  7298.   
  7299.     /*
  7300.     ** Return succeed.
  7301.     */
  7302.     RAISERROR (21035, 10, -1, @property)
  7303.  
  7304. DONE:    
  7305.     RETURN (0)
  7306. go
  7307.  
  7308. raiserror('Creating procedure sp_helpdistpublisher', 0,1)
  7309. go
  7310.  
  7311. CREATE PROCEDURE sp_helpdistpublisher (
  7312.     @publisher sysname = '%'         /* publisher server name */
  7313.     , @check_user bit = 0
  7314. AS
  7315. BEGIN
  7316.     SET NOCOUNT ON
  7317.     declare @is_sysadmin int
  7318.  
  7319.     select @is_sysadmin = is_srvrolemember('sysadmin')
  7320.     IF @publisher IS null
  7321.     begin
  7322.         raiserror (14043, 16, -1, '@publisher')
  7323.         return (1)
  7324.     end
  7325.  
  7326.     /*
  7327.     ** Check to make sure this is a distributor
  7328.     */
  7329.     IF NOT EXISTS (select * from master..sysservers
  7330.               where UPPER(datasource) = UPPER(@@SERVERNAME) collate database_default
  7331.                  AND srvstatus & 8 <> 0)
  7332.     begin
  7333.         if @publisher <> '%' 
  7334.         begin
  7335.                 raiserror (14114, 16, -1, @@SERVERNAME)
  7336.                 return(1)
  7337.         end
  7338.         else
  7339.             return(0)
  7340.     end
  7341.  
  7342.     IF @publisher <> '%' AND NOT EXISTS (select * from msdb..MSdistpublishers
  7343.             where UPPER(name) = UPPER(@publisher) collate database_default)
  7344.     begin
  7345.         raiserror (14080, 11, -1)
  7346.         return (1)
  7347.     end
  7348.  
  7349.     -- If sysadmin, no need for filtering
  7350.     if @is_sysadmin = 1
  7351.         select @check_user = 0
  7352.  
  7353.     create table #distdbs (name sysname collate database_default)
  7354.  
  7355.     if @check_user = 1
  7356.     begin
  7357.         declare @distbit int, @db_name sysname, @cmd nvarchar(1000)
  7358.         select @distbit = 16
  7359.         declare hCdatabase CURSOR LOCAL FAST_FORWARD FOR
  7360.             select name from master.dbo.sysdatabases 
  7361.                 where
  7362.                 category & @distbit <> 0 and
  7363.                 has_dbaccess(name) = 1
  7364.         for read only
  7365.  
  7366.         open hCdatabase
  7367.         fetch next from hCdatabase into @db_name
  7368.         while (@@fetch_status <> -1)
  7369.         begin
  7370.             
  7371.             -- Check to see if the user has permision to monitor the distribution 
  7372.             -- database.
  7373.             declare @has_pm bit
  7374.             select @cmd = quotename(@db_name) + '.dbo.sp_executesql'
  7375.             exec @cmd
  7376.                 N'if is_member(N''db_owner'') = 1 or is_member(N''replmonitor'') = 1 set @has_pm = 1', 
  7377.                 N'@has_pm bit output',
  7378.                 @has_pm output
  7379.             if @has_pm = 1
  7380.                 insert #distdbs values (@db_name)
  7381.             fetch next from hCdatabase into @db_name
  7382.         end
  7383.         close hCdatabase
  7384.         deallocate hCdatabase
  7385.     end
  7386.  
  7387.     SELECT p.name, distribution_db, security_mode, 
  7388.         -- Not to return login unless sysadmin is called.
  7389.         'login' = case when (@is_sysadmin = 1) then login else cast(NULL as sysname) end,
  7390.         -- Not to return password unless sysadmin is called.
  7391.         'password' = case  when (@is_sysadmin = 1) then password else cast(NULL as sysname) end,
  7392.         active, working_directory, trusted, thirdparty_flag
  7393.     FROM msdb.dbo.MSdistpublishers p
  7394.     where ((@publisher = N'%') or (UPPER(p.name) collate database_default = UPPER(@publisher) collate database_default)) and
  7395.             (@check_user = 0 or exists 
  7396.                 (select * from #distdbs d where p.distribution_db = d.name collate database_default))
  7397.     IF @@ERROR <> 0
  7398.     begin
  7399.         return(1)
  7400.     end
  7401. END
  7402. GO
  7403.  
  7404. dump tran master with no_log
  7405. go
  7406.  
  7407. raiserror('Creating procedure sp_add_agent_profile', 0,1)
  7408. go
  7409.  
  7410. /*
  7411. ** The system profile of the same type of agent will be used as a template for 
  7412. ** the parameters in this new user profile.
  7413. */
  7414. CREATE PROCEDURE sp_add_agent_profile (
  7415.     @profile_id             int = NULL OUTPUT,
  7416.     @profile_name           sysname,
  7417.     @agent_type             int,            -- 1-Snapshot, 2-Logreader, 
  7418.                                             -- 3-Distribution, 4-Merge,
  7419.                                             -- 9-Qreader
  7420.     @profile_type           int = 1,        -- 0-System, 1-Custom 
  7421.     @description            nvarchar(3000) = NULL,
  7422.     @default                bit = 0         -- 0-Not Default, 1-Default
  7423. )
  7424. AS
  7425.     SET NOCOUNT ON
  7426.  
  7427.     declare     @sys_profile    int
  7428.     declare     @default_id     int
  7429.     declare     @sysdefault_id  int
  7430.     declare     @retcode        int
  7431.  
  7432.     SELECT @profile_name = RTRIM(@profile_name)
  7433.  
  7434.     IF @profile_name IS NULL
  7435.     BEGIN
  7436.         RAISERROR (14043, 16, -1, '@profile_name')
  7437.         RETURN (1)
  7438.     END
  7439.  
  7440.     exec @retcode = dbo.sp_MSreplcheck_name @profile_name
  7441.     if @@ERROR <> 0 or @retcode <> 0
  7442.         return(1)
  7443.  
  7444.     /* The profile name is unique across a particular agent type */
  7445.     IF EXISTS ( SELECT * FROM msdb..MSagent_profiles 
  7446.             WHERE profile_name = @profile_name collate database_default
  7447.             AND agent_type = @agent_type )
  7448.     BEGIN
  7449.         RAISERROR(20057, 16, -1, @profile_name)
  7450.         RETURN (1)
  7451.     END
  7452.  
  7453.     IF @agent_type NOT IN (1, 2, 3, 4, 9)
  7454.     BEGIN
  7455.         RAISERROR(20058, 16, -1)
  7456.         return (1)
  7457.     END
  7458.  
  7459.     IF @profile_type NOT IN (0, 1)
  7460.     BEGIN
  7461.         RAISERROR(20059, 16, -1)
  7462.         return (1)
  7463.     END
  7464.  
  7465.     BEGIN TRAN
  7466.  
  7467.     /*
  7468.     ** First find out the default profile of the same agent type
  7469.     */
  7470.     select @default_id = profile_id from msdb..MSagent_profiles WHERE agent_type = @agent_type AND def_profile = 1
  7471.     
  7472.     INSERT INTO msdb..MSagent_profiles
  7473.             VALUES (@profile_name, @agent_type, @profile_type, @description, 0)
  7474.     IF @@ERROR <> 0
  7475.         GOTO UNDO
  7476.  
  7477.     SELECT @profile_id = profile_id 
  7478.         FROM msdb..MSagent_profiles
  7479.         WHERE profile_name = @profile_name collate database_default AND agent_type = @agent_type
  7480.  
  7481.     /*
  7482.     ** If there is system profiles of the same agent type, use the primary system one as template of parameter set
  7483.     */
  7484.     IF EXISTS (select * from msdb..MSagent_profiles where agent_type = @agent_type AND type = 0)
  7485.         select @sysdefault_id = min(profile_id) from msdb..MSagent_profiles where agent_type = @agent_type AND type = 0
  7486.  
  7487.     if @sysdefault_id IS NULL
  7488.         select @sysdefault_id = @default_id
  7489.  
  7490.     if @profile_type=1
  7491.     BEGIN
  7492.             INSERT INTO msdb..MSagent_parameters 
  7493.             select @profile_id, parameter_name, value from msdb..MSagent_parameters 
  7494.                 where profile_id = @sysdefault_id      
  7495.         if @@ERROR<>0 
  7496.             GOTO UNDO
  7497.     END
  7498.  
  7499.     /* Only one profile for an agent type must be default */
  7500.     IF @default = 1
  7501.         BEGIN
  7502.             UPDATE msdb..MSagent_profiles
  7503.                 SET def_profile = 0 WHERE profile_id = @default_id
  7504.             IF @@ERROR <> 0
  7505.                 GOTO UNDO
  7506.             UPDATE msdb..MSagent_profiles
  7507.                 SET def_profile = 1 WHERE profile_id = @profile_id
  7508.             IF @@ERROR <> 0
  7509.                 GOTO UNDO
  7510.         END
  7511.  
  7512.     COMMIT TRAN
  7513.     RETURN 0 
  7514.  
  7515. UNDO:
  7516.  
  7517.     IF @@TRANCOUNT = 1
  7518.         ROLLBACK TRAN
  7519.     ELSE
  7520.         COMMIT TRAN
  7521.  
  7522.     RETURN 1 
  7523. GO
  7524.  
  7525. raiserror('Creating procedure sp_drop_agent_parameter', 0,1)
  7526. go
  7527.  
  7528. -- Drop a/all parameter(s) of a/all profile(s) from the MSagent_parameters table
  7529. create procedure sp_drop_agent_parameter (
  7530.     @profile_id int,
  7531.     @parameter_name     sysname = '%'
  7532. )
  7533. as
  7534.     set nocount on
  7535.  
  7536.     declare @default            bit
  7537.     declare @agent_type         int
  7538.     declare @retstatus          int
  7539.     select @retstatus = 0
  7540.  
  7541.     if @parameter_name is null
  7542.     BEGIN
  7543.         RAISERROR (14043, 16, -1, '@parameter_name')
  7544.         RETURN (1)
  7545.     END
  7546.  
  7547.     select @agent_type = agent_type, @default=def_profile
  7548.     from msdb..MSagent_profiles
  7549.     where profile_id = @profile_id
  7550.  
  7551.     if @default is null
  7552.     BEGIN
  7553.         RAISERROR (20066, 16, -1) -- profile not defined
  7554.         RETURN (1)
  7555.     END
  7556.     
  7557.     select @parameter_name = lower(@parameter_name)
  7558.  
  7559.     if left(@parameter_name,1) in (N'-', N'/')
  7560.         select @parameter_name = right(@parameter_name,len(@parameter_name)-1)
  7561.  
  7562.     /* Delete the parameters of the profile */
  7563.     delete  msdb..MSagent_parameters 
  7564.     where   right(lower(parameter_name),len(parameter_name)-1) like 
  7565.             @parameter_name collate database_default
  7566.     and     profile_id = @profile_id
  7567.  
  7568.     if @@error <> 0
  7569.     begin
  7570.         select @retstatus = 1
  7571.         goto UNDO
  7572.     end
  7573.  
  7574. UNDO:
  7575.     
  7576.     return @retstatus
  7577. GO
  7578.  
  7579. raiserror('Creating procedure sp_drop_agent_profile', 0,1)
  7580. go
  7581. -- Drop a profile from the MSagent_profiles table, as well as the corresponding
  7582. -- parameters from the MSagent_parameters table
  7583.  
  7584. CREATE PROCEDURE sp_drop_agent_profile (
  7585.     @profile_id int
  7586. )
  7587. AS
  7588.     SET NOCOUNT ON
  7589.  
  7590.     declare @snapshot_type      int
  7591.     declare @logreader_type     int
  7592.     declare @distribution_type  int
  7593.     declare @merge_type         int
  7594.     declare @qreader_type        int
  7595.     
  7596.     declare @tablename          nvarchar(255)
  7597.     declare @proc               nvarchar(255)
  7598.     declare @distribution_db    sysname
  7599.     declare @profile_type       int
  7600.  
  7601.     declare @default            bit
  7602.     declare @usage_count        int
  7603.     declare @agent_type         int
  7604.     declare @retstatus          int
  7605.     DECLARE @retcode            int
  7606.  
  7607.     declare @default_sys_id     int
  7608.  
  7609.     SELECT @agent_type = agent_type, @profile_type = type, @default=def_profile
  7610.     FROM msdb..MSagent_profiles
  7611.     WHERE profile_id = @profile_id
  7612.  
  7613.     IF @default IS NULL
  7614.     BEGIN
  7615.         RAISERROR (20066, 16, -1) -- Profile not defined
  7616.         RETURN (1)
  7617.     END
  7618.  
  7619.     /*
  7620.     ** Before dropping a default profile, one system profile of the same agent type
  7621.     ** has to become the new default profile.
  7622.     */
  7623.     IF @default = 1
  7624.     BEGIN
  7625.         select @default_sys_id=min(profile_id) from msdb..MSagent_profiles
  7626.             where agent_type = @agent_type AND type = 0
  7627.             
  7628.         UPDATE msdb..MSagent_profiles SET def_profile = 1 WHERE profile_id = @default_sys_id
  7629.     END
  7630.  
  7631.     select @snapshot_type = 1
  7632.     select @logreader_type = 2
  7633.     select @distribution_type = 3
  7634.     select @merge_type = 4
  7635.     select @qreader_type = 9
  7636.  
  7637.         /* By default, assume that this profile is not being used */
  7638.     select @usage_count = -1
  7639.  
  7640.     select @tablename = 
  7641.         case @agent_type
  7642.             when @snapshot_type then 'MSsnapshot_agents'
  7643.             when @logreader_type then 'MSlogreader_agents'
  7644.             when @distribution_type then 'MSdistribution_agents'
  7645.             when @merge_type then 'MSmerge_agents'
  7646.             when @qreader_type then 'MSqreader_agents'
  7647.         end
  7648.  
  7649.     declare hCdistdbs CURSOR LOCAL FAST_FORWARD FOR
  7650.         select distinct distribution_db 
  7651.         from msdb..MSdistpublishers
  7652.         for read only
  7653.  
  7654.     open hCdistdbs
  7655.     fetch hCdistdbs into @distribution_db
  7656.  
  7657.     while @@fetch_status <> -1 and @usage_count = -1
  7658.     begin
  7659.         select @proc = @distribution_db + '.dbo.sp_MSprofile_in_use'
  7660.         execute @usage_count = @proc @tablename = @tablename, @profile_id = @profile_id
  7661.     
  7662.         if @@error <> 0
  7663.         begin
  7664.             select @retstatus = 1
  7665.             goto UNDO
  7666.         end
  7667.  
  7668.         fetch hCdistdbs into @distribution_db
  7669.     end
  7670.  
  7671.     /* A profile in use cannot be dropped */
  7672.     if @usage_count = 0 
  7673.     begin
  7674.         RAISERROR(20065, 16, -1) -- Cannot drop profile, because it is in use.
  7675.         select @retstatus = 1
  7676.         goto UNDO 
  7677.     end
  7678.  
  7679.     BEGIN TRAN
  7680.  
  7681.     /*****
  7682.      * NOTE : If sp_drop_agent_parameter fails, the profile must not be 
  7683.      * deleted either 
  7684.      */
  7685.     EXECUTE @retcode = dbo.sp_drop_agent_parameter @profile_id = @profile_id,
  7686.                             @parameter_name = '%'
  7687.  
  7688.     IF @@ERROR <> 0 OR @retcode <> 0
  7689.         GOTO UNDO
  7690.             
  7691.     /* Delete all the entries in one go */
  7692.     DELETE msdb..MSagent_profiles 
  7693.     WHERE profile_id = @profile_id
  7694.  
  7695.     IF @@ERROR <> 0
  7696.         GOTO UNDO
  7697.  
  7698.     COMMIT TRAN
  7699.  
  7700.     close hCdistdbs
  7701.     deallocate hCdistdbs
  7702.  
  7703.     RETURN 0
  7704.  
  7705. UNDO:
  7706.     IF @@TRANCOUNT = 1
  7707.         ROLLBACK TRAN
  7708.     ELSE IF @@TRANCOUNT > 1 -- Sometimes we can get here when @@trancount = 0, so need to check explicitly.
  7709.         COMMIT TRAN
  7710.  
  7711.     close hCdistdbs
  7712.     deallocate hCdistdbs
  7713.  
  7714.  
  7715.     RETURN (1)
  7716. GO
  7717.  
  7718. raiserror('Creating procedure sp_help_agent_profile', 0,1)
  7719. go
  7720.  
  7721.  
  7722. -- View the row(s) of the MSagent_profiles table
  7723.  
  7724. create procedure sp_help_agent_profile(
  7725.     @agent_type     int = 0,
  7726.     @profile_id int = -1
  7727. )
  7728. as
  7729.     set nocount on
  7730.  
  7731.     declare @proc nvarchar(255)
  7732.  
  7733.     declare @snapshot_type      int
  7734.     declare @logreader_type     int
  7735.     declare @distribution_type  int
  7736.     declare @merge_type     int
  7737.     declare @qreader_type        int
  7738.  
  7739.     select @snapshot_type = 1
  7740.     select @logreader_type = 2
  7741.     select @distribution_type = 3
  7742.     select @merge_type = 4
  7743.     select @qreader_type = 9
  7744.  
  7745.     if @agent_type is null 
  7746.     BEGIN
  7747.         RAISERROR (14043, 16, -1, '@agent_type')
  7748.         RETURN (1)
  7749.     END
  7750.  
  7751.     if @profile_id is null
  7752.     BEGIN
  7753.         RAISERROR (14043, 16, -1, '@profile_id')
  7754.         RETURN (1)
  7755.     END
  7756.  
  7757.     if @agent_type not in (0, @snapshot_type, @logreader_type, @distribution_type, @merge_type, @qreader_type)
  7758.     BEGIN
  7759.         RAISERROR(20058, 16, -1)
  7760.         return (1)
  7761.     END
  7762.  
  7763.     select profile_id, profile_name, agent_type, type, description, def_profile
  7764.         from msdb..MSagent_profiles where
  7765.              (profile_id = @profile_id or @profile_id = -1) and
  7766.              (agent_type = @agent_type or @agent_type = 0)
  7767.         order by profile_id, profile_name
  7768.  
  7769. GO
  7770.  
  7771. raiserror('Creating procedure sp_help_agent_default', 0,1)
  7772. go
  7773.  
  7774. create procedure sp_help_agent_default (
  7775.     @profile_id     int OUTPUT, 
  7776.     @agent_type         int
  7777. )
  7778. as
  7779.     set nocount on
  7780.  
  7781.     if @agent_type not in (1, 2, 3, 4)
  7782.     BEGIN
  7783.         RAISERROR(20058, 16, -1)
  7784.         return (1)
  7785.     END
  7786.  
  7787.  
  7788.     select @profile_id = profile_id 
  7789.     from msdb..MSagent_profiles 
  7790.     where agent_type = @agent_type
  7791.     and def_profile = 1 
  7792. go
  7793.  
  7794. raiserror('Creating procedure sp_MSupdate_agenttype_default', 0,1)
  7795. go
  7796.  
  7797. -- Set a profile as a default for an agent_type
  7798. create procedure sp_MSupdate_agenttype_default(
  7799.     @profile_id int
  7800. )
  7801. as
  7802.     set nocount on
  7803.  
  7804.     declare @agent_type int
  7805.  
  7806.     /* This profile must have been defined for this agent type */
  7807.     if not exists ( select * from msdb..MSagent_profiles
  7808.             where profile_id = @profile_id )
  7809.     BEGIN
  7810.         RAISERROR (20066, 16, -1)   -- profile not defined
  7811.         RETURN (1)
  7812.     END
  7813.  
  7814.  
  7815.     select @agent_type = agent_type
  7816.     from msdb..MSagent_profiles 
  7817.     where profile_id = @profile_id
  7818.  
  7819.     BEGIN TRAN
  7820.  
  7821.     update msdb..MSagent_profiles
  7822.     set def_profile = 0
  7823.     where agent_type = @agent_type
  7824.     and def_profile = 1
  7825.  
  7826.     if @@error <> 0
  7827.         goto UNDO
  7828.  
  7829.     update msdb..MSagent_profiles
  7830.     set def_profile = 1
  7831.     where profile_id = @profile_id
  7832.  
  7833.     if @@error <> 0
  7834.         goto UNDO 
  7835.  
  7836.     COMMIT TRAN
  7837.  
  7838.     return 0
  7839.  
  7840. UNDO:
  7841.     if @@trancount = 1
  7842.         rollback tran
  7843.     else
  7844.         commit tran
  7845.  
  7846.     return 1 
  7847. GO
  7848.  
  7849.  
  7850. /*
  7851. ** Create stored procedures to generate default profile 
  7852. ** parameters for replication agents.
  7853. */
  7854.  
  7855. raiserror('Creating procedure sp_generate_agent_parameter', 0,1)
  7856. GO
  7857.  
  7858. create procedure sp_generate_agent_parameter(
  7859.     @profile_id     int,        -- Fixed profile id used
  7860.     @real_profile_id int = NULL -- Used by version upgrade 
  7861. )
  7862. as
  7863.     declare @retcode    int
  7864.  
  7865.     -- If real profile id is not passed in. Use the fix profile id.
  7866.     if @real_profile_id is NULL
  7867.         select @real_profile_id = @profile_id
  7868.  
  7869.         /* 
  7870.     ** Snapshot agent 
  7871.     */
  7872.     if (@profile_id = 1)
  7873.         begin
  7874.         exec @retcode = dbo.sp_add_agent_parameter 
  7875.                 @profile_id = @real_profile_id,
  7876.                 @parameter_name = '-BcpBatchSize',
  7877.                 @parameter_value = '100000'
  7878.         if (@retcode = 1 or @@ERROR <> 0)
  7879.             goto FAILURE
  7880.  
  7881.         exec @retcode = dbo.sp_add_agent_parameter 
  7882.                 @profile_id = @real_profile_id,
  7883.                 @parameter_name = '-HistoryVerboseLevel',
  7884.                 @parameter_value = '2'
  7885.         if (@retcode = 1 or @@ERROR <> 0)
  7886.             goto FAILURE
  7887.  
  7888.         exec @retcode = dbo.sp_add_agent_parameter 
  7889.                 @profile_id = @real_profile_id,
  7890.                 @parameter_name = '-LoginTimeout',
  7891.                 @parameter_value = '15'
  7892.         if (@retcode = 1 or @@ERROR <> 0)
  7893.             goto FAILURE
  7894.  
  7895.         exec @retcode = dbo.sp_add_agent_parameter 
  7896.                 @profile_id = @real_profile_id,
  7897.                 @parameter_name = '-MaxBcpThreads',
  7898.                 @parameter_value = '1'
  7899.         if (@retcode = 1 or @@ERROR <> 0)
  7900.             goto FAILURE
  7901.  
  7902.         exec @retcode = dbo.sp_add_agent_parameter 
  7903.                 @profile_id = @real_profile_id,
  7904.                 @parameter_name = '-QueryTimeout',
  7905.                 @parameter_value = '300'        -- 5 minutes 
  7906.         if (@retcode = 1 or @@ERROR <> 0)
  7907.             goto FAILURE
  7908.         end
  7909.  
  7910.         /* 
  7911.     ** Logreader agent 
  7912.     */
  7913.     else if (@profile_id = 2)
  7914.         begin
  7915.   
  7916.         exec @retcode = dbo.sp_add_agent_parameter 
  7917.                 @profile_id = @real_profile_id,
  7918.                 @parameter_name = '-HistoryVerboseLevel',
  7919.                 @parameter_value = '1'
  7920.         if (@retcode = 1 or @@ERROR <> 0)
  7921.             goto FAILURE
  7922.  
  7923.         exec @retcode = dbo.sp_add_agent_parameter 
  7924.                 @profile_id = @real_profile_id,
  7925.                 @parameter_name = '-LoginTimeout',
  7926.                 @parameter_value = '15'
  7927.         if (@retcode = 1 or @@ERROR <> 0)
  7928.             goto FAILURE
  7929.  
  7930.         exec @retcode = dbo.sp_add_agent_parameter 
  7931.                 @profile_id = @real_profile_id,
  7932.                 @parameter_name = '-PollingInterval',
  7933.                 @parameter_value = '10'
  7934.         if (@retcode = 1 or @@ERROR <> 0)
  7935.             goto FAILURE
  7936.  
  7937.         exec @retcode = dbo.sp_add_agent_parameter 
  7938.                 @profile_id = @real_profile_id,
  7939.                 @parameter_name = '-QueryTimeout',
  7940.                 @parameter_value = '300'        -- 5 minutes
  7941.         if (@retcode = 1 or @@ERROR <> 0)
  7942.             goto FAILURE
  7943.  
  7944.         exec @retcode = dbo.sp_add_agent_parameter 
  7945.                 @profile_id = @real_profile_id,
  7946.                 @parameter_name = '-ReadBatchSize',
  7947.                 @parameter_value = '500'
  7948.         if (@retcode = 1 or @@ERROR <> 0)
  7949.             goto FAILURE
  7950.  
  7951.         end
  7952.  
  7953.         /* 
  7954.     ** Logreader agent - Verbose History Profile
  7955.     */
  7956.     else if (@profile_id = 3)
  7957.         begin
  7958.  
  7959.         exec @retcode = dbo.sp_add_agent_parameter 
  7960.                 @profile_id = @real_profile_id,
  7961.                 @parameter_name = '-HistoryVerboseLevel',
  7962.                 @parameter_value = '2'
  7963.         if (@retcode = 1 or @@ERROR <> 0)
  7964.             goto FAILURE
  7965.  
  7966.         exec @retcode = dbo.sp_add_agent_parameter 
  7967.                 @profile_id = @real_profile_id,
  7968.                 @parameter_name = '-LoginTimeout',
  7969.                 @parameter_value = '15'
  7970.         if (@retcode = 1 or @@ERROR <> 0)
  7971.             goto FAILURE
  7972.  
  7973.         exec @retcode = dbo.sp_add_agent_parameter 
  7974.                 @profile_id = @real_profile_id,
  7975.                 @parameter_name = '-PollingInterval',
  7976.                 @parameter_value = '10'
  7977.         if (@retcode = 1 or @@ERROR <> 0)
  7978.             goto FAILURE
  7979.  
  7980.         exec @retcode = dbo.sp_add_agent_parameter 
  7981.                 @profile_id = @real_profile_id,
  7982.                 @parameter_name = '-QueryTimeout',
  7983.                 @parameter_value = '300'        -- 5 minutes
  7984.         if (@retcode = 1 or @@ERROR <> 0)
  7985.             goto FAILURE
  7986.  
  7987.         exec @retcode = dbo.sp_add_agent_parameter 
  7988.                 @profile_id = @real_profile_id,
  7989.                 @parameter_name = '-ReadBatchSize',
  7990.                 @parameter_value = '500'
  7991.         if (@retcode = 1 or @@ERROR <> 0)
  7992.             goto FAILURE
  7993.  
  7994.         end
  7995.  
  7996.         /* 
  7997.     ** Distribution agent 
  7998.     */
  7999.     else if (@profile_id = 4)
  8000.       begin
  8001.  
  8002.         exec @retcode = dbo.sp_add_agent_parameter 
  8003.                 @profile_id = @real_profile_id,
  8004.                 @parameter_name = '-BcpBatchSize',
  8005.                 @parameter_value = '100000'
  8006.         if (@retcode = 1 or @@ERROR <> 0)
  8007.             goto FAILURE
  8008.  
  8009.         exec @retcode = dbo.sp_add_agent_parameter 
  8010.                 @profile_id = @real_profile_id,
  8011.                 @parameter_name = '-CommitBatchSize',
  8012.                 @parameter_value = '100'
  8013.         if (@retcode = 1 or @@ERROR <> 0)
  8014.             goto FAILURE
  8015.  
  8016.         exec @retcode = dbo.sp_add_agent_parameter 
  8017.                 @profile_id = @real_profile_id,
  8018.                 @parameter_name = '-CommitBatchThreshold',
  8019.                 @parameter_value = '1000'
  8020.         if (@retcode = 1 or @@ERROR <> 0)
  8021.             goto FAILURE
  8022.  
  8023.         exec @retcode = dbo.sp_add_agent_parameter 
  8024.                 @profile_id = @real_profile_id,
  8025.                 @parameter_name = '-HistoryVerboseLevel',
  8026.                 @parameter_value = '1'
  8027.         if (@retcode = 1 or @@ERROR <> 0)
  8028.             goto FAILURE
  8029.  
  8030.         exec @retcode = dbo.sp_add_agent_parameter 
  8031.                 @profile_id = @real_profile_id,
  8032.                 @parameter_name = '-LoginTimeout',
  8033.                 @parameter_value = '15'
  8034.         if (@retcode = 1 or @@ERROR <> 0)
  8035.             goto FAILURE
  8036.  
  8037.         exec @retcode = dbo.sp_add_agent_parameter 
  8038.                 @profile_id = @real_profile_id,
  8039.                 @parameter_name = '-MaxBcpThreads',
  8040.                 @parameter_value = '1'
  8041.         if (@retcode = 1 or @@ERROR <> 0)
  8042.             goto FAILURE
  8043.  
  8044.         exec @retcode = dbo.sp_add_agent_parameter 
  8045.                 @profile_id = @real_profile_id,
  8046.                 @parameter_name = '-MaxDeliveredTransactions',
  8047.                 @parameter_value = '0'
  8048.         if (@retcode = 1 or @@ERROR <> 0)
  8049.             goto FAILURE
  8050.  
  8051.         exec @retcode = dbo.sp_add_agent_parameter 
  8052.                 @profile_id = @real_profile_id,
  8053.                 @parameter_name = '-PollingInterval',
  8054.                 @parameter_value = '10'
  8055.         if (@retcode = 1 or @@ERROR <> 0)
  8056.             goto FAILURE
  8057.  
  8058.         exec @retcode = dbo.sp_add_agent_parameter 
  8059.                 @profile_id = @real_profile_id,
  8060.                 @parameter_name = '-QueryTimeout',
  8061.                 @parameter_value = '300'        -- 5 minutes 
  8062.         if (@retcode = 1 or @@ERROR <> 0)
  8063.             goto FAILURE
  8064.  
  8065.         exec @retcode = dbo.sp_add_agent_parameter 
  8066.                 @profile_id = @real_profile_id,
  8067.                 @parameter_name = '-TransactionsPerHistory',
  8068.                 @parameter_value = '100'
  8069.         if (@retcode = 1 or @@ERROR <> 0)
  8070.             goto FAILURE
  8071.  
  8072.         exec @retcode = dbo.sp_add_agent_parameter 
  8073.                 @profile_id = @real_profile_id,
  8074.                 @parameter_name = '-SkipErrors',
  8075.                 @parameter_value = ''
  8076.         if (@retcode = 1 or @@ERROR <> 0)
  8077.             goto FAILURE
  8078.  
  8079.         exec @retcode = dbo.sp_add_agent_parameter
  8080.                 @profile_id = @real_profile_id,
  8081.                 @parameter_name = '-KeepAliveMessageInterval',
  8082.                 @parameter_value = '300'
  8083.         if (@retcode = 1 or @@ERROR <> 0)
  8084.             goto FAILURE
  8085.  
  8086.         end
  8087.  
  8088.     /*
  8089.     ** Distribution Agent Verbose History Profile
  8090.     */
  8091.     else if (@profile_id = 5)
  8092.       begin
  8093.  
  8094.         exec @retcode = dbo.sp_add_agent_parameter 
  8095.                 @profile_id = @real_profile_id,
  8096.                 @parameter_name = '-BcpBatchSize',
  8097.                 @parameter_value = '100000'
  8098.         if (@retcode = 1 or @@ERROR <> 0)
  8099.             goto FAILURE
  8100.  
  8101.         exec @retcode = dbo.sp_add_agent_parameter 
  8102.                 @profile_id = @real_profile_id,
  8103.                 @parameter_name = '-CommitBatchSize',
  8104.                 @parameter_value = '100'
  8105.         if (@retcode = 1 or @@ERROR <> 0)
  8106.             goto FAILURE
  8107.  
  8108.         exec @retcode = dbo.sp_add_agent_parameter 
  8109.                 @profile_id = @real_profile_id,
  8110.                 @parameter_name = '-CommitBatchThreshold',
  8111.                 @parameter_value = '1000'
  8112.         if (@retcode = 1 or @@ERROR <> 0)
  8113.             goto FAILURE
  8114.  
  8115.         exec @retcode = dbo.sp_add_agent_parameter 
  8116.                 @profile_id = @real_profile_id,
  8117.                 @parameter_name = '-HistoryVerboseLevel',
  8118.                 @parameter_value = '2'
  8119.         if (@retcode = 1 or @@ERROR <> 0)
  8120.             goto FAILURE
  8121.  
  8122.         exec @retcode = dbo.sp_add_agent_parameter 
  8123.                 @profile_id = @real_profile_id,
  8124.                 @parameter_name = '-LoginTimeout',
  8125.                 @parameter_value = '15'
  8126.         if (@retcode = 1 or @@ERROR <> 0)
  8127.             goto FAILURE
  8128.  
  8129.         exec @retcode = dbo.sp_add_agent_parameter 
  8130.                 @profile_id = @real_profile_id,
  8131.                 @parameter_name = '-MaxBcpThreads',
  8132.                 @parameter_value = '1'
  8133.         if (@retcode = 1 or @@ERROR <> 0)
  8134.             goto FAILURE
  8135.  
  8136.         exec @retcode = dbo.sp_add_agent_parameter 
  8137.                 @profile_id = @real_profile_id,
  8138.                 @parameter_name = '-MaxDeliveredTransactions',
  8139.                 @parameter_value = '0'
  8140.         if (@retcode = 1 or @@ERROR <> 0)
  8141.             goto FAILURE
  8142.  
  8143.         exec @retcode = dbo.sp_add_agent_parameter 
  8144.                 @profile_id = @real_profile_id,
  8145.                 @parameter_name = '-PollingInterval',
  8146.                 @parameter_value = '10'
  8147.         if (@retcode = 1 or @@ERROR <> 0)
  8148.             goto FAILURE
  8149.  
  8150.         exec @retcode = dbo.sp_add_agent_parameter 
  8151.                 @profile_id = @real_profile_id,
  8152.                 @parameter_name = '-QueryTimeout',
  8153.                 @parameter_value = '300'        -- 5 minutes 
  8154.         if (@retcode = 1 or @@ERROR <> 0)
  8155.             goto FAILURE
  8156.  
  8157.         exec @retcode = dbo.sp_add_agent_parameter 
  8158.                 @profile_id = @real_profile_id,
  8159.                 @parameter_name = '-TransactionsPerHistory',
  8160.                 @parameter_value = '100'
  8161.         if (@retcode = 1 or @@ERROR <> 0)
  8162.             goto FAILURE
  8163.  
  8164.         exec @retcode = dbo.sp_add_agent_parameter 
  8165.                 @profile_id = @real_profile_id,
  8166.                 @parameter_name = '-SkipErrors',
  8167.                 @parameter_value = ''
  8168.         if (@retcode = 1 or @@ERROR <> 0)
  8169.             goto FAILURE
  8170.  
  8171.         exec @retcode = dbo.sp_add_agent_parameter
  8172.                 @profile_id = @real_profile_id,
  8173.                 @parameter_name = '-KeepAliveMessageInterval',
  8174.                 @parameter_value = '300'
  8175.         if (@retcode = 1 or @@ERROR <> 0)
  8176.             goto FAILURE
  8177.  
  8178.         end
  8179.     /* 
  8180.     ** Merge agent : Default profile for well connected scenarios 
  8181.     */
  8182.     else if (@profile_id = 6)
  8183.         begin
  8184.         exec @retcode = dbo.sp_add_agent_parameter 
  8185.                 @profile_id = @real_profile_id,
  8186.                 @parameter_name = '-PollingInterval',
  8187.                 @parameter_value = '60'
  8188.         if (@retcode = 1 or @@ERROR <> 0)
  8189.             goto FAILURE
  8190.  
  8191.         exec @retcode = dbo.sp_add_agent_parameter 
  8192.                 @profile_id = @real_profile_id,
  8193.                 @parameter_name = '-StartQueueTimeout',
  8194.                 @parameter_value = '0'
  8195.         if (@retcode = 1 or @@ERROR <> 0)
  8196.             goto FAILURE
  8197.  
  8198.         exec @retcode = dbo.sp_add_agent_parameter 
  8199.                 @profile_id = @real_profile_id,
  8200.                 @parameter_name = '-MaxDownloadChanges',
  8201.                 @parameter_value = '0'
  8202.         if (@retcode = 1 or @@ERROR <> 0)
  8203.             goto FAILURE
  8204.  
  8205.         exec @retcode = dbo.sp_add_agent_parameter 
  8206.                 @profile_id = @real_profile_id,
  8207.                 @parameter_name = '-MaxUploadChanges',
  8208.                 @parameter_value = '0'
  8209.         if (@retcode = 1 or @@ERROR <> 0)
  8210.             goto FAILURE
  8211.  
  8212.         exec @retcode = dbo.sp_add_agent_parameter 
  8213.                 @profile_id = @real_profile_id,
  8214.                 @parameter_name = '-ValidateInterval',
  8215.                 @parameter_value = '60'
  8216.         if (@retcode = 1 or @@ERROR <> 0)
  8217.             goto FAILURE
  8218.  
  8219.         exec @retcode = dbo.sp_add_agent_parameter 
  8220.                 @profile_id = @real_profile_id,
  8221.                 @parameter_name = '-LoginTimeout',
  8222.                 @parameter_value = '15'
  8223.         if (@retcode = 1 or @@ERROR <> 0)
  8224.             goto FAILURE
  8225.  
  8226.         exec @retcode = dbo.sp_add_agent_parameter 
  8227.                 @profile_id = @real_profile_id,
  8228.                 @parameter_name = '-QueryTimeout',
  8229.                 @parameter_value = '300'        
  8230.         if (@retcode = 1 or @@ERROR <> 0)
  8231.             goto FAILURE
  8232.  
  8233.         exec @retcode = dbo.sp_add_agent_parameter 
  8234.                 @profile_id = @real_profile_id,
  8235.                 @parameter_name = '-UploadGenerationsPerBatch',
  8236.                 @parameter_value = '100'
  8237.         if (@retcode = 1 or @@ERROR <> 0)
  8238.             goto FAILURE
  8239.  
  8240.         exec @retcode = dbo.sp_add_agent_parameter 
  8241.                 @profile_id = @real_profile_id,
  8242.                 @parameter_name = '-DownloadGenerationsPerBatch',
  8243.                 @parameter_value = '100'
  8244.         if (@retcode = 1 or @@ERROR <> 0)
  8245.             goto FAILURE
  8246.  
  8247.         exec @retcode = dbo.sp_add_agent_parameter 
  8248.                 @profile_id = @real_profile_id,
  8249.                 @parameter_name = '-UploadReadChangesPerBatch',
  8250.                 @parameter_value = '100'
  8251.         if (@retcode = 1 or @@ERROR <> 0)
  8252.             goto FAILURE
  8253.  
  8254.         exec @retcode = dbo.sp_add_agent_parameter 
  8255.                 @profile_id = @real_profile_id,
  8256.                 @parameter_name = '-DownloadReadChangesPerBatch',
  8257.                 @parameter_value = '100'
  8258.         if (@retcode = 1 or @@ERROR <> 0)
  8259.             goto FAILURE
  8260.  
  8261.         exec @retcode = dbo.sp_add_agent_parameter 
  8262.                 @profile_id = @real_profile_id,
  8263.                 @parameter_name = '-UploadWriteChangesPerBatch',
  8264.                 @parameter_value = '100'
  8265.         if (@retcode = 1 or @@ERROR <> 0)
  8266.             goto FAILURE
  8267.  
  8268.         exec @retcode = dbo.sp_add_agent_parameter 
  8269.                 @profile_id = @real_profile_id,
  8270.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  8271.                 @parameter_value = '100'
  8272.         if (@retcode = 1 or @@ERROR <> 0)
  8273.             goto FAILURE
  8274.  
  8275.         exec @retcode = dbo.sp_add_agent_parameter 
  8276.                 @profile_id = @real_profile_id,
  8277.                 @parameter_name = '-Validate',
  8278.                 @parameter_value = '0'
  8279.         if (@retcode = 1 or @@ERROR <> 0)
  8280.             goto FAILURE
  8281.  
  8282.         exec @retcode = dbo.sp_add_agent_parameter 
  8283.                 @profile_id = @real_profile_id,
  8284.                 @parameter_name = '-FastRowCount',
  8285.                 @parameter_value = '1'
  8286.         if (@retcode = 1 or @@ERROR <> 0)
  8287.             goto FAILURE
  8288.         
  8289.         exec @retcode = dbo.sp_add_agent_parameter 
  8290.                 @profile_id = @real_profile_id,
  8291.                 @parameter_name = '-HistoryVerboseLevel',
  8292.                 @parameter_value = '1'
  8293.         if (@retcode = 1 or @@ERROR <> 0)
  8294.             goto FAILURE
  8295.  
  8296.         exec @retcode = dbo.sp_add_agent_parameter 
  8297.                 @profile_id = @real_profile_id,
  8298.                 @parameter_name = '-ChangesPerHistory',
  8299.                 @parameter_value = '100'
  8300.         if (@retcode = 1 or @@ERROR <> 0)
  8301.             goto FAILURE
  8302.  
  8303.         exec @retcode = dbo.sp_add_agent_parameter 
  8304.                 @profile_id = @real_profile_id,
  8305.                 @parameter_name = '-BcpBatchSize',
  8306.                 @parameter_value = '100000'
  8307.         if (@retcode = 1 or @@ERROR <> 0)
  8308.             goto FAILURE
  8309.  
  8310.         exec @retcode = dbo.sp_add_agent_parameter 
  8311.                 @profile_id = @real_profile_id,
  8312.                 @parameter_name = '-NumDeadlockRetries',
  8313.                 @parameter_value = '5'
  8314.         if (@retcode = 1 or @@ERROR <> 0)
  8315.             goto FAILURE
  8316.  
  8317.         exec @retcode = dbo.sp_add_agent_parameter 
  8318.                 @profile_id = @real_profile_id,
  8319.                 @parameter_name = '-SrcThreads',
  8320.                 @parameter_value = '3'
  8321.         if (@retcode = 1 or @@ERROR <> 0)
  8322.             goto FAILURE
  8323.  
  8324.         exec @retcode = dbo.sp_add_agent_parameter 
  8325.                 @profile_id = @real_profile_id,
  8326.                 @parameter_name = '-DestThreads',
  8327.                 @parameter_value = '4'
  8328.         if (@retcode = 1 or @@ERROR <> 0)
  8329.             goto FAILURE
  8330.  
  8331.         exec @retcode = dbo.sp_add_agent_parameter
  8332.                 @profile_id = @real_profile_id,
  8333.                 @parameter_name = '-KeepAliveMessageInterval',
  8334.                 @parameter_value = '300'
  8335.         if (@retcode = 1 or @@ERROR <> 0)
  8336.             goto FAILURE
  8337.  
  8338.         end
  8339.  
  8340.     /* 
  8341.     ** Merge agent : Non default profile for disconnected scenarios ( unreliable link ) 
  8342.     */
  8343.     else if (@profile_id = 7)
  8344.         begin
  8345.  
  8346.         exec @retcode = dbo.sp_add_agent_parameter 
  8347.                 @profile_id = @real_profile_id,
  8348.                 @parameter_name = '-PollingInterval',
  8349.                 @parameter_value = '60'
  8350.         if (@retcode = 1 or @@ERROR <> 0)
  8351.             goto FAILURE
  8352.  
  8353.         exec @retcode = dbo.sp_add_agent_parameter 
  8354.                 @profile_id = @real_profile_id,
  8355.                 @parameter_name = '-StartQueueTimeout',
  8356.                 @parameter_value = '0'
  8357.         if (@retcode = 1 or @@ERROR <> 0)
  8358.             goto FAILURE
  8359.  
  8360.         exec @retcode = dbo.sp_add_agent_parameter 
  8361.                 @profile_id = @real_profile_id,
  8362.                 @parameter_name = '-MaxDownloadChanges',
  8363.                 @parameter_value = '0'
  8364.         if (@retcode = 1 or @@ERROR <> 0)
  8365.             goto FAILURE
  8366.  
  8367.         exec @retcode = dbo.sp_add_agent_parameter 
  8368.                 @profile_id = @real_profile_id,
  8369.                 @parameter_name = '-MaxUploadChanges',
  8370.                 @parameter_value = '0'
  8371.         if (@retcode = 1 or @@ERROR <> 0)
  8372.             goto FAILURE
  8373.             
  8374.         exec @retcode = dbo.sp_add_agent_parameter 
  8375.                 @profile_id = @real_profile_id,
  8376.                 @parameter_name = '-ValidateInterval',
  8377.                 @parameter_value = '60'
  8378.         if (@retcode = 1 or @@ERROR <> 0)
  8379.             goto FAILURE
  8380.  
  8381.         exec @retcode = dbo.sp_add_agent_parameter 
  8382.                 @profile_id = @real_profile_id,
  8383.                 @parameter_name = '-LoginTimeout',
  8384.                 @parameter_value = '15'
  8385.         if (@retcode = 1 or @@ERROR <> 0)
  8386.             goto FAILURE
  8387.  
  8388.         exec @retcode = dbo.sp_add_agent_parameter 
  8389.                 @profile_id = @real_profile_id,
  8390.                 @parameter_name = '-QueryTimeout',
  8391.                 @parameter_value = '300'
  8392.         if (@retcode = 1 or @@ERROR <> 0)
  8393.             goto FAILURE
  8394.  
  8395.         exec @retcode = dbo.sp_add_agent_parameter 
  8396.                 @profile_id = @real_profile_id,
  8397.                 @parameter_name = '-UploadGenerationsPerBatch',
  8398.                 @parameter_value = '20'
  8399.         if (@retcode = 1 or @@ERROR <> 0)
  8400.             goto FAILURE
  8401.  
  8402.         exec @retcode = dbo.sp_add_agent_parameter 
  8403.                 @profile_id = @real_profile_id,
  8404.                 @parameter_name = '-DownloadGenerationsPerBatch',
  8405.                 @parameter_value = '100'
  8406.         if (@retcode = 1 or @@ERROR <> 0)
  8407.             goto FAILURE
  8408.  
  8409.         exec @retcode = dbo.sp_add_agent_parameter 
  8410.                 @profile_id = @real_profile_id,
  8411.                 @parameter_name = '-UploadReadChangesPerBatch',
  8412.                 @parameter_value = '100'
  8413.         if (@retcode = 1 or @@ERROR <> 0)
  8414.             goto FAILURE
  8415.  
  8416.         exec @retcode = dbo.sp_add_agent_parameter 
  8417.                 @profile_id = @real_profile_id,
  8418.                 @parameter_name = '-DownloadReadChangesPerBatch',
  8419.                 @parameter_value = '100'
  8420.         if (@retcode = 1 or @@ERROR <> 0)
  8421.             goto FAILURE
  8422.  
  8423.         exec @retcode = dbo.sp_add_agent_parameter 
  8424.                 @profile_id = @real_profile_id,
  8425.                 @parameter_name = '-UploadWriteChangesPerBatch',
  8426.                 @parameter_value = '100'
  8427.         if (@retcode = 1 or @@ERROR <> 0)
  8428.             goto FAILURE
  8429.  
  8430.         exec @retcode = dbo.sp_add_agent_parameter 
  8431.                 @profile_id = @real_profile_id,
  8432.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  8433.                 @parameter_value = '100'
  8434.         if (@retcode = 1 or @@ERROR <> 0)
  8435.             goto FAILURE
  8436.  
  8437.         exec @retcode = dbo.sp_add_agent_parameter 
  8438.                 @profile_id = @real_profile_id,
  8439.                 @parameter_name = '-Validate',
  8440.                 @parameter_value = '0'
  8441.         if (@retcode = 1 or @@ERROR <> 0)
  8442.             goto FAILURE
  8443.         
  8444.         exec @retcode = dbo.sp_add_agent_parameter 
  8445.                 @profile_id = @real_profile_id,
  8446.                 @parameter_name = '-FastRowCount',
  8447.                 @parameter_value = '1'
  8448.         if (@retcode = 1 or @@ERROR <> 0)
  8449.             goto FAILURE
  8450.  
  8451.         exec @retcode = dbo.sp_add_agent_parameter 
  8452.                 @profile_id = @real_profile_id,
  8453.                 @parameter_name = '-HistoryVerboseLevel',
  8454.                 @parameter_value = '1'
  8455.         if (@retcode = 1 or @@ERROR <> 0)
  8456.             goto FAILURE
  8457.  
  8458.         exec @retcode = dbo.sp_add_agent_parameter 
  8459.                 @profile_id = @real_profile_id,
  8460.                 @parameter_name = '-ChangesPerHistory',
  8461.                 @parameter_value = '100'
  8462.         if (@retcode = 1 or @@ERROR <> 0)
  8463.             goto FAILURE
  8464.  
  8465.         exec @retcode = dbo.sp_add_agent_parameter 
  8466.                 @profile_id = @real_profile_id,
  8467.                 @parameter_name = '-BcpBatchSize',
  8468.                 @parameter_value = '100000'
  8469.         if (@retcode = 1 or @@ERROR <> 0)
  8470.             goto FAILURE
  8471.  
  8472.         exec @retcode = dbo.sp_add_agent_parameter 
  8473.                 @profile_id = @real_profile_id,
  8474.                 @parameter_name = '-KeepAliveMessageInterval',
  8475.                 @parameter_value = '300'
  8476.         if (@retcode = 1 or @@ERROR <> 0)
  8477.             goto FAILURE
  8478.  
  8479.         exec @retcode = dbo.sp_add_agent_parameter 
  8480.                 @profile_id = @real_profile_id,
  8481.                 @parameter_name = '-NumDeadlockRetries',
  8482.                 @parameter_value = '5'
  8483.         if (@retcode = 1 or @@ERROR <> 0)
  8484.             goto FAILURE
  8485.  
  8486.         exec @retcode = dbo.sp_add_agent_parameter 
  8487.                 @profile_id = @real_profile_id,
  8488.                 @parameter_name = '-SrcThreads',
  8489.                 @parameter_value = '3'
  8490.         if (@retcode = 1 or @@ERROR <> 0)
  8491.             goto FAILURE
  8492.  
  8493.         exec @retcode = dbo.sp_add_agent_parameter 
  8494.                 @profile_id = @real_profile_id,
  8495.                 @parameter_name = '-DestThreads',
  8496.                 @parameter_value = '4'
  8497.         if (@retcode = 1 or @@ERROR <> 0)
  8498.             goto FAILURE
  8499.         end
  8500.  
  8501.         /* 
  8502.     ** Merge agent : Default profile for well connected scenarios - Verbose history logging 
  8503.     */
  8504.     else if (@profile_id = 8)
  8505.         begin
  8506.         exec @retcode = dbo.sp_add_agent_parameter 
  8507.                 @profile_id = @real_profile_id,
  8508.                 @parameter_name = '-PollingInterval',
  8509.                 @parameter_value = '60'
  8510.         if (@retcode = 1 or @@ERROR <> 0)
  8511.             goto FAILURE
  8512.             
  8513.         exec @retcode = dbo.sp_add_agent_parameter 
  8514.                 @profile_id = @real_profile_id,
  8515.                 @parameter_name = '-StartQueueTimeout',
  8516.                 @parameter_value = '0'
  8517.         if (@retcode = 1 or @@ERROR <> 0)
  8518.             goto FAILURE
  8519.             
  8520.         exec @retcode = dbo.sp_add_agent_parameter 
  8521.                 @profile_id = @real_profile_id,
  8522.                 @parameter_name = '-MaxDownloadChanges',
  8523.                 @parameter_value = '0'
  8524.         if (@retcode = 1 or @@ERROR <> 0)
  8525.             goto FAILURE
  8526.  
  8527.         exec @retcode = dbo.sp_add_agent_parameter 
  8528.                 @profile_id = @real_profile_id,
  8529.                 @parameter_name = '-MaxUploadChanges',
  8530.                 @parameter_value = '0'
  8531.         if (@retcode = 1 or @@ERROR <> 0)
  8532.             goto FAILURE
  8533.  
  8534.         exec @retcode = dbo.sp_add_agent_parameter 
  8535.                 @profile_id = @real_profile_id,
  8536.                 @parameter_name = '-ValidateInterval',
  8537.                 @parameter_value = '60'
  8538.         if (@retcode = 1 or @@ERROR <> 0)
  8539.             goto FAILURE
  8540.  
  8541.         exec @retcode = dbo.sp_add_agent_parameter 
  8542.                 @profile_id = @real_profile_id,
  8543.                 @parameter_name = '-LoginTimeout',
  8544.                 @parameter_value = '15'
  8545.         if (@retcode = 1 or @@ERROR <> 0)
  8546.             goto FAILURE
  8547.  
  8548.         exec @retcode = dbo.sp_add_agent_parameter 
  8549.                 @profile_id = @real_profile_id,
  8550.                 @parameter_name = '-QueryTimeout',
  8551.                 @parameter_value = '300'        
  8552.         if (@retcode = 1 or @@ERROR <> 0)
  8553.             goto FAILURE
  8554.  
  8555.         exec @retcode = dbo.sp_add_agent_parameter 
  8556.                 @profile_id = @real_profile_id,
  8557.                 @parameter_name = '-UploadGenerationsPerBatch',
  8558.                 @parameter_value = '100'
  8559.         if (@retcode = 1 or @@ERROR <> 0)
  8560.             goto FAILURE
  8561.  
  8562.         exec @retcode = dbo.sp_add_agent_parameter 
  8563.                 @profile_id = @real_profile_id,
  8564.                 @parameter_name = '-DownloadGenerationsPerBatch',
  8565.                 @parameter_value = '100'
  8566.         if (@retcode = 1 or @@ERROR <> 0)
  8567.             goto FAILURE
  8568.  
  8569.         exec @retcode = dbo.sp_add_agent_parameter 
  8570.                 @profile_id = @real_profile_id,
  8571.                 @parameter_name = '-UploadReadChangesPerBatch',
  8572.                 @parameter_value = '100'
  8573.         if (@retcode = 1 or @@ERROR <> 0)
  8574.             goto FAILURE
  8575.  
  8576.         exec @retcode = dbo.sp_add_agent_parameter 
  8577.                 @profile_id = @real_profile_id,
  8578.                 @parameter_name = '-DownloadReadChangesPerBatch',
  8579.                 @parameter_value = '100'
  8580.         if (@retcode = 1 or @@ERROR <> 0)
  8581.             goto FAILURE
  8582.  
  8583.         exec @retcode = dbo.sp_add_agent_parameter 
  8584.                 @profile_id = @real_profile_id,
  8585.                 @parameter_name = '-UploadWriteChangesPerBatch',
  8586.                 @parameter_value = '100'
  8587.         if (@retcode = 1 or @@ERROR <> 0)
  8588.             goto FAILURE
  8589.  
  8590.         exec @retcode = dbo.sp_add_agent_parameter 
  8591.                 @profile_id = @real_profile_id,
  8592.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  8593.                 @parameter_value = '100'
  8594.         if (@retcode = 1 or @@ERROR <> 0)
  8595.             goto FAILURE
  8596.  
  8597.         exec @retcode = dbo.sp_add_agent_parameter 
  8598.                 @profile_id = @real_profile_id,
  8599.                 @parameter_name = '-Validate',
  8600.                 @parameter_value = '0'
  8601.         if (@retcode = 1 or @@ERROR <> 0)
  8602.             goto FAILURE
  8603.  
  8604.         exec @retcode = dbo.sp_add_agent_parameter 
  8605.                 @profile_id = @real_profile_id,
  8606.                 @parameter_name = '-FastRowCount',
  8607.                 @parameter_value = '1'
  8608.         if (@retcode = 1 or @@ERROR <> 0)
  8609.             goto FAILURE
  8610.         
  8611.         exec @retcode = dbo.sp_add_agent_parameter 
  8612.                 @profile_id = @real_profile_id,
  8613.                 @parameter_name = '-HistoryVerboseLevel',
  8614.                 @parameter_value = '3'
  8615.         if (@retcode = 1 or @@ERROR <> 0)
  8616.             goto FAILURE
  8617.  
  8618.         exec @retcode = dbo.sp_add_agent_parameter 
  8619.                 @profile_id = @real_profile_id,
  8620.                 @parameter_name = '-ChangesPerHistory',
  8621.                 @parameter_value = '50'
  8622.         if (@retcode = 1 or @@ERROR <> 0)
  8623.             goto FAILURE
  8624.  
  8625.         exec @retcode = dbo.sp_add_agent_parameter 
  8626.                 @profile_id = @real_profile_id,
  8627.                 @parameter_name = '-BcpBatchSize',
  8628.                 @parameter_value = '100000'
  8629.         if (@retcode = 1 or @@ERROR <> 0)
  8630.             goto FAILURE
  8631.  
  8632.         exec @retcode = dbo.sp_add_agent_parameter 
  8633.                 @profile_id = @real_profile_id,
  8634.                 @parameter_name = '-NumDeadlockRetries',
  8635.                 @parameter_value = '5'
  8636.         if (@retcode = 1 or @@ERROR <> 0)
  8637.             goto FAILURE
  8638.  
  8639.         exec @retcode = dbo.sp_add_agent_parameter 
  8640.                 @profile_id = @real_profile_id,
  8641.                 @parameter_name = '-SrcThreads',
  8642.                 @parameter_value = '3'
  8643.         if (@retcode = 1 or @@ERROR <> 0)
  8644.             goto FAILURE
  8645.  
  8646.         exec @retcode = dbo.sp_add_agent_parameter 
  8647.                 @profile_id = @real_profile_id,
  8648.                 @parameter_name = '-DestThreads',
  8649.                 @parameter_value = '4'
  8650.         if (@retcode = 1 or @@ERROR <> 0)
  8651.             goto FAILURE
  8652.  
  8653.         exec @retcode = dbo.sp_add_agent_parameter
  8654.                 @profile_id = @real_profile_id,
  8655.                 @parameter_name = '-KeepAliveMessageInterval',
  8656.                 @parameter_value = '300'
  8657.         if (@retcode = 1 or @@ERROR <> 0)
  8658.             goto FAILURE
  8659.  
  8660.         end
  8661.  
  8662.     /* 
  8663.     ** Merge agent : (Synchronization Manager Profile)
  8664.     */
  8665.     else if (@profile_id = 9)
  8666.         begin
  8667.         exec @retcode = dbo.sp_add_agent_parameter 
  8668.                 @profile_id = @real_profile_id,
  8669.                 @parameter_name = '-PollingInterval',
  8670.                 @parameter_value = '60'
  8671.         if (@retcode = 1 or @@ERROR <> 0)
  8672.             goto FAILURE
  8673.  
  8674.         exec @retcode = dbo.sp_add_agent_parameter 
  8675.                 @profile_id = @real_profile_id,
  8676.                 @parameter_name = '-StartQueueTimeout',
  8677.                 @parameter_value = '0'
  8678.         if (@retcode = 1 or @@ERROR <> 0)
  8679.             goto FAILURE
  8680.  
  8681.         exec @retcode = dbo.sp_add_agent_parameter 
  8682.                 @profile_id = @real_profile_id,
  8683.                 @parameter_name = '-MaxDownloadChanges',
  8684.                 @parameter_value = '0'
  8685.         if (@retcode = 1 or @@ERROR <> 0)
  8686.             goto FAILURE
  8687.  
  8688.         exec @retcode = dbo.sp_add_agent_parameter 
  8689.                 @profile_id = @real_profile_id,
  8690.                 @parameter_name = '-MaxUploadChanges',
  8691.                 @parameter_value = '0'
  8692.         if (@retcode = 1 or @@ERROR <> 0)
  8693.             goto FAILURE
  8694.             
  8695.         exec @retcode = dbo.sp_add_agent_parameter 
  8696.                 @profile_id = @real_profile_id,
  8697.                 @parameter_name = '-ValidateInterval',
  8698.                 @parameter_value = '60'
  8699.         if (@retcode = 1 or @@ERROR <> 0)
  8700.             goto FAILURE
  8701.  
  8702.         exec @retcode = dbo.sp_add_agent_parameter 
  8703.                 @profile_id = @real_profile_id,
  8704.                 @parameter_name = '-LoginTimeout',
  8705.                 @parameter_value = '15'
  8706.         if (@retcode = 1 or @@ERROR <> 0)
  8707.             goto FAILURE
  8708.  
  8709.         exec @retcode = dbo.sp_add_agent_parameter 
  8710.                 @profile_id = @real_profile_id,
  8711.                 @parameter_name = '-QueryTimeout',
  8712.                 @parameter_value = '300'
  8713.         if (@retcode = 1 or @@ERROR <> 0)
  8714.             goto FAILURE
  8715.  
  8716.         exec @retcode = dbo.sp_add_agent_parameter 
  8717.                 @profile_id = @real_profile_id,
  8718.                 @parameter_name = '-UploadGenerationsPerBatch',
  8719.                 @parameter_value = '100'
  8720.         if (@retcode = 1 or @@ERROR <> 0)
  8721.             goto FAILURE
  8722.  
  8723.         exec @retcode = dbo.sp_add_agent_parameter 
  8724.                 @profile_id = @real_profile_id,
  8725.                 @parameter_name = '-DownloadGenerationsPerBatch',
  8726.                 @parameter_value = '100'
  8727.         if (@retcode = 1 or @@ERROR <> 0)
  8728.             goto FAILURE
  8729.  
  8730.         exec @retcode = dbo.sp_add_agent_parameter 
  8731.                 @profile_id = @real_profile_id,
  8732.                 @parameter_name = '-UploadReadChangesPerBatch',
  8733.                 @parameter_value = '100'
  8734.         if (@retcode = 1 or @@ERROR <> 0)
  8735.             goto FAILURE
  8736.  
  8737.         exec @retcode = dbo.sp_add_agent_parameter 
  8738.                 @profile_id = @real_profile_id,
  8739.                 @parameter_name = '-DownloadReadChangesPerBatch',
  8740.                 @parameter_value = '100'
  8741.         if (@retcode = 1 or @@ERROR <> 0)
  8742.             goto FAILURE
  8743.  
  8744.         exec @retcode = dbo.sp_add_agent_parameter 
  8745.                 @profile_id = @real_profile_id,
  8746.                 @parameter_name = '-UploadWriteChangesPerBatch',
  8747.                 @parameter_value = '100'
  8748.         if (@retcode = 1 or @@ERROR <> 0)
  8749.             goto FAILURE
  8750.  
  8751.         exec @retcode = dbo.sp_add_agent_parameter 
  8752.                 @profile_id = @real_profile_id,
  8753.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  8754.                 @parameter_value = '100'
  8755.         if (@retcode = 1 or @@ERROR <> 0)
  8756.             goto FAILURE
  8757.  
  8758.         exec @retcode = dbo.sp_add_agent_parameter 
  8759.                 @profile_id = @real_profile_id,
  8760.                 @parameter_name = '-Validate',
  8761.                 @parameter_value = '0'
  8762.         if (@retcode = 1 or @@ERROR <> 0)
  8763.             goto FAILURE
  8764.         
  8765.         exec @retcode = dbo.sp_add_agent_parameter 
  8766.                 @profile_id = @real_profile_id,
  8767.                 @parameter_name = '-FastRowCount',
  8768.                 @parameter_value = '1'
  8769.         if (@retcode = 1 or @@ERROR <> 0)
  8770.             goto FAILURE
  8771.  
  8772.         exec @retcode = dbo.sp_add_agent_parameter 
  8773.                 @profile_id = @real_profile_id,
  8774.                 @parameter_name = '-HistoryVerboseLevel',
  8775.                 @parameter_value = '1'
  8776.         if (@retcode = 1 or @@ERROR <> 0)
  8777.             goto FAILURE
  8778.  
  8779.         exec @retcode = dbo.sp_add_agent_parameter 
  8780.                 @profile_id = @real_profile_id,
  8781.                 @parameter_name = '-ChangesPerHistory',
  8782.                 @parameter_value = '50'
  8783.         if (@retcode = 1 or @@ERROR <> 0)
  8784.             goto FAILURE
  8785.  
  8786.         exec @retcode = dbo.sp_add_agent_parameter 
  8787.                 @profile_id = @real_profile_id,
  8788.                 @parameter_name = '-BcpBatchSize',
  8789.                 @parameter_value = '1000'
  8790.         if (@retcode = 1 or @@ERROR <> 0)
  8791.             goto FAILURE
  8792.  
  8793.         exec @retcode = dbo.sp_add_agent_parameter 
  8794.                 @profile_id = @real_profile_id,
  8795.                 @parameter_name = '-NumDeadlockRetries',
  8796.                 @parameter_value = '5'
  8797.         if (@retcode = 1 or @@ERROR <> 0)
  8798.             goto FAILURE
  8799.  
  8800.         exec @retcode = dbo.sp_add_agent_parameter 
  8801.                 @profile_id = @real_profile_id,
  8802.                 @parameter_name = '-SrcThreads',
  8803.                 @parameter_value = '3'
  8804.         if (@retcode = 1 or @@ERROR <> 0)
  8805.             goto FAILURE
  8806.  
  8807.         exec @retcode = dbo.sp_add_agent_parameter 
  8808.                 @profile_id = @real_profile_id,
  8809.                 @parameter_name = '-DestThreads',
  8810.                 @parameter_value = '4'
  8811.         if (@retcode = 1 or @@ERROR <> 0)
  8812.             goto FAILURE
  8813.  
  8814.         exec @retcode = dbo.sp_add_agent_parameter
  8815.                 @profile_id = @real_profile_id,
  8816.                 @parameter_name = '-KeepAliveMessageInterval',
  8817.                 @parameter_value = '300'
  8818.         if (@retcode = 1 or @@ERROR <> 0)
  8819.             goto FAILURE
  8820.  
  8821.         end
  8822.  
  8823.     /* 
  8824.     ** Distribution agent (Synchronization Manager Profile)
  8825.     */
  8826.     else if (@profile_id = 10)
  8827.         begin
  8828.         exec @retcode = dbo.sp_add_agent_parameter 
  8829.                 @profile_id = @real_profile_id,
  8830.                 @parameter_name = '-BcpBatchSize',
  8831.                 @parameter_value = '1000'
  8832.         if (@retcode = 1 or @@ERROR <> 0)
  8833.             goto FAILURE
  8834.  
  8835.         exec @retcode = dbo.sp_add_agent_parameter 
  8836.                 @profile_id = @real_profile_id,
  8837.                 @parameter_name = '-CommitBatchSize',
  8838.                 @parameter_value = '100'
  8839.         if (@retcode = 1 or @@ERROR <> 0)
  8840.             goto FAILURE
  8841.  
  8842.         exec @retcode = dbo.sp_add_agent_parameter 
  8843.                 @profile_id = @real_profile_id,
  8844.                 @parameter_name = '-CommitBatchThreshold',
  8845.                 @parameter_value = '1000'
  8846.         if (@retcode = 1 or @@ERROR <> 0)
  8847.             goto FAILURE
  8848.  
  8849.         exec @retcode = dbo.sp_add_agent_parameter 
  8850.                 @profile_id = @real_profile_id,
  8851.                 @parameter_name = '-HistoryVerboseLevel',
  8852.                 @parameter_value = '1'
  8853.         if (@retcode = 1 or @@ERROR <> 0)
  8854.             goto FAILURE
  8855.  
  8856.         exec @retcode = dbo.sp_add_agent_parameter 
  8857.                 @profile_id = @real_profile_id,
  8858.                 @parameter_name = '-LoginTimeout',
  8859.                 @parameter_value = '15'
  8860.         if (@retcode = 1 or @@ERROR <> 0)
  8861.             goto FAILURE
  8862.  
  8863.         exec @retcode = dbo.sp_add_agent_parameter 
  8864.                 @profile_id = @real_profile_id,
  8865.                 @parameter_name = '-MaxBcpThreads',
  8866.                 @parameter_value = '1'
  8867.         if (@retcode = 1 or @@ERROR <> 0)
  8868.             goto FAILURE
  8869.  
  8870.         exec @retcode = dbo.sp_add_agent_parameter 
  8871.                 @profile_id = @real_profile_id,
  8872.                 @parameter_name = '-MaxDeliveredTransactions',
  8873.                 @parameter_value = '0'
  8874.         if (@retcode = 1 or @@ERROR <> 0)
  8875.             goto FAILURE
  8876.  
  8877.         exec @retcode = dbo.sp_add_agent_parameter 
  8878.                 @profile_id = @real_profile_id,
  8879.                 @parameter_name = '-PollingInterval',
  8880.                 @parameter_value = '10'
  8881.         if (@retcode = 1 or @@ERROR <> 0)
  8882.             goto FAILURE
  8883.  
  8884.         exec @retcode = dbo.sp_add_agent_parameter 
  8885.                 @profile_id = @real_profile_id,
  8886.                 @parameter_name = '-QueryTimeout',
  8887.                 @parameter_value = '300'        -- 5 minutes 
  8888.         if (@retcode = 1 or @@ERROR <> 0)
  8889.             goto FAILURE
  8890.  
  8891.         exec @retcode = dbo.sp_add_agent_parameter 
  8892.                 @profile_id = @real_profile_id,
  8893.                 @parameter_name = '-TransactionsPerHistory',
  8894.                 @parameter_value = '100'
  8895.         if (@retcode = 1 or @@ERROR <> 0)
  8896.             goto FAILURE
  8897.  
  8898.         exec @retcode = dbo.sp_add_agent_parameter 
  8899.                 @profile_id = @real_profile_id,
  8900.                 @parameter_name = '-SkipErrors',
  8901.                 @parameter_value = ''
  8902.         if (@retcode = 1 or @@ERROR <> 0)
  8903.             goto FAILURE
  8904.  
  8905.         exec @retcode = dbo.sp_add_agent_parameter
  8906.                 @profile_id = @real_profile_id,
  8907.                 @parameter_name = '-KeepAliveMessageInterval',
  8908.                 @parameter_value = '300'
  8909.         if (@retcode = 1 or @@ERROR <> 0)
  8910.             goto FAILURE
  8911.  
  8912.         end
  8913.     
  8914.     /* 
  8915.     ** Queue Reader agent default profile
  8916.     */
  8917.     else if (@profile_id = 11)
  8918.     begin
  8919.         exec @retcode = dbo.sp_add_agent_parameter 
  8920.                 @profile_id = @real_profile_id,
  8921.                 @parameter_name = '-HistoryVerboseLevel',
  8922.                 @parameter_value = '1'
  8923.         if (@retcode = 1 or @@ERROR <> 0)
  8924.             goto FAILURE
  8925.  
  8926.         exec @retcode = dbo.sp_add_agent_parameter 
  8927.                 @profile_id = @real_profile_id,
  8928.                 @parameter_name = '-PollingInterval',
  8929.                 @parameter_value = '10'
  8930.         if (@retcode = 1 or @@ERROR <> 0)
  8931.             goto FAILURE
  8932.  
  8933.         exec @retcode = dbo.sp_add_agent_parameter 
  8934.                 @profile_id = @real_profile_id,
  8935.                 @parameter_name = '-LoginTimeout',
  8936.                 @parameter_value = '15'
  8937.         if (@retcode = 1 or @@ERROR <> 0)
  8938.             goto FAILURE
  8939.  
  8940.         exec @retcode = dbo.sp_add_agent_parameter 
  8941.                 @profile_id = @real_profile_id,
  8942.                 @parameter_name = '-QueryTimeout',
  8943.                 @parameter_value = '300'        -- 5 minutes 
  8944.         if (@retcode = 1 or @@ERROR <> 0)
  8945.             goto FAILURE
  8946.     end
  8947.       
  8948.     /* 
  8949.     ** Merge agent : Rowcount Validation profile for well connected scenarios 
  8950.     */
  8951.     else if (@profile_id = 12)
  8952.         begin
  8953.         exec @retcode = dbo.sp_add_agent_parameter 
  8954.                 @profile_id = @real_profile_id,
  8955.                 @parameter_name = '-PollingInterval',
  8956.                 @parameter_value = '60'
  8957.         if (@retcode = 1 or @@ERROR <> 0)
  8958.             goto FAILURE
  8959.  
  8960.  
  8961.         exec @retcode = dbo.sp_add_agent_parameter 
  8962.                 @profile_id = @real_profile_id,
  8963.                 @parameter_name = '-StartQueueTimeout',
  8964.                 @parameter_value = '0'
  8965.         if (@retcode = 1 or @@ERROR <> 0)
  8966.             goto FAILURE
  8967.  
  8968.         exec @retcode = dbo.sp_add_agent_parameter 
  8969.                 @profile_id = @real_profile_id,
  8970.                 @parameter_name = '-MaxDownloadChanges',
  8971.                 @parameter_value = '0'
  8972.         if (@retcode = 1 or @@ERROR <> 0)
  8973.             goto FAILURE
  8974.  
  8975.         exec @retcode = dbo.sp_add_agent_parameter 
  8976.                 @profile_id = @real_profile_id,
  8977.                 @parameter_name = '-MaxUploadChanges',
  8978.                 @parameter_value = '0'
  8979.         if (@retcode = 1 or @@ERROR <> 0)
  8980.             goto FAILURE
  8981.  
  8982.         exec @retcode = dbo.sp_add_agent_parameter 
  8983.                 @profile_id = @real_profile_id,
  8984.                 @parameter_name = '-ValidateInterval',
  8985.                 @parameter_value = '60'
  8986.         if (@retcode = 1 or @@ERROR <> 0)
  8987.             goto FAILURE
  8988.  
  8989.         exec @retcode = dbo.sp_add_agent_parameter 
  8990.                 @profile_id = @real_profile_id,
  8991.                 @parameter_name = '-LoginTimeout',
  8992.                 @parameter_value = '15'
  8993.         if (@retcode = 1 or @@ERROR <> 0)
  8994.             goto FAILURE
  8995.  
  8996.         exec @retcode = dbo.sp_add_agent_parameter 
  8997.                 @profile_id = @real_profile_id,
  8998.                 @parameter_name = '-QueryTimeout',
  8999.                 @parameter_value = '300'        
  9000.         if (@retcode = 1 or @@ERROR <> 0)
  9001.             goto FAILURE
  9002.  
  9003.         exec @retcode = dbo.sp_add_agent_parameter 
  9004.                 @profile_id = @real_profile_id,
  9005.                 @parameter_name = '-UploadGenerationsPerBatch',
  9006.                 @parameter_value = '100'
  9007.         if (@retcode = 1 or @@ERROR <> 0)
  9008.             goto FAILURE
  9009.  
  9010.         exec @retcode = dbo.sp_add_agent_parameter 
  9011.                 @profile_id = @real_profile_id,
  9012.                 @parameter_name = '-DownloadGenerationsPerBatch',
  9013.                 @parameter_value = '100'
  9014.         if (@retcode = 1 or @@ERROR <> 0)
  9015.             goto FAILURE
  9016.  
  9017.         exec @retcode = dbo.sp_add_agent_parameter 
  9018.                 @profile_id = @real_profile_id,
  9019.                 @parameter_name = '-UploadReadChangesPerBatch',
  9020.                 @parameter_value = '100'
  9021.         if (@retcode = 1 or @@ERROR <> 0)
  9022.             goto FAILURE
  9023.  
  9024.         exec @retcode = dbo.sp_add_agent_parameter 
  9025.                 @profile_id = @real_profile_id,
  9026.                 @parameter_name = '-DownloadReadChangesPerBatch',
  9027.                 @parameter_value = '100'
  9028.         if (@retcode = 1 or @@ERROR <> 0)
  9029.             goto FAILURE
  9030.  
  9031.         exec @retcode = dbo.sp_add_agent_parameter 
  9032.                 @profile_id = @real_profile_id,
  9033.                 @parameter_name = '-UploadWriteChangesPerBatch',
  9034.                 @parameter_value = '100'
  9035.         if (@retcode = 1 or @@ERROR <> 0)
  9036.             goto FAILURE
  9037.  
  9038.         exec @retcode = dbo.sp_add_agent_parameter 
  9039.                 @profile_id = @real_profile_id,
  9040.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  9041.                 @parameter_value = '100'
  9042.         if (@retcode = 1 or @@ERROR <> 0)
  9043.             goto FAILURE
  9044.  
  9045.         exec @retcode = dbo.sp_add_agent_parameter 
  9046.                 @profile_id = @real_profile_id,
  9047.                 @parameter_name = '-Validate',
  9048.                 @parameter_value = '1'
  9049.         if (@retcode = 1 or @@ERROR <> 0)
  9050.             goto FAILURE
  9051.  
  9052.         exec @retcode = dbo.sp_add_agent_parameter 
  9053.                 @profile_id = @real_profile_id,
  9054.                 @parameter_name = '-FastRowCount',
  9055.                 @parameter_value = '1'
  9056.         if (@retcode = 1 or @@ERROR <> 0)
  9057.             goto FAILURE
  9058.         
  9059.         exec @retcode = dbo.sp_add_agent_parameter 
  9060.                 @profile_id = @real_profile_id,
  9061.                 @parameter_name = '-HistoryVerboseLevel',
  9062.                 @parameter_value = '1'
  9063.         if (@retcode = 1 or @@ERROR <> 0)
  9064.             goto FAILURE
  9065.  
  9066.         exec @retcode = dbo.sp_add_agent_parameter 
  9067.                 @profile_id = @real_profile_id,
  9068.                 @parameter_name = '-ChangesPerHistory',
  9069.                 @parameter_value = '100'
  9070.         if (@retcode = 1 or @@ERROR <> 0)
  9071.             goto FAILURE
  9072.         exec @retcode = dbo.sp_add_agent_parameter 
  9073.                 @profile_id = @real_profile_id,
  9074.                 @parameter_name = '-BcpBatchSize',
  9075.                 @parameter_value = '100000'
  9076.         if (@retcode = 1 or @@ERROR <> 0)
  9077.             goto FAILURE
  9078.  
  9079.         exec @retcode = dbo.sp_add_agent_parameter 
  9080.                 @profile_id = @real_profile_id,
  9081.                 @parameter_name = '-NumDeadlockRetries',
  9082.                 @parameter_value = '5'
  9083.         if (@retcode = 1 or @@ERROR <> 0)
  9084.             goto FAILURE
  9085.  
  9086.         exec @retcode = dbo.sp_add_agent_parameter 
  9087.                 @profile_id = @real_profile_id,
  9088.                 @parameter_name = '-SrcThreads',
  9089.                 @parameter_value = '3'
  9090.         if (@retcode = 1 or @@ERROR <> 0)
  9091.             goto FAILURE
  9092.  
  9093.         exec @retcode = dbo.sp_add_agent_parameter 
  9094.                 @profile_id = @real_profile_id,
  9095.                 @parameter_name = '-DestThreads',
  9096.                 @parameter_value = '4'
  9097.         if (@retcode = 1 or @@ERROR <> 0)
  9098.             goto FAILURE
  9099.             
  9100.         exec @retcode = dbo.sp_add_agent_parameter
  9101.                 @profile_id = @real_profile_id,
  9102.                 @parameter_name = '-KeepAliveMessageInterval',
  9103.                 @parameter_value = '300'
  9104.         if (@retcode = 1 or @@ERROR <> 0)
  9105.             goto FAILURE
  9106.  
  9107.         end
  9108.  
  9109.     /* 
  9110.     ** Merge agent : Rowcount & Checksum Validation profile for well connected scenarios 
  9111.     */
  9112.     else if (@profile_id = 13)
  9113.         begin
  9114.         exec @retcode = dbo.sp_add_agent_parameter 
  9115.                 @profile_id = @real_profile_id,
  9116.                 @parameter_name = '-PollingInterval',
  9117.                 @parameter_value = '60'
  9118.         if (@retcode = 1 or @@ERROR <> 0)
  9119.             goto FAILURE
  9120.  
  9121.         exec @retcode = dbo.sp_add_agent_parameter 
  9122.                 @profile_id = @real_profile_id,
  9123.                 @parameter_name = '-StartQueueTimeout',
  9124.                 @parameter_value = '0'
  9125.         if (@retcode = 1 or @@ERROR <> 0)
  9126.             goto FAILURE
  9127.  
  9128.         exec @retcode = dbo.sp_add_agent_parameter 
  9129.                 @profile_id = @real_profile_id,
  9130.                 @parameter_name = '-MaxDownloadChanges',
  9131.                 @parameter_value = '0'
  9132.         if (@retcode = 1 or @@ERROR <> 0)
  9133.             goto FAILURE
  9134.  
  9135.         exec @retcode = dbo.sp_add_agent_parameter 
  9136.                 @profile_id = @real_profile_id,
  9137.                 @parameter_name = '-MaxUploadChanges',
  9138.                 @parameter_value = '0'
  9139.         if (@retcode = 1 or @@ERROR <> 0)
  9140.             goto FAILURE
  9141.  
  9142.         exec @retcode = dbo.sp_add_agent_parameter 
  9143.                 @profile_id = @real_profile_id,
  9144.                 @parameter_name = '-ValidateInterval',
  9145.                 @parameter_value = '60'
  9146.         if (@retcode = 1 or @@ERROR <> 0)
  9147.             goto FAILURE
  9148.  
  9149.         exec @retcode = dbo.sp_add_agent_parameter 
  9150.                 @profile_id = @real_profile_id,
  9151.                 @parameter_name = '-LoginTimeout',
  9152.                 @parameter_value = '15'
  9153.         if (@retcode = 1 or @@ERROR <> 0)
  9154.             goto FAILURE
  9155.  
  9156.         exec @retcode = dbo.sp_add_agent_parameter 
  9157.                 @profile_id = @real_profile_id,
  9158.                 @parameter_name = '-QueryTimeout',
  9159.                 @parameter_value = '300'        
  9160.         if (@retcode = 1 or @@ERROR <> 0)
  9161.             goto FAILURE
  9162.  
  9163.         exec @retcode = dbo.sp_add_agent_parameter 
  9164.                 @profile_id = @real_profile_id,
  9165.                 @parameter_name = '-UploadGenerationsPerBatch',
  9166.                 @parameter_value = '100'
  9167.         if (@retcode = 1 or @@ERROR <> 0)
  9168.             goto FAILURE
  9169.  
  9170.         exec @retcode = dbo.sp_add_agent_parameter 
  9171.                 @profile_id = @real_profile_id,
  9172.                 @parameter_name = '-DownloadGenerationsPerBatch',
  9173.                 @parameter_value = '100'
  9174.         if (@retcode = 1 or @@ERROR <> 0)
  9175.             goto FAILURE
  9176.  
  9177.         exec @retcode = dbo.sp_add_agent_parameter 
  9178.                 @profile_id = @real_profile_id,
  9179.                 @parameter_name = '-UploadReadChangesPerBatch',
  9180.                 @parameter_value = '100'
  9181.         if (@retcode = 1 or @@ERROR <> 0)
  9182.             goto FAILURE
  9183.  
  9184.         exec @retcode = dbo.sp_add_agent_parameter 
  9185.                 @profile_id = @real_profile_id,
  9186.                 @parameter_name = '-DownloadReadChangesPerBatch',
  9187.                 @parameter_value = '100'
  9188.         if (@retcode = 1 or @@ERROR <> 0)
  9189.             goto FAILURE
  9190.  
  9191.         exec @retcode = dbo.sp_add_agent_parameter 
  9192.                 @profile_id = @real_profile_id,
  9193.                 @parameter_name = '-UploadWriteChangesPerBatch',
  9194.                 @parameter_value = '100'
  9195.         if (@retcode = 1 or @@ERROR <> 0)
  9196.             goto FAILURE
  9197.  
  9198.         exec @retcode = dbo.sp_add_agent_parameter 
  9199.                 @profile_id = @real_profile_id,
  9200.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  9201.                 @parameter_value = '100'
  9202.         if (@retcode = 1 or @@ERROR <> 0)
  9203.             goto FAILURE
  9204.  
  9205.         exec @retcode = dbo.sp_add_agent_parameter 
  9206.                 @profile_id = @real_profile_id,
  9207.                 @parameter_name = '-Validate',
  9208.                 @parameter_value = '3'
  9209.         if (@retcode = 1 or @@ERROR <> 0)
  9210.             goto FAILURE
  9211.  
  9212.         exec @retcode = dbo.sp_add_agent_parameter 
  9213.                 @profile_id = @real_profile_id,
  9214.                 @parameter_name = '-FastRowCount',
  9215.                 @parameter_value = '1'
  9216.         if (@retcode = 1 or @@ERROR <> 0)
  9217.             goto FAILURE
  9218.         
  9219.         exec @retcode = dbo.sp_add_agent_parameter 
  9220.                 @profile_id = @real_profile_id,
  9221.                 @parameter_name = '-HistoryVerboseLevel',
  9222.                 @parameter_value = '1'
  9223.         if (@retcode = 1 or @@ERROR <> 0)
  9224.             goto FAILURE
  9225.  
  9226.         exec @retcode = dbo.sp_add_agent_parameter 
  9227.                 @profile_id = @real_profile_id,
  9228.                 @parameter_name = '-ChangesPerHistory',
  9229.                 @parameter_value = '100'
  9230.         if (@retcode = 1 or @@ERROR <> 0)
  9231.             goto FAILURE
  9232.         exec @retcode = dbo.sp_add_agent_parameter 
  9233.                 @profile_id = @real_profile_id,
  9234.                 @parameter_name = '-BcpBatchSize',
  9235.                 @parameter_value = '100000'
  9236.         if (@retcode = 1 or @@ERROR <> 0)
  9237.             goto FAILURE
  9238.  
  9239.         exec @retcode = dbo.sp_add_agent_parameter 
  9240.                 @profile_id = @real_profile_id,
  9241.                 @parameter_name = '-NumDeadlockRetries',
  9242.                 @parameter_value = '5'
  9243.         if (@retcode = 1 or @@ERROR <> 0)
  9244.             goto FAILURE
  9245.             
  9246.         exec @retcode = dbo.sp_add_agent_parameter 
  9247.                 @profile_id = @real_profile_id,
  9248.                 @parameter_name = '-SrcThreads',
  9249.                 @parameter_value = '3'
  9250.         if (@retcode = 1 or @@ERROR <> 0)
  9251.             goto FAILURE
  9252.  
  9253.         exec @retcode = dbo.sp_add_agent_parameter 
  9254.                 @profile_id = @real_profile_id,
  9255.                 @parameter_name = '-DestThreads',
  9256.                 @parameter_value = '4'
  9257.         if (@retcode = 1 or @@ERROR <> 0)
  9258.             goto FAILURE
  9259.  
  9260.         exec @retcode = dbo.sp_add_agent_parameter
  9261.                 @profile_id = @real_profile_id,
  9262.                 @parameter_name = '-KeepAliveMessageInterval',
  9263.                 @parameter_value = '300'
  9264.         if (@retcode = 1 or @@ERROR <> 0)
  9265.             goto FAILURE
  9266.         end
  9267.  
  9268.     /* 
  9269.     ** Distribution agent, skip error profile
  9270.     */
  9271.     else if (@profile_id = 14)
  9272.       begin
  9273.  
  9274.         exec @retcode = dbo.sp_add_agent_parameter 
  9275.                 @profile_id = @real_profile_id,
  9276.                 @parameter_name = '-BcpBatchSize',
  9277.                 @parameter_value = '100000'
  9278.         if (@retcode = 1 or @@ERROR <> 0)
  9279.             goto FAILURE
  9280.  
  9281.         exec @retcode = dbo.sp_add_agent_parameter 
  9282.                 @profile_id = @real_profile_id,
  9283.                 @parameter_name = '-CommitBatchSize',
  9284.                 @parameter_value = '100'
  9285.         if (@retcode = 1 or @@ERROR <> 0)
  9286.             goto FAILURE
  9287.  
  9288.         exec @retcode = dbo.sp_add_agent_parameter 
  9289.                 @profile_id = @real_profile_id,
  9290.                 @parameter_name = '-CommitBatchThreshold',
  9291.                 @parameter_value = '1000'
  9292.         if (@retcode = 1 or @@ERROR <> 0)
  9293.             goto FAILURE
  9294.  
  9295.         exec @retcode = dbo.sp_add_agent_parameter 
  9296.                 @profile_id = @real_profile_id,
  9297.                 @parameter_name = '-HistoryVerboseLevel',
  9298.                 @parameter_value = '1'
  9299.         if (@retcode = 1 or @@ERROR <> 0)
  9300.             goto FAILURE
  9301.  
  9302.         exec @retcode = dbo.sp_add_agent_parameter 
  9303.                 @profile_id = @real_profile_id,
  9304.                 @parameter_name = '-LoginTimeout',
  9305.                 @parameter_value = '15'
  9306.         if (@retcode = 1 or @@ERROR <> 0)
  9307.             goto FAILURE
  9308.  
  9309.         exec @retcode = dbo.sp_add_agent_parameter 
  9310.                 @profile_id = @real_profile_id,
  9311.                 @parameter_name = '-MaxBcpThreads',
  9312.                 @parameter_value = '1'
  9313.         if (@retcode = 1 or @@ERROR <> 0)
  9314.             goto FAILURE
  9315.  
  9316.         exec @retcode = dbo.sp_add_agent_parameter 
  9317.                 @profile_id = @real_profile_id,
  9318.                 @parameter_name = '-MaxDeliveredTransactions',
  9319.                 @parameter_value = '0'
  9320.         if (@retcode = 1 or @@ERROR <> 0)
  9321.             goto FAILURE
  9322.  
  9323.         exec @retcode = dbo.sp_add_agent_parameter 
  9324.                 @profile_id = @real_profile_id,
  9325.                 @parameter_name = '-PollingInterval',
  9326.                 @parameter_value = '10'
  9327.         if (@retcode = 1 or @@ERROR <> 0)
  9328.             goto FAILURE
  9329.  
  9330.         exec @retcode = dbo.sp_add_agent_parameter 
  9331.                 @profile_id = @real_profile_id,
  9332.                 @parameter_name = '-QueryTimeout',
  9333.                 @parameter_value = '300'        -- 5 minutes 
  9334.         if (@retcode = 1 or @@ERROR <> 0)
  9335.             goto FAILURE
  9336.  
  9337.         exec @retcode = dbo.sp_add_agent_parameter 
  9338.                 @profile_id = @real_profile_id,
  9339.                 @parameter_name = '-TransactionsPerHistory',
  9340.                 @parameter_value = '100'
  9341.         if (@retcode = 1 or @@ERROR <> 0)
  9342.             goto FAILURE
  9343.  
  9344.         exec @retcode = dbo.sp_add_agent_parameter 
  9345.                 @profile_id = @real_profile_id,
  9346.                 @parameter_name = '-SkipErrors',
  9347.                 @parameter_value = '2601:2627:20598'
  9348.         if (@retcode = 1 or @@ERROR <> 0)
  9349.             goto FAILURE
  9350.  
  9351.         exec @retcode = dbo.sp_add_agent_parameter
  9352.                 @profile_id = @real_profile_id,
  9353.                 @parameter_name = '-KeepAliveMessageInterval',
  9354.                 @parameter_value = '300'
  9355.         if (@retcode = 1 or @@ERROR <> 0)
  9356.             goto FAILURE
  9357.  
  9358.         end
  9359.  
  9360.     /* 
  9361.     ** Merge agent : Rowcount Validation profile for high volumn server-to-server
  9362.     */
  9363.         else if (@profile_id = 15)
  9364.         begin
  9365.         exec @retcode = dbo.sp_add_agent_parameter 
  9366.                 @profile_id = @real_profile_id,
  9367.                 @parameter_name = '-PollingInterval',
  9368.                 @parameter_value = '60'
  9369.         if (@retcode = 1 or @@ERROR <> 0)
  9370.             goto FAILURE
  9371.  
  9372.         exec @retcode = dbo.sp_add_agent_parameter 
  9373.                 @profile_id = @real_profile_id,
  9374.                 @parameter_name = '-StartQueueTimeout',
  9375.                 @parameter_value = '0'
  9376.         if (@retcode = 1 or @@ERROR <> 0)
  9377.             goto FAILURE
  9378.  
  9379.         exec @retcode = dbo.sp_add_agent_parameter 
  9380.                 @profile_id = @real_profile_id,
  9381.                 @parameter_name = '-MaxDownloadChanges',
  9382.                 @parameter_value = '0'
  9383.         if (@retcode = 1 or @@ERROR <> 0)
  9384.             goto FAILURE
  9385.  
  9386.         exec @retcode = dbo.sp_add_agent_parameter 
  9387.                 @profile_id = @real_profile_id,
  9388.                 @parameter_name = '-MaxUploadChanges',
  9389.                 @parameter_value = '0'
  9390.         if (@retcode = 1 or @@ERROR <> 0)
  9391.             goto FAILURE
  9392.  
  9393.         exec @retcode = dbo.sp_add_agent_parameter 
  9394.                 @profile_id = @real_profile_id,
  9395.                 @parameter_name = '-ValidateInterval',
  9396.                 @parameter_value = '60'
  9397.         if (@retcode = 1 or @@ERROR <> 0)
  9398.             goto FAILURE
  9399.  
  9400.         exec @retcode = dbo.sp_add_agent_parameter 
  9401.                 @profile_id = @real_profile_id,
  9402.                 @parameter_name = '-LoginTimeout',
  9403.                 @parameter_value = '15'
  9404.         if (@retcode = 1 or @@ERROR <> 0)
  9405.             goto FAILURE
  9406.  
  9407.         exec @retcode = dbo.sp_add_agent_parameter 
  9408.                 @profile_id = @real_profile_id,
  9409.                 @parameter_name = '-QueryTimeout',
  9410.                 @parameter_value = '600'        
  9411.         if (@retcode = 1 or @@ERROR <> 0)
  9412.             goto FAILURE
  9413.  
  9414.         exec @retcode = dbo.sp_add_agent_parameter 
  9415.                 @profile_id = @real_profile_id,
  9416.                 @parameter_name = '-UploadGenerationsPerBatch',
  9417.                 @parameter_value = '2000'
  9418.         if (@retcode = 1 or @@ERROR <> 0)
  9419.             goto FAILURE
  9420.  
  9421.         exec @retcode = dbo.sp_add_agent_parameter 
  9422.                 @profile_id = @real_profile_id,
  9423.                 @parameter_name = '-DownloadGenerationsPerBatch',
  9424.                 @parameter_value = '2000'
  9425.         if (@retcode = 1 or @@ERROR <> 0)
  9426.             goto FAILURE
  9427.  
  9428.         exec @retcode = dbo.sp_add_agent_parameter 
  9429.                 @profile_id = @real_profile_id,
  9430.                 @parameter_name = '-UploadReadChangesPerBatch',
  9431.                 @parameter_value = '100'
  9432.         if (@retcode = 1 or @@ERROR <> 0)
  9433.             goto FAILURE
  9434.  
  9435.         exec @retcode = dbo.sp_add_agent_parameter 
  9436.                 @profile_id = @real_profile_id,
  9437.                 @parameter_name = '-DownloadReadChangesPerBatch',
  9438.                 @parameter_value = '100'
  9439.         if (@retcode = 1 or @@ERROR <> 0)
  9440.             goto FAILURE
  9441.  
  9442.         exec @retcode = dbo.sp_add_agent_parameter 
  9443.                 @profile_id = @real_profile_id,
  9444.                 @parameter_name = '-UploadWriteChangesPerBatch',
  9445.                 @parameter_value = '100'
  9446.         if (@retcode = 1 or @@ERROR <> 0)
  9447.             goto FAILURE
  9448.  
  9449.         exec @retcode = dbo.sp_add_agent_parameter 
  9450.                 @profile_id = @real_profile_id,
  9451.                 @parameter_name = '-DownloadWriteChangesPerBatch',
  9452.                 @parameter_value = '100'
  9453.         if (@retcode = 1 or @@ERROR <> 0)
  9454.             goto FAILURE
  9455.  
  9456.         exec @retcode = dbo.sp_add_agent_parameter 
  9457.                 @profile_id = @real_profile_id,
  9458.                 @parameter_name = '-Validate',
  9459.                 @parameter_value = '0'
  9460.         if (@retcode = 1 or @@ERROR <> 0)
  9461.             goto FAILURE
  9462.  
  9463.         exec @retcode = dbo.sp_add_agent_parameter 
  9464.                 @profile_id = @real_profile_id,
  9465.                 @parameter_name = '-FastRowCount',
  9466.                 @parameter_value = '1'
  9467.         if (@retcode = 1 or @@ERROR <> 0)
  9468.             goto FAILURE
  9469.         
  9470.         exec @retcode = dbo.sp_add_agent_parameter 
  9471.                 @profile_id = @real_profile_id,
  9472.                 @parameter_name = '-HistoryVerboseLevel',
  9473.                 @parameter_value = '1'
  9474.         if (@retcode = 1 or @@ERROR <> 0)
  9475.             goto FAILURE
  9476.  
  9477.         exec @retcode = dbo.sp_add_agent_parameter 
  9478.                 @profile_id = @real_profile_id,
  9479.                 @parameter_name = '-ChangesPerHistory',
  9480.                 @parameter_value = '100'
  9481.         if (@retcode = 1 or @@ERROR <> 0)
  9482.             goto FAILURE
  9483.  
  9484.         exec @retcode = dbo.sp_add_agent_parameter 
  9485.                 @profile_id = @real_profile_id,
  9486.                 @parameter_name = '-BcpBatchSize',
  9487.                 @parameter_value = '100000'
  9488.         if (@retcode = 1 or @@ERROR <> 0)
  9489.             goto FAILURE
  9490.  
  9491.         exec @retcode = dbo.sp_add_agent_parameter 
  9492.                 @profile_id = @real_profile_id,
  9493.                 @parameter_name = '-NumDeadlockRetries',
  9494.                 @parameter_value = '5'
  9495.         if (@retcode = 1 or @@ERROR <> 0)
  9496.             goto FAILURE
  9497.  
  9498.         exec @retcode = dbo.sp_add_agent_parameter 
  9499.                 @profile_id = @real_profile_id,
  9500.                 @parameter_name = '-SrcThreads',
  9501.                 @parameter_value = '3'
  9502.         if (@retcode = 1 or @@ERROR <> 0)
  9503.             goto FAILURE
  9504.  
  9505.         exec @retcode = dbo.sp_add_agent_parameter 
  9506.                 @profile_id = @real_profile_id,
  9507.                 @parameter_name = '-DestThreads',
  9508.                 @parameter_value = '4'
  9509.         if (@retcode = 1 or @@ERROR <> 0)
  9510.             goto FAILURE
  9511.  
  9512.         exec @retcode = dbo.sp_add_agent_parameter
  9513.                 @profile_id = @real_profile_id,
  9514.                 @parameter_name = '-KeepAliveMessageInterval',
  9515.                 @parameter_value = '300'
  9516.         if (@retcode = 1 or @@ERROR <> 0)
  9517.             goto FAILURE
  9518.  
  9519.         end
  9520.  
  9521.     return 0
  9522. FAILURE:
  9523.     return 1
  9524. go
  9525.  
  9526.  
  9527. raiserror('Creating procedure sp_MSvalidate_agent_parameter', 0,1)
  9528. go
  9529. create procedure sp_MSvalidate_agent_parameter (
  9530.     @profile_id      int,
  9531.     @parameter_name  sysname,
  9532.     @parameter_value nvarchar(255)
  9533. )
  9534. as
  9535.     declare @agent_type  int
  9536.     declare @original_parameter_name sysname
  9537.     declare @numeric_value int
  9538.  
  9539.     -- Make sure parameters are non-null
  9540.     if @profile_id is null
  9541.     BEGIN
  9542.         RAISERROR (14043, 16, -1, '@profile_id')
  9543.         RETURN (1)
  9544.     END
  9545.  
  9546.     if @parameter_name is null 
  9547.     BEGIN
  9548.         RAISERROR (14043, 16, -1, '@parameter_name')
  9549.         RETURN (1)
  9550.     END
  9551.  
  9552.     IF @parameter_value is null
  9553.     BEGIN
  9554.         RAISERROR (14043, 16, -1, '@parameter_value')
  9555.         RETURN (1)
  9556.     END
  9557.  
  9558.     select @original_parameter_name = @parameter_name
  9559.     
  9560.     select @agent_type = agent_type
  9561.     from msdb..MSagent_profiles 
  9562.     where profile_id = @profile_id
  9563.  
  9564.     -- Parameter name validation
  9565.     if (substring(@parameter_name, 1, 1) <> '/' and 
  9566.         substring(@parameter_name, 1, 1) <> '-')
  9567.     begin
  9568.         return 1
  9569.     end
  9570.  
  9571.     select @parameter_name = lower(substring(@parameter_name, 2, len(@parameter_name) - 1))
  9572.  
  9573.     -- Snapshot agent - agent_type = 1
  9574.     if (@agent_type = 1)
  9575.     begin
  9576.         if not @parameter_name in ( 
  9577.             N'bcpbatchsize',   
  9578.             N'historyverboselevel',
  9579.             N'logintimeout',
  9580.             N'maxbcpthreads',
  9581.             N'querytimeout',
  9582.             N'startqueuetimeout'
  9583.             )    
  9584.         begin
  9585.             raiserror(21111, 16, -1, @original_parameter_name)
  9586.             return 1
  9587.         end
  9588.     end
  9589.     -- Logreader - agent_type = 2
  9590.     else if (@agent_type =2)  
  9591.     begin
  9592.         if not lower(@parameter_name) in ( 
  9593.             N'historyverboselevel',
  9594.             N'logintimeout',
  9595.             N'pollinginterval',
  9596.             N'querytimeout',
  9597.             N'readbatchsize'
  9598.             )    
  9599.         begin
  9600.             raiserror(21112, 16, -1, @original_parameter_name)
  9601.             return 1
  9602.         end
  9603.     end
  9604.     -- Distribution agent - agent_type = 3
  9605.     else if (@agent_type = 3)
  9606.     begin
  9607.         if not @parameter_name in ( 
  9608.             N'bcpbatchsize',   
  9609.             N'commitbatchsize',   
  9610.             N'commitbatchthreshold',   
  9611.             N'historyverboselevel',
  9612.             N'logintimeout',
  9613.             N'maxbcpthreads',
  9614.             N'maxdeliveredtransactions',
  9615.             N'pollinginterval',
  9616.             N'querytimeout',
  9617.             N'transactionsperhistory',
  9618.             N'skiperrors',
  9619.             N'keepalivemessageinterval',
  9620.             N'useinprocloader'            
  9621.             )    
  9622.         begin
  9623.             raiserror(21113, 16, -1, @original_parameter_name)
  9624.             return 1
  9625.         end
  9626.     end
  9627.     -- Merge agent - agent_type = 4
  9628.     else if (@agent_type = 4)
  9629.     begin 
  9630.         if not @parameter_name in ( 
  9631.             N'startqueuetimeout',
  9632.             N'pollinginterval',   
  9633.             N'validateinterval',   
  9634.             N'logintimeout',   
  9635.             N'querytimeout',
  9636.             N'maxuploadchanges',
  9637.             N'maxdownloadchanges',
  9638.             N'uploadgenerationsperbatch',   
  9639.             N'downloadgenerationsperbatch',   
  9640.             N'uploadreadchangesperbatch',   
  9641.             N'downloadreadchangesperbatch',   
  9642.             N'uploadwritechangesperbatch',
  9643.             N'downloadwritechangesperbatch',
  9644.             N'validate',   
  9645.             N'fastrowcount',   
  9646.             N'historyverboselevel',
  9647.             N'changesperhistory',
  9648.             N'bcpbatchsize',
  9649.             N'numdeadlockretries',
  9650.             N'keepalivemessageinterval',
  9651.             N'srcthreads',
  9652.             N'destthreads',
  9653.             N'useinprocloader'
  9654.             )    
  9655.         begin
  9656.             raiserror(21114, 16, -1, @original_parameter_name)
  9657.             return 1
  9658.         end
  9659.     end
  9660.     -- Qreader agent - agent_type = 9
  9661.     else if (@agent_type = 9)  
  9662.     begin
  9663.         if not lower(@parameter_name) in ( 
  9664.             N'resolverstate',
  9665.             N'sqlqueuemode',
  9666.             N'historyverboselevel',
  9667.             N'pollinginterval',
  9668.             N'logintimeout',
  9669.             N'querytimeout'
  9670.             )    
  9671.         begin
  9672.             raiserror(21112, 16, -1, @original_parameter_name)
  9673.             return 1
  9674.         end
  9675.     end
  9676.     else if @agent_type is null
  9677.     begin
  9678.         raiserror (20066, 16, -1)   -- profile not defined
  9679.         return 1
  9680.     end
  9681.     else
  9682.     begin
  9683.         -- MSagent_parameters table corruption
  9684.         return 1
  9685.     end
  9686.  
  9687.     -- Parameter value validation
  9688.     if (@parameter_name = N'bcpbatchsize')
  9689.     begin
  9690.         select @numeric_value = convert(int, @parameter_value)
  9691.         if @@error <> 0 or @numeric_value < 1
  9692.         begin
  9693.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9694.             return 1     
  9695.         end
  9696.     end
  9697.     else if (@parameter_name = N'commitbatchsize')
  9698.     begin
  9699.         select @numeric_value = convert(int, @parameter_value)
  9700.         if @@error <> 0 or @numeric_value < 1
  9701.         begin
  9702.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9703.             return 1     
  9704.         end                        
  9705.     end
  9706.     else if (@parameter_name = N'commitbatchthreshold')
  9707.     begin
  9708.         select @numeric_value = convert(int, @parameter_value)
  9709.         if @@error <> 0 or @numeric_value < 1
  9710.         begin
  9711.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9712.             return 1     
  9713.         end                        
  9714.     end
  9715.     else if (@parameter_name = N'downloadgenerationsperbatch')
  9716.     begin
  9717.         select @numeric_value = convert(int, @parameter_value)
  9718.         if @@error <> 0 or @numeric_value < 1
  9719.         begin
  9720.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9721.             return 1     
  9722.         end 
  9723.         if @numeric_value > 2000
  9724.         begin
  9725.             raiserror(14266, 16, -1, 'DownloadGenerationsPerBatch', '1 - 2000') 
  9726.             return 1
  9727.         end                      
  9728.     end
  9729.     else if (@parameter_name = N'downloadreadchangesperbatch')
  9730.     begin
  9731.         select @numeric_value = convert(int, @parameter_value)
  9732.         if @@error <> 0 or @numeric_value < 1
  9733.         begin
  9734.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9735.             return 1     
  9736.         end    
  9737.         if @numeric_value > 2000
  9738.         begin
  9739.             raiserror(14266, 16, -1, 'DownloadReadChangesPerBatch', '1 - 2000') 
  9740.             return 1
  9741.         end                      
  9742.     end
  9743.     else if (@parameter_name = N'downloadwritechangesperbatch')
  9744.     begin
  9745.         select @numeric_value = convert(int, @parameter_value)
  9746.         if @@error <> 0 or @numeric_value < 1
  9747.         begin
  9748.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9749.             return 1     
  9750.         end 
  9751.         if @numeric_value > 2000
  9752.         begin
  9753.             raiserror(14266, 16, -1, 'DownloadWriteChangesPerBatch', '1 - 2000') 
  9754.             return 1
  9755.         end                         
  9756.     end
  9757.     else if (@parameter_name = N'fastrowcount')
  9758.     begin
  9759.         select @numeric_value = convert(int, @parameter_value)
  9760.         if @@error <> 0 or not (@numeric_value in (1,2,3))
  9761.         begin
  9762.             raiserror(21116, 16, -1, @parameter_value, @original_parameter_name)
  9763.             return 1     
  9764.         end                        
  9765.     end
  9766.     else if (@parameter_name = N'historyverboselevel')
  9767.     begin
  9768.         select @numeric_value = convert(int, @parameter_value)
  9769.         if @@error <> 0 or not (@numeric_value in (0,1,2,3))
  9770.         begin
  9771.             raiserror(21117, 16, -1, @parameter_value, @original_parameter_name)
  9772.             return 1     
  9773.         end                        
  9774.     end
  9775.     else if (@parameter_name = N'logintimeout')
  9776.     begin
  9777.         select @numeric_value = convert(int, @parameter_value)
  9778.         if @@error <> 0 or @numeric_value < 1
  9779.         begin
  9780.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9781.             return 1     
  9782.         end                        
  9783.     end
  9784.     else if (@parameter_name = N'maxbcpthreads')
  9785.     begin
  9786.         select @numeric_value = convert(int, @parameter_value)
  9787.         if @@error <> 0 or @numeric_value < 1
  9788.         begin
  9789.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9790.             return 1     
  9791.         end                        
  9792.     end
  9793.     else if (@parameter_name = N'maxdeliveredtransactions')
  9794.     begin
  9795.         select @numeric_value = convert(int, @parameter_value)
  9796.         if @@error <> 0 or @numeric_value < 0
  9797.         begin
  9798.             raiserror(21119, 16, -1, @parameter_value, @original_parameter_name)
  9799.             return 1     
  9800.         end                        
  9801.     end
  9802.     else if (@parameter_name = N'pollinginterval')
  9803.     begin
  9804.         select @numeric_value = convert(int, @parameter_value)
  9805.         if @@error <> 0 or @numeric_value < 1
  9806.         begin
  9807.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9808.             return 1     
  9809.         end                        
  9810.     end
  9811.     else if (@parameter_name = N'querytimeout')
  9812.     begin
  9813.         select @numeric_value = convert(int, @parameter_value)
  9814.         if @@error <> 0 or @numeric_value < 1
  9815.         begin
  9816.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9817.             return 1     
  9818.         end                        
  9819.     end
  9820.     else if (@parameter_name = N'readbatchsize')
  9821.     begin
  9822.         select @numeric_value = convert(int, @parameter_value)
  9823.         if @@error <> 0 or @numeric_value < 1
  9824.         begin
  9825.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9826.             return 1     
  9827.         end                        
  9828.     end
  9829.     else if (@parameter_name = N'transactionsperhistory')
  9830.     begin
  9831.         select @numeric_value = convert(int, @parameter_value)
  9832.         if @@error <> 0 or @numeric_value not between 0 and 10000
  9833.         begin
  9834.             raiserror(211118, 16, -1, @parameter_value, @original_parameter_name)
  9835.             return 1     
  9836.         end                        
  9837.     end
  9838.     else if (@parameter_name = N'uploadgenerationsperbatch')
  9839.     begin
  9840.         select @numeric_value = convert(int, @parameter_value)
  9841.         if @@error <> 0 or @numeric_value < 1
  9842.         begin
  9843.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9844.             return 1     
  9845.         end 
  9846.         if @numeric_value > 2000
  9847.         begin
  9848.             raiserror(14266, 16, -1, 'UploadGenerationsPerBatch', '1 - 2000') 
  9849.             return 1
  9850.         end                         
  9851.     end
  9852.     else if (@parameter_name = N'uploadreadchangesperbatch')
  9853.     begin
  9854.         select @numeric_value = convert(int, @parameter_value)
  9855.         if @@error <> 0 or @numeric_value < 1
  9856.         begin
  9857.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9858.             return 1     
  9859.         end     
  9860.         if @numeric_value > 2000
  9861.         begin
  9862.             raiserror(14266, 16, -1, 'UploadReadChangesPerBatch', '1 - 2000') 
  9863.             return 1
  9864.         end                     
  9865.     end
  9866.     else if (@parameter_name = N'uploadwritechangesperbatch')
  9867.     begin
  9868.         select @numeric_value = convert(int, @parameter_value)
  9869.         if @@error <> 0 or @numeric_value < 1
  9870.         begin
  9871.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9872.             return 1     
  9873.         end 
  9874.         if @numeric_value > 2000
  9875.         begin
  9876.             raiserror(14266, 16, -1, 'UploadWriteChangesPerBatch', '1 - 2000') 
  9877.             return 1
  9878.         end                         
  9879.     end
  9880.     else if (@parameter_name = N'validate')
  9881.     begin
  9882.         select @numeric_value = convert(int, @parameter_value)
  9883.         if @@error <> 0 or not (@numeric_value in (0,1,2,3))
  9884.         begin
  9885.             raiserror(21117, 16, -1, @parameter_value, @original_parameter_name)
  9886.             return 1     
  9887.         end                        
  9888.     end
  9889.     else if (@parameter_name = N'validateinterval')
  9890.     begin
  9891.         select @numeric_value = convert(int, @parameter_value)
  9892.         if @@error <> 0 or @numeric_value < 1
  9893.         begin
  9894.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9895.             return 1     
  9896.         end                        
  9897.     end
  9898.     else if (@parameter_name = N'skiperrors')
  9899.     begin
  9900.         -- Empty string is valid.
  9901.         if @parameter_value <> N''
  9902.         begin
  9903.             -- Valid format: 11:22:33
  9904.             if    @parameter_value like '%[^0-9:]%' or
  9905.                 @parameter_value like ':%' or
  9906.                 @parameter_value like '%:' or
  9907.                 @parameter_value like '%::%'
  9908.             begin
  9909.                 raiserror(20601, 16, -1)
  9910.                 return 1
  9911.             end
  9912.             -- cannot has number of errors equals to or more than 11
  9913.             if    @parameter_value like '%:%:%:%:%:%:%:%:%:%:%'
  9914.             begin
  9915.                 raiserror(20602, 16, -1)
  9916.                 return 1
  9917.             end
  9918.         end
  9919.     end
  9920.     -- Parameter value validation
  9921.     else if (@parameter_name = N'numdeadlockretries')
  9922.     begin
  9923.         select @numeric_value = convert(int, @parameter_value)
  9924.         if @@error <> 0 or @numeric_value < 1
  9925.         begin
  9926.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9927.             return 1     
  9928.         end
  9929.         if @numeric_value > 100
  9930.         begin
  9931.             raiserror(14266, 16, -1, 'NumDeadlockRetries', '1 - 100') 
  9932.             return 1
  9933.         end                         
  9934.     end
  9935.     else if (@parameter_name = N'srcthreads')
  9936.     begin
  9937.         select @numeric_value = convert(int, @parameter_value)
  9938.         if @@error <> 0 or @numeric_value < 1
  9939.         begin
  9940.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9941.             return 1     
  9942.         end                        
  9943.     end
  9944.     else if (@parameter_name = N'destthreads')
  9945.     begin
  9946.         select @numeric_value = convert(int, @parameter_value)
  9947.         if @@error <> 0 or @numeric_value < 1
  9948.         begin
  9949.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9950.             return 1     
  9951.         end                        
  9952.     end
  9953.     else if (@parameter_name = N'keepalivemessageinterval')
  9954.     begin
  9955.         select @numeric_value = convert(int, @parameter_value)
  9956.         if @@error <> 0 or @numeric_value < 30
  9957.         begin
  9958.             raiserror(21405, 16, -1, @parameter_value, @original_parameter_name, 30)            
  9959.             return 1
  9960.         end
  9961.     end
  9962.     else if (@parameter_name = N'useinprocloader')
  9963.     begin
  9964.         select @numeric_value = convert(int, @parameter_value)
  9965.         if @@error <> 0 or @numeric_value not in (0, 1) or rtrim(@parameter_value) = N''
  9966.         begin
  9967.             raiserror(21406, 16, -1, @parameter_value, @original_parameter_name)
  9968.             return 1
  9969.         end
  9970.     end
  9971.     else if (@parameter_name = N'startqueuetimeout')
  9972.     begin
  9973.         select @numeric_value = convert(int, @parameter_value)
  9974.         if @@error <> 0 or (@numeric_value < 300 and @numeric_value <> 0) or rtrim(@parameter_value) = N''
  9975.         begin
  9976.             raiserror(21404, 16, -1, @parameter_value, @original_parameter_name)
  9977.             return 1
  9978.         end
  9979.     end
  9980.     else if (@parameter_name = N'resolverstate')
  9981.     begin
  9982.         select @numeric_value = convert(int, @parameter_value)
  9983.         if @@error <> 0 or @numeric_value not in (1,2,3)
  9984.         begin
  9985.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9986.             return 1     
  9987.         end                        
  9988.     end
  9989.     else if (@parameter_name = N'sqlqueuemode')
  9990.     begin
  9991.         select @numeric_value = convert(int, @parameter_value)
  9992.         if @@error <> 0 or @numeric_value not in (0,1,2)
  9993.         begin
  9994.             raiserror(21115, 16, -1, @parameter_value, @original_parameter_name)
  9995.             return 1     
  9996.         end                        
  9997.     end
  9998.     
  9999.     return 0
  10000. go 
  10001.  
  10002. EXEC dbo.sp_MS_marksystemobject 'sp_MSvalidate_agent_parameter'
  10003.  
  10004.  
  10005. raiserror('Creating procedure sp_add_agent_parameter', 0,1)
  10006. go
  10007.  
  10008. -- Add a row into the "MSagent_parameters" table
  10009. create procedure sp_add_agent_parameter (
  10010.     @profile_id int,
  10011.     @parameter_name         sysname,
  10012.     @parameter_value        nvarchar(255)
  10013. )
  10014. as
  10015.     declare @slash_parameter_name sysname
  10016.     declare @dash_parameter_name sysname
  10017.     declare @retcode int
  10018.     
  10019.     set nocount on
  10020.  
  10021.     select @parameter_name = RTRIM(@parameter_name)
  10022.  
  10023.     -- Append leading '-' when not given
  10024.     if (substring(@parameter_name, 1, 1) <> '/' and 
  10025.         substring(@parameter_name, 1, 1) <> '-')
  10026.     BEGIN
  10027.         select @parameter_name = N'-' + @parameter_name
  10028.     END
  10029.  
  10030.     -- Call proc to validate parameter value
  10031.     exec @retcode = dbo.sp_MSvalidate_agent_parameter 
  10032.                         @profile_id = @profile_id, 
  10033.                         @parameter_name = @parameter_name,
  10034.                         @parameter_value = @parameter_value
  10035.     if @retcode <> 0
  10036.         RETURN(1)
  10037.  
  10038.  
  10039.     select @slash_parameter_name = lower(stuff(@parameter_name, 1, 1, N'/'))
  10040.     select @dash_parameter_name = lower(stuff(@parameter_name, 1, 1, N'-'))
  10041.      
  10042.  
  10043.     /* A parameter may be defined only once per profile */
  10044.     if exists ( select * from msdb..MSagent_parameters 
  10045.             where profile_id = @profile_id
  10046.             and (@slash_parameter_name = lower(parameter_name) collate database_default 
  10047.             or @dash_parameter_name = lower(parameter_name) collate database_default))
  10048.     BEGIN
  10049.         RAISERROR (20067, 16, -1, @parameter_name)  -- The parameter name ''%s'' already exists for the specified profile
  10050.         RETURN (1)
  10051.     END
  10052.  
  10053.     insert into msdb..MSagent_parameters
  10054.     values (@profile_id, @parameter_name, @parameter_value) ;
  10055.  
  10056.     if @@error <> 0
  10057.         return(1)
  10058. GO
  10059.  
  10060. raiserror('Creating procedure sp_change_agent_parameter', 0,1)
  10061. go
  10062. -- Change one parameter of a profile from the MSagent_parameters table
  10063. create procedure sp_change_agent_parameter(
  10064.     @profile_id int,
  10065.     @parameter_name         sysname,
  10066.     @parameter_value        nvarchar(255)
  10067. )AS
  10068.     declare @slash_parameter_name sysname
  10069.     declare @dash_parameter_name sysname
  10070.     declare @retcode int
  10071.  
  10072.     select @parameter_name = LTRIM(RTRIM(@parameter_name))
  10073.     select @parameter_value = LTRIM(RTRIM(@parameter_value))
  10074.  
  10075.     -- DMO sends in empty sting as '(null)'.
  10076.     if @parameter_value = N'(null)'
  10077.         select @parameter_value = N''
  10078.  
  10079.     -- Append leading '-' when not given
  10080.     if (substring(@parameter_name, 1, 1) <> '/' and 
  10081.         substring(@parameter_name, 1, 1) <> '-')
  10082.     BEGIN
  10083.         select @parameter_name = N'-' + @parameter_name
  10084.     END
  10085.  
  10086.     -- Call proc to validate parameter value
  10087.     exec @retcode = dbo.sp_MSvalidate_agent_parameter 
  10088.                         @profile_id = @profile_id, 
  10089.                         @parameter_name = @parameter_name,
  10090.                         @parameter_value = @parameter_value
  10091.     if @retcode <> 0
  10092.         RETURN(1)
  10093.  
  10094.  
  10095.     select @slash_parameter_name = lower(stuff(@parameter_name, 1, 1, N'/'))
  10096.     select @dash_parameter_name = lower(stuff(@parameter_name, 1, 1, N'-'))
  10097.    
  10098.     IF exists ( select * from msdb..MSagent_parameters 
  10099.             where profile_id = @profile_id and 
  10100.                 (@slash_parameter_name = lower(parameter_name) collate database_default or
  10101.                  @dash_parameter_name = lower(parameter_name) collate database_default))
  10102.     BEGIN
  10103.         update msdb..MSagent_parameters set value = @parameter_value where 
  10104.             profile_id = @profile_id and 
  10105.             (@slash_parameter_name = lower(parameter_name) collate database_default or
  10106.             @dash_parameter_name = lower(parameter_name) collate database_default) 
  10107.  
  10108.         if @@error <> 0
  10109.             return(1)
  10110.     END
  10111. GO
  10112.  
  10113. raiserror('Creating procedure sp_change_agent_profile', 0,1)
  10114. go
  10115. -- Change one parameter of a profile from the MSagent_profiles table
  10116. create procedure sp_change_agent_profile(
  10117.     @profile_id         int,
  10118.     @property           sysname,
  10119.     @value              nvarchar(3000)
  10120. )AS
  10121.  
  10122.     IF lower(@property) not in ('description')
  10123.     BEGIN
  10124.         RAISERROR(21183, 16, -1, @property)
  10125.         RETURN (1)
  10126.     END
  10127.  
  10128.     IF exists ( select * from msdb..MSagent_profiles where profile_id = @profile_id)
  10129.     BEGIN
  10130.         update msdb..MSagent_profiles set description = @value where profile_id = @profile_id
  10131.         if @@error <> 0
  10132.             return(1)
  10133.     END
  10134. GO
  10135.  
  10136.  
  10137. raiserror('Creating procedure sp_help_agent_parameter', 0,1)
  10138. go
  10139. -- View all the parameters of a profile from the MSagent_parameters table
  10140. create procedure sp_help_agent_parameter(
  10141.     @profile_id     int = -1
  10142. )
  10143. as
  10144.     set nocount on
  10145.     
  10146.     if @profile_id = -1
  10147.     begin   
  10148.         select profile_id, parameter_name, value
  10149.         from msdb..MSagent_parameters
  10150.         order by profile_id, parameter_name
  10151.     end
  10152.     else
  10153.     begin
  10154.         select profile_id, parameter_name, value
  10155.         from msdb..MSagent_parameters
  10156.         where profile_id = @profile_id
  10157.         order by profile_id, parameter_name
  10158.     end
  10159. GO
  10160.  
  10161. raiserror('Creating procedure sp_MShelp_distdb', 0,1)
  10162. go
  10163.  
  10164. -- Called by the distribution agent to find the dist. db of a dist. publisher
  10165. create procedure sp_MShelp_distdb (     
  10166.     @publisher_name     sysname
  10167. )
  10168. as
  10169. if exists (select name from msdb..sysobjects where name = 'MSdistpublishers')
  10170. begin
  10171.     select distribution_db from msdb..MSdistpublishers
  10172.     where UPPER(name) = UPPER(@publisher_name) collate database_default
  10173. end
  10174. else 
  10175.     select NULL where 1=2   /* We still want an empty rowset for some agents */
  10176. GO
  10177.  
  10178. dump tran master with no_log
  10179. GO
  10180.  
  10181. raiserror('Creating procedure sp_MSupdate_replication_status', 0,1)
  10182. go
  10183. create procedure sp_MSupdate_replication_status
  10184. @publisher sysname,
  10185. @publisher_db sysname,
  10186. @publication sysname,
  10187. @publication_type int = 0,      -- 0 Transactional/Snapshot 1 Merge
  10188. @agent_type int,
  10189. @agent_name nvarchar(100),
  10190. @status int
  10191. as
  10192.  
  10193.     declare @deleted int
  10194.     declare @refresh int
  10195.     declare @getstatus int
  10196.     declare @dummy int
  10197.  
  10198.     set @deleted = -1
  10199.     set @refresh = -2            -- Status used to only update the timestamp column
  10200.     set @getstatus = -3            -- Get status of agent for dummy distribution row
  10201.  
  10202.  
  10203.     -- if table dne, then we're just installing distribution so we don't need to update status
  10204.     if (select object_id('tempdb.dbo.MSreplication_agent_status')) is NULL
  10205.         return 0
  10206.  
  10207.     -- If there are not rows in the table, we know that it is not loaded or used
  10208.     -- No need to refresh (better performance)
  10209.     -- At least, there will on row if loaded (see sp_MSload_replication_status)
  10210.     if not exists (select * from tempdb.dbo.MSreplication_agent_status)
  10211.         return 0
  10212.  
  10213.     if @status = @getstatus
  10214.     begin
  10215.         select @status = isnull(status, 0) from tempdb.dbo.MSreplication_agent_status where
  10216.             UPPER(publisher) = UPPER(@publisher) and
  10217.             publisher_db = @publisher_db and
  10218.             publication = 'ALL' and
  10219.             agent_type = @agent_type
  10220.     end            
  10221.  
  10222.     -- Update timestamp column via dummy update
  10223.     if @status = @refresh
  10224.     begin
  10225.         -- Dummy update to force timestamps to be updated.
  10226.         update tempdb.dbo.MSreplication_agent_status set status = status where
  10227.             UPPER(publisher) = UPPER(@publisher) and
  10228.             publisher_db = @publisher_db and
  10229.             publication like @publication -- Must use like as publication may be "%"
  10230.         return (0)
  10231.     end
  10232.  
  10233.     -- Remove row if @deleted
  10234.     if @status = @deleted
  10235.     begin
  10236.         if @@trancount > 0
  10237.         begin
  10238.             if exists (select * from tempdb.dbo.MSreplication_agent_status with (TABLOCKX) where 1 = 1)
  10239.             begin
  10240.                 select @dummy = 1
  10241.             end
  10242.         end        
  10243.  
  10244.         if @agent_name = '%'
  10245.             delete from tempdb.dbo.MSreplication_agent_status with (TABLOCKX) where
  10246.                 UPPER(publisher) = UPPER(@publisher) and
  10247.                 publisher_db = @publisher_db and
  10248.                 publication = @publication and
  10249.                 agent_type = @agent_type 
  10250.         else if @agent_name = NULL    -- Special case when all agents of the type are dropped
  10251.             delete from tempdb.dbo.MSreplication_agent_status with (TABLOCKX) where
  10252.                 UPPER(publisher) = UPPER(@publisher) and
  10253.                 publisher_db = @publisher_db and
  10254.                 publication = @publication and
  10255.                 agent_type = @agent_type
  10256.         else
  10257.             delete from tempdb.dbo.MSreplication_agent_status with (TABLOCKX) where
  10258.                 UPPER(publisher) = UPPER(@publisher) and
  10259.                 publisher_db = @publisher_db and
  10260.                 publication = @publication and
  10261.                 agent_type = @agent_type and
  10262.                 agent_name = @agent_name
  10263.  
  10264.         -- Dummy update to force timestamps to be updated.  This will signal a row has been
  10265.         -- removed.
  10266.         update tempdb.dbo.MSreplication_agent_status set status = status where
  10267.             UPPER(publisher) = UPPER(@publisher) and
  10268.             publisher_db = @publisher_db and
  10269.             publication = @publication
  10270.         return (0)
  10271.     end     
  10272.  
  10273.     -- If misc. replication job then the status needs to be mapped.
  10274.     if @agent_type = 5
  10275.     begin
  10276.         set @status = 
  10277.         case isnull(@status,5)    -- mapped to never run
  10278.             when 0 then 5   -- Fail mapping
  10279.             when 1 then 2   -- Success mapping
  10280.             when 2 then 5   -- Retry mapping
  10281.             when 3 then 2   -- Shutdown mapping
  10282.             when 4 then 3   -- Inprogress mapping
  10283.             when 5 then 0   -- Unknown is mapped to never run
  10284.         end
  10285.     end
  10286.  
  10287.     if not exists (select * from tempdb.dbo.MSreplication_agent_status where 
  10288.         UPPER(publisher) = UPPER(@publisher) and
  10289.         publisher_db = @publisher_db and
  10290.         publication = @publication and
  10291.         agent_type = @agent_type and
  10292.         agent_name = @agent_name)
  10293.         begin
  10294.             if @@trancount > 0
  10295.             begin
  10296.                 if exists (select * from tempdb.dbo.MSreplication_agent_status with (TABLOCKX) where 1 = 1)
  10297.                 begin
  10298.                     select @dummy = 1
  10299.                 end
  10300.             end
  10301.  
  10302.             insert into tempdb.dbo.MSreplication_agent_status 
  10303.                 (publisher, publisher_db, publication, publication_type, agent_type, status, agent_name) values
  10304.                 (@publisher, @publisher_db, @publication, @publication_type, @agent_type, @status, @agent_name)
  10305.             -- Dummy update to force timestamps to be updated.  This will signal a row has been
  10306.             -- added.
  10307.             update tempdb.dbo.MSreplication_agent_status set status = status where
  10308.                 UPPER(publisher) = UPPER(@publisher) and
  10309.                 publisher_db = @publisher_db and
  10310.                 publication = @publication
  10311.         end
  10312.     else
  10313.         begin
  10314.             update tempdb.dbo.MSreplication_agent_status set status = @status where
  10315.                 UPPER(publisher) = UPPER(@publisher) and
  10316.                 publisher_db = @publisher_db and
  10317.                 (publication = @publication or @publication = 'ALL')and
  10318.                 agent_type = @agent_type and
  10319.                 agent_name = @agent_name
  10320.         end                 
  10321.  
  10322.     return (0)
  10323. go
  10324.  
  10325. raiserror('Creating procedure sp_MSenum_misc_agents', 0,1)
  10326. go
  10327. create procedure sp_MSenum_misc_agents
  10328. as
  10329.     SET NOCOUNT ON
  10330.  
  10331.     declare @timestamp timestamp
  10332.  
  10333.     -- Not supported, but returned to be consistent with other sp_MSenum_replication_agent
  10334.     -- result set.
  10335.     set @timestamp = 0
  10336.  
  10337.     select j.name, 'agent_type' = c.name,
  10338.             'status' = case isnull(jh.run_status, 5) -- mapped to never run
  10339.                 when 0 then 5   -- Fail mapping
  10340.                 when 1 then 2   -- Success mapping
  10341.                 when 2 then 5   -- Retry mapping
  10342.                 when 3 then 2   -- Shutdown mapping
  10343.                 when 4 then 3   -- Inprogress mapping
  10344.                 when 5 then 0   -- Unknown is mapped to never run
  10345.             end,
  10346.             jh.message, 'start_time' = convert(nvarchar(8), jh.run_date) + N' ' +
  10347.                                        stuff(stuff(right(convert(nvarchar(7), jh.run_time + 1000000), 6), 5, 0, N':'), 3, 0, N':') + 
  10348.                                        + N'.000',
  10349.             jh.run_duration, 
  10350.             'job_id' = convert(binary(16), j.job_id), 'local_timestamp' = @timestamp from 
  10351.                 msdb..sysjobs j
  10352.             LEFT OUTER JOIN msdb..sysjobhistory jh ON
  10353.             j.job_id = jh.job_id and 
  10354.             jh.instance_id = (select max(instance_id) from msdb..sysjobhistory jh2 where
  10355.                 jh2.job_id = j.job_id)
  10356.             INNER JOIN msdb..syscategories c ON
  10357.             j.category_id = c.category_id
  10358.             where j.category_id in (11, 12,16,17,18)
  10359.  
  10360.     order by j.job_id asc
  10361. go 
  10362.  
  10363. raiserror('Creating procedure sp_MSload_replication_status', 0,1)
  10364. go
  10365.  
  10366. create procedure sp_MSload_replication_status
  10367. as
  10368.     set nocount on
  10369.  
  10370.     declare @db_name sysname
  10371.     declare @distbit int
  10372.     declare @retcode int
  10373.  
  10374.     select @distbit = 16
  10375.     select @retcode = 0
  10376.  
  10377.     -- Flush out all current rows
  10378.     delete tempdb.dbo.MSreplication_agent_status
  10379.  
  10380.     -- Load misc. replication jobs status and map SQL Agent status to replication status
  10381.     -- If users delete all misc repl jobs, the status table may not be updated
  10382.     -- see sp_MSupdate_replication_status
  10383.     insert into tempdb.dbo.MSreplication_agent_status 
  10384.         select '', '', '', -1, 5, 
  10385.             case isnull(jh.run_status,5) -- mapped to never run
  10386.                 when 0 then 5   -- Fail mapping
  10387.                 when 1 then 2   -- Success mapping
  10388.                 when 2 then 5   -- Retry mapping
  10389.                 when 3 then 2   -- Shutdown mapping
  10390.                 when 4 then 3   -- Inprogress mapping
  10391.                 when 5 then 0   -- Unknown is mapped to never run
  10392.             end,
  10393.             j.name, NULL from msdb..sysjobs j
  10394.             LEFT OUTER JOIN msdb..sysjobhistory jh ON
  10395.             j.job_id = jh.job_id and 
  10396.             jh.instance_id = (select max(instance_id) from msdb..sysjobhistory jh2 where
  10397.                 jh2.job_id = j.job_id)
  10398.             where j.category_id in (11,12,16,17,18)
  10399.     if @@error <> 0
  10400.         return 1
  10401.  
  10402.     declare hCdatabase CURSOR LOCAL FAST_FORWARD FOR
  10403.         select name from master.dbo.sysdatabases 
  10404.             where
  10405.             category & @distbit <> 0 and
  10406.             has_dbaccess(name) = 1
  10407.         for read only
  10408.  
  10409.     open hCdatabase
  10410.     fetch next from hCdatabase into @db_name
  10411.     while (@@fetch_status <> -1)
  10412.     begin
  10413.  
  10414.         insert into tempdb.dbo.MSreplication_agent_status 
  10415.             (publisher, publisher_db, publication, publication_type, agent_type, status, agent_name)
  10416.             exec (@db_name + '.dbo.sp_MSenum_replication_status')
  10417.  
  10418.         fetch next from hCdatabase into @db_name
  10419.     end
  10420.         
  10421. DONE:
  10422.     close hCdatabase
  10423.     deallocate hCdatabase
  10424.  
  10425.  
  10426.     -- Add and initialize Perfmon SQL Replication Agents instances
  10427.     exec @retcode = dbo.sp_MSinit_replication_perfmon
  10428.     if @retcode <> 0 or @@error <> 0
  10429.         return 1
  10430.  
  10431. GO
  10432.  
  10433. raiserror('Creating procedure sp_MScreate_replication_status_table', 0,1)
  10434. go
  10435. create proc sp_MScreate_replication_status_table
  10436. as
  10437.     declare @retcode int
  10438.  
  10439.     if (select object_id('tempdb.dbo.MSreplication_agent_status')) is NULL
  10440.     begin
  10441.         -- begin tran
  10442.         create table tempdb.dbo.MSreplication_agent_status (
  10443.             publisher sysname NOT NULL,
  10444.             publisher_db sysname NOT NULL,
  10445.             publication sysname NOT NULL,
  10446.             publication_type int NOT NULL,          -- 0 transactional/snapshot  1 Merge
  10447.             agent_type int NOT NULL,
  10448.             status int NOT NULL,
  10449.             agent_name nvarchar(100) NOT NULL,
  10450.             timestamp NOT NULL,
  10451.             CONSTRAINT pk_MSrepl PRIMARY KEY (timestamp, agent_type)
  10452.             )
  10453.         if @@error <> 0
  10454.             return 1
  10455.         
  10456.         create nonclustered index uncMSreplication_agent_status ON 
  10457.             tempdb.dbo.MSreplication_agent_status (status, publisher, publisher_db, publication, agent_type)
  10458.         
  10459.         if @@error <> 0
  10460.             return 1
  10461.     end
  10462.     return 0  -- If here, all is well and we're done.
  10463. go
  10464.  
  10465. raiserror('Creating procedure sp_MShelp_replication_status', 0,1)
  10466. go
  10467.  
  10468. create procedure sp_MShelp_replication_status (
  10469.     @publisher sysname = '%',
  10470.     @publisher_db sysname = '%',
  10471.     @publication sysname = '%',
  10472.     @agent_type int = 0,
  10473.     @exclude_anonymous bit = 0
  10474.     )
  10475. as
  10476. begin
  10477.     --set transaction isolation level read uncommitted
  10478.     
  10479.     declare @retcode int
  10480.             ,@max_status int
  10481.             ,@max_timestamp timestamp
  10482.             ,@publication_type int
  10483.             ,@all_status int
  10484.             ,@all_timestamp timestamp
  10485.             ,@distdbname sysname
  10486.             ,@anonymous_mask int
  10487.             ,@anonymous_bit_when_hide int
  10488.             ,@anonymous_bit_when_show int
  10489.             
  10490.     select @anonymous_mask = 0x80000000
  10491.     if @exclude_anonymous = 0
  10492.     begin
  10493.         select @anonymous_bit_when_hide = 0x00000000
  10494.                 ,@anonymous_bit_when_show = 0x80000000
  10495.     end
  10496.     else
  10497.     begin
  10498.         select @anonymous_bit_when_hide = 0x80000000
  10499.                 ,@anonymous_bit_when_show = 0x00000000
  10500.     end
  10501.  
  10502.     -- If the local distributor is not installed, we return nothing rather than
  10503.     -- fail with table not exists error.
  10504.     if (select object_id('tempdb.dbo.MSreplication_agent_status')) is NULL
  10505.         return 0
  10506.  
  10507.     -- If the temporary status table is empty populate it.
  10508.     -- If populated, there should be at lease history cleanup task.
  10509.     if not exists (select * from tempdb.dbo.MSreplication_agent_status)
  10510.     begin                                           
  10511.         exec @retcode = dbo.sp_MSload_replication_status
  10512.         if @@error <> 0
  10513.             return 1
  10514.     end
  10515.  
  10516.     
  10517.     -- @agent_type is only supported with all wildcards
  10518.     if @agent_type <> 0 and (@publisher <> '%' or @publisher_db <> '%' or @publication <> '%')
  10519.         return 1
  10520.     
  10521.     if @publisher = '%'
  10522.     begin
  10523.         -- @agent_type = 0 returns status of all agents including the misc. agents.
  10524.         -- @agent_type = -1 returns status of all agents except misc. agents.
  10525.         if @agent_type = 0 or @agent_type = -1
  10526.         begin
  10527.             select @max_status = max(status), @max_timestamp = max(timestamp) 
  10528.             from tempdb.dbo.MSreplication_agent_status (NOLOCK)
  10529.                 where ((@agent_type = -1 and agent_type <> 5) or
  10530.                       @agent_type = 0) and 
  10531.                       -- Filter out anonymous if needed
  10532.                       agent_type & @anonymous_bit_when_hide = 0
  10533.         end
  10534.         else
  10535.         begin
  10536.             select @max_status = max(status), @max_timestamp = max(timestamp) 
  10537.             from tempdb.dbo.MSreplication_agent_status (NOLOCK) 
  10538.             where
  10539.                 -- Turn off the anonymous bit when showing
  10540.                 agent_type & ~@anonymous_bit_when_show = @agent_type
  10541.         end
  10542.     end
  10543.     else if @publication = '%'
  10544.     begin
  10545.         select @max_status = max(status), @max_timestamp = max(timestamp)
  10546.         from tempdb.dbo.MSreplication_agent_status (NOLOCK) 
  10547.         where UPPER(publisher) = UPPER(@publisher) and 
  10548.               -- Filter out anonymous if needed
  10549.               agent_type & @anonymous_bit_when_hide = 0
  10550. --          publisher_db = @publisher_db 
  10551.  
  10552.         --
  10553.         -- Process the Queue reader entry separately and check if we need to pick them
  10554.         --
  10555.            select @distdbname = distribution_db 
  10556.                 from msdb.dbo.MSdistpublishers where name = @publisher collate database_default
  10557.         
  10558.         select @all_status = status, @all_timestamp = timestamp 
  10559.         from tempdb.dbo.MSreplication_agent_status (NOLOCK) 
  10560.         where agent_type = 9 and publisher = @@servername and publisher_db = @distdbname
  10561.  
  10562.         if @all_status > @max_status
  10563.             select @max_status = @all_status
  10564.  
  10565.         if @all_timestamp > @max_timestamp
  10566.             select @max_timestamp = @all_timestamp
  10567.     end
  10568.     else if @publication <> '%'
  10569.     begin
  10570.         select top 1 @max_status = status from tempdb.dbo.MSreplication_agent_status (NOLOCK) where
  10571.             UPPER(publisher) = UPPER(@publisher) and
  10572.             publisher_db = @publisher_db and
  10573.             publication = @publication  and 
  10574.             -- Filter out anonymous if needed
  10575.             agent_type & @anonymous_bit_when_hide = 0
  10576.             order by status desc
  10577.         
  10578.         -- Get publication type from the Snapshot agent of the Publication. This used to determine
  10579.         -- if the Logreader status should be included.
  10580.         select @publication_type = publication_type from tempdb.dbo.MSreplication_agent_status (NOLOCK) where
  10581.             UPPER(publisher) = UPPER(@publisher) and
  10582.             publisher_db = @publisher_db and
  10583.             publication = @publication and
  10584.             agent_type = 1    -- Snapshot agent
  10585.  
  10586.         select @max_timestamp = max(timestamp) from tempdb.dbo.MSreplication_agent_status (NOLOCK) where
  10587.             UPPER(publisher) = UPPER(@publisher) and
  10588.             publisher_db = @publisher_db and
  10589.             publication = @publication  and 
  10590.             -- Filter out anonymous if needed
  10591.             agent_type & @anonymous_bit_when_hide = 0
  10592.  
  10593.         -- If publication_type = 0 then transactional and must include the Logreader
  10594.         -- with publication = 'ALL'
  10595.         if @publication_type = 0
  10596.         begin
  10597.             select @all_status = status, @all_timestamp = timestamp 
  10598.             from tempdb.dbo.MSreplication_agent_status (NOLOCK) 
  10599.             where
  10600.                 UPPER(publisher) = UPPER(@publisher) and
  10601.                 publisher_db = @publisher_db and
  10602.                 publication = 'ALL' and
  10603.                 agent_type = 2 --Logreader
  10604.  
  10605.             if @all_status > @max_status
  10606.                 select @max_status = @all_status
  10607.  
  10608.             if @all_timestamp > @max_timestamp
  10609.                 select @max_timestamp = @all_timestamp
  10610.  
  10611.             --
  10612.             -- Process the Queue reader entry separately and check if we need to pick them
  10613.             --
  10614.                select @distdbname = distribution_db 
  10615.                     from msdb.dbo.MSdistpublishers where name = @publisher collate database_default
  10616.             
  10617.             declare @proc nvarchar(512)
  10618.                     ,@allow_queued_tran bit
  10619.                     
  10620.             SELECT @proc = quotename(@distdbname) + N'.dbo.sp_MSispublicationqueued'
  10621.             exec @retcode = @proc
  10622.                 @publisher = @publisher
  10623.                 ,@publisher_db = @publisher_db
  10624.                 ,@publication = @publication
  10625.                 ,@allow_queued_tran = @allow_queued_tran output
  10626.             if (@retcode != 0 and @@error != 0)
  10627.                 return 1
  10628.  
  10629.             if (@allow_queued_tran = 1)
  10630.             begin
  10631.                 select @all_status = status, @all_timestamp = timestamp
  10632.                 from tempdb.dbo.MSreplication_agent_status (NOLOCK) 
  10633.                 where agent_type = 9 and publisher = @@servername and publisher_db = @distdbname
  10634.  
  10635.                 if @all_status > @max_status
  10636.                     select @max_status = @all_status 
  10637.  
  10638.                 if @all_timestamp > @max_timestamp
  10639.                     select @max_timestamp = @all_timestamp
  10640.             end
  10641.         end
  10642.     end
  10643.  
  10644.     -- Return result set
  10645.     select 'status' = isnull(@max_status, 0), 'timestamp' = isnull (@max_timestamp, 0)
  10646.  
  10647.     --set transaction isolation level read committed
  10648.     return (0)
  10649. end
  10650. go
  10651.  
  10652. raiserror('Creating procedure sp_MSenum_replication_agents', 0,1)
  10653. go
  10654. create procedure sp_MSenum_replication_agents
  10655. @type int,
  10656. @exclude_anonymous bit = 0,
  10657. @check_user bit = 0
  10658. as
  10659.     set nocount on
  10660.     --set transaction isolation level read uncommitted
  10661.  
  10662.     declare @snapshot int
  10663.     declare @logreader int
  10664.     declare @distribution int
  10665.     declare @sproc sysname
  10666.     declare @db_name sysname
  10667.     declare @table_name sysname
  10668.     declare @cmd nvarchar(255)
  10669.     declare @distbit int
  10670.     declare @merge int
  10671.     declare @misc int
  10672.     declare @qreader int
  10673.  
  10674.     select @distbit = 16
  10675.  
  10676.     select @snapshot = 1
  10677.     select @logreader = 2
  10678.     select @distribution = 3
  10679.     select @merge = 4
  10680.     select @misc = 5
  10681.     select @qreader = 9
  10682.  
  10683.     if @type = @misc
  10684.     begin
  10685.         exec dbo.sp_MSenum_misc_agents
  10686.         return 0
  10687.     end
  10688.  
  10689.     if @type = @snapshot
  10690.     begin
  10691.         select @sproc = 'sp_MSenum_snapshot'
  10692.         create table #snapshot (dbname sysname collate database_default not null, name nvarchar(100) collate database_default not null, 
  10693.             status int NOT NULL,
  10694.             publisher sysname collate database_default not null, publisher_db sysname collate database_default not null, 
  10695.             publication sysname collate database_default not null,
  10696.             start_time nvarchar(24) collate database_default null, time nvarchar(24) collate database_default null, duration int NULL,
  10697.             comments nvarchar(255) collate database_default null, delivered_transactions int NULL, 
  10698.             delivered_commands int NULL, delivery_rate float NULL, error_id INT NULL,
  10699.             job_id binary(16) NULL, local_job bit NULL, profile_id int NOT NULL, 
  10700.             agent_id int NOT NULL, local_timestamp binary(8) NOT NULL)
  10701.  
  10702.         create unique clustered index ucsnapshot ON #snapshot (job_id)
  10703.  
  10704.         select @table_name = '#snapshot'
  10705.     end
  10706.     else if @type = @logreader
  10707.     begin
  10708.         select @sproc = 'sp_MSenum_logreader'
  10709.         create table #logreader (dbname sysname collate database_default not null, name nvarchar(100) collate database_default not null,  
  10710.             status int NOT NULL,
  10711.             publisher sysname collate database_default not null, publisher_db sysname collate database_default not null,
  10712.             start_time nvarchar(24) collate database_default null, time nvarchar(24) collate database_default null, duration int NULL,
  10713.             comments nvarchar(255) collate database_default null, delivery_time int NULL, 
  10714.             delivered_transactions int NULL, delivered_commands int NULL, 
  10715.             average_commands int NULL, delivery_rate int NULL, delivery_latency int NULL, 
  10716.             error_id INT NULL, job_id binary(16) NULL, local_job bit NULL,
  10717.             profile_id int NOT NULL, agent_id int NOT NULL, local_timestamp binary(8) NOT NULL)
  10718.  
  10719.         create unique clustered index uclogreader ON #logreader (job_id)
  10720.  
  10721.         select @table_name = '#logreader'
  10722.     end
  10723.     else if @type = @distribution
  10724.     begin
  10725.         select @sproc = 'sp_MSenum_distribution'
  10726.         create table #distribution (dbname sysname collate database_default not null, 
  10727.             name nvarchar(100) collate database_default not null,  
  10728.             status int NOT NULL,
  10729.             publisher sysname collate database_default not null, publisher_db sysname collate database_default not null, 
  10730.             publication sysname collate database_default null,
  10731.             subscriber sysname collate database_default null, subscriber_db sysname collate database_default null, subscription_type int NULL,
  10732.             start_time nvarchar(24) collate database_default null, time nvarchar(24) collate database_default null, duration int NULL,
  10733.             comments nvarchar(255) NULL, delivery_time int NULL, 
  10734.             delivered_transactions int NULL, delivered_commands int NULL, 
  10735.             average_commands int NULL, delivery_rate int NULL, 
  10736.             delivery_latency int NULL, error_id INT NULL,
  10737.             job_id binary(16) NULL, local_job bit NULL, profile_id int NOT NULL, 
  10738.             agent_id int NOT NULL, local_timestamp binary(8) NOT NULL, 
  10739.             offload_enabled bit NOT NULL, offload_server sysname collate database_default null,
  10740.             subscriber_type tinyint NULL)
  10741.  
  10742.         create unique clustered index ucdistribution ON #distribution (job_id)
  10743.  
  10744.         select @table_name = '#distribution'
  10745.     end
  10746.     else if @type = @merge
  10747.     begin
  10748.         select @sproc = 'sp_MSenum_merge'
  10749.         create table #merge (dbname sysname collate database_default not null, name nvarchar(100) collate database_default not null, 
  10750.             status int NOT NULL,
  10751.             publisher sysname collate database_default not null, publisher_db sysname collate database_default not null, publication sysname collate database_default null,
  10752.             subscriber sysname collate database_default null, subscriber_db sysname collate database_default null, subscription_type int NULL,
  10753.             start_time nvarchar(24) collate database_default null, time nvarchar(24) collate database_default null, duration int NULL, 
  10754.             comments nvarchar(255) NULL, delivery_rate int NULL,
  10755.             publisher_insertcount int NULL, publisher_updatecount int NULL, publisher_deletecount int NULL,
  10756.             publisher_conficts int NULL, 
  10757.             subscriber_insertcount int NULL, subscriber_updatecount int NULL, subscriber_deletecount int NULL,
  10758.             subscriber_conficts int NULL, error_id int NULL, job_id binary(16) NULL,
  10759.             local_job bit NULL, profile_id int NOT NULL, agent_id int NOT NULL, 
  10760.             local_timestamp binary(8) NOT NULL, offload_enabled bit NOT NULL, 
  10761.             offload_server sysname collate database_default null, subscriber_type tinyint NULL)
  10762.  
  10763.         create unique clustered index ucmerge ON #merge (job_id)
  10764.  
  10765.  
  10766.         select @table_name = '#merge'
  10767.     end
  10768.     else if @type = @qreader
  10769.     begin
  10770.         select @sproc = 'sp_MSenum_qreader'
  10771.         create table #qreader (dbname sysname collate database_default not null, 
  10772.             name nvarchar(100) collate database_default not null, status int NOT NULL,
  10773.             start_time nvarchar(24) collate database_default null, time nvarchar(24) collate database_default null, duration int NULL,
  10774.             comments nvarchar(255) collate database_default null, 
  10775.             transactions_processed int NULL, commands_processed int NULL, 
  10776.             average_commands int NULL, delivery_rate int NULL, delivery_latency int NULL,
  10777.             error_id INT NULL, job_id binary(16) NULL, 
  10778.             profile_id int NULL, agent_id int NOT NULL, local_timestamp binary(8) NOT NULL)
  10779.  
  10780.         create unique clustered index ucqreader ON #qreader (job_id)
  10781.  
  10782.         select @table_name = '#qreader'
  10783.     end
  10784.  
  10785.     declare hCdatabase CURSOR LOCAL FAST_FORWARD FOR
  10786.         select name from master.dbo.sysdatabases 
  10787.             where
  10788.             category & @distbit <> 0 and
  10789.             has_dbaccess(name) = 1
  10790.     for read only
  10791.  
  10792.     open hCdatabase
  10793.     fetch next from hCdatabase into @db_name
  10794.     while (@@fetch_status <> -1)
  10795.     begin
  10796.         
  10797.         -- Check to see if the user has permision to monitor the distribution 
  10798.         -- database.
  10799.         declare @has_pm bit
  10800.         select @cmd = quotename(@db_name) + '.dbo.sp_executesql'
  10801.         exec @cmd
  10802.             N'if is_member(N''db_owner'') = 1 or is_member(N''replmonitor'') = 1 set @has_pm = 1', 
  10803.             N'@has_pm bit output',
  10804.             @has_pm output
  10805.         if @has_pm = 1
  10806.         begin
  10807.             if @check_user = 1
  10808.             begin
  10809.                 select 'is_replmonitor' = 1
  10810.                 return
  10811.             end
  10812.             else
  10813.             begin
  10814.                 select @cmd = 'insert into ' + @table_name +
  10815.                     ' exec ' + quotename(@db_name) + '.dbo.' + @sproc + ' @show_distdb = 1' 
  10816.                     
  10817.                 if @type in (@distribution, @merge)
  10818.                     select @cmd = @cmd +
  10819.                         ', @exclude_anonymous = ' + cast(@exclude_anonymous as nvarchar(1))
  10820.  
  10821.                 exec (@cmd)
  10822.             end
  10823.         end
  10824.         fetch next from hCdatabase into @db_name
  10825.     end
  10826.     close hCdatabase
  10827.     deallocate hCdatabase
  10828.  
  10829.     -- Don't return agents if in check user mode
  10830.     if @check_user = 1
  10831.         return
  10832.  
  10833.  
  10834.     select @cmd = 'select * from ' + @table_name + ' order by job_id asc'
  10835.     exec (@cmd)
  10836.  
  10837.     -- Drop the table
  10838.     select @cmd = 'drop table ' + @table_name
  10839.     exec (@cmd)
  10840.     --set transaction isolation level read committed
  10841.  
  10842. GO
  10843.  
  10844. raiserror('Creating procedure sp_replication_agent_checkup', 0,1)
  10845. go
  10846. create procedure sp_replication_agent_checkup
  10847. @heartbeat_interval int = 10        -- minutes
  10848. as
  10849.     declare @distribution_db sysname
  10850.     declare @retstatus int
  10851.     declare @proc nvarchar(255)
  10852.     declare @retcode int
  10853.  
  10854.     declare hCdistdbs CURSOR LOCAL FAST_FORWARD for
  10855.         select name from msdb..MSdistributiondbs where 
  10856.             has_dbaccess(name) = 1
  10857.     for read only
  10858.     open hCdistdbs
  10859.     fetch hCdistdbs into @distribution_db
  10860.     while @@fetch_status <> -1
  10861.     begin
  10862.         select @proc = @distribution_db + '.dbo.sp_MSagent_stethoscope'
  10863.         execute  @retcode = @proc @heartbeat_interval
  10864.         if @@error <> 0 or @retcode <> 0
  10865.         begin
  10866.             select @retstatus = 1
  10867.             goto UNDO
  10868.         end
  10869.         fetch hCdistdbs into @distribution_db
  10870.     end
  10871.  
  10872.     set @retstatus = 0
  10873.  
  10874. UNDO:
  10875.     close hCdistdbs
  10876.     deallocate hCdistdbs
  10877.     return (@retstatus)
  10878. go
  10879.  
  10880. raiserror('Creating procedure sp_MScreate_replication_checkup_agent', 0,1)
  10881. go
  10882. create procedure sp_MScreate_replication_checkup_agent
  10883. @heartbeat_interval int = 10    -- minutes
  10884. as
  10885.     declare @command nvarchar(100)
  10886.     declare @retcode int
  10887.     declare @interval int
  10888.     declare @job_name nvarchar(100)
  10889.     declare @description nvarchar(100)
  10890.     declare @category_name sysname
  10891.  
  10892.     select @command = 'sp_replication_agent_checkup @heartbeat_interval = ' +
  10893.         convert(nvarchar(10), @heartbeat_interval)      
  10894.         
  10895.     -- Create job if it already exists
  10896.     select @job_name = formatmessage(20533)
  10897.  
  10898.     IF EXISTS (SELECT * FROM msdb..sysjobs_view WHERE name = @job_name collate database_default and
  10899.         UPPER(originating_server) = UPPER(CONVERT(NVARCHAR(30), SERVERPROPERTY('ServerName'))))
  10900.     BEGIN
  10901.         EXEC @retcode = msdb.dbo.sp_delete_job  @job_name = @job_name
  10902.         IF @@ERROR <> 0 or @retcode <> 0
  10903.         BEGIN
  10904.             return (1)            
  10905.         END
  10906.     END
  10907.  
  10908.     -- Create new job
  10909.     set @interval = convert(int, @heartbeat_interval)
  10910.     set @description = formatmessage(20534)
  10911.  
  10912.     -- Get Checkup category name (assumes category_id = 16)
  10913.     select @category_name = name FROM msdb.dbo.syscategories where category_id = 16
  10914.     EXECUTE @retcode = dbo.sp_MSadd_repl_job 
  10915.             @name = @job_name,
  10916.             @subsystem = 'TSQL', 
  10917.             @enabled = 1, 
  10918.             @command = @command,
  10919.             @description = @description,
  10920.             @freqtype = 4,
  10921.             @freqinterval = 1,
  10922.             @freqsubtype = 4,
  10923.             @freqsubinterval = @interval,
  10924.             @retryattempts = 0,
  10925.             @category_name = @category_name
  10926.     if @@ERROR <> 0 or @retcode <> 0
  10927.         return (1)
  10928. go
  10929.  
  10930. raiserror('Creating procedure sp_MSenum_replication_job', 0,1)
  10931. go
  10932. create procedure sp_MSenum_replication_job
  10933. @job_id uniqueidentifier
  10934. as
  10935.     SET NOCOUNT ON
  10936.     declare @message nvarchar(1024)
  10937.     declare @retcode int
  10938.     declare @runstatus int
  10939.     declare @date int
  10940.     declare @time int
  10941.  
  10942.     -- Get last message from SQL Agent History table
  10943.     create table #JobHistory (
  10944.         instance_id int NOT NULL, 
  10945.         job_id uniqueidentifier NOT NULL,
  10946.         job_name nvarchar(100) collate database_default not null,
  10947.         step_id int NOT NULL,
  10948.         step_name nvarchar(100) collate database_default not null, 
  10949.         sql_message_id int NOT NULL,
  10950.         sql_severity int NOT NULL,
  10951.         message nvarchar(1024) collate database_default null,
  10952.         run_status int NOT NULL,
  10953.         run_date int NOT NULL,
  10954.         run_time int NOT NULL,
  10955.         run_duration int NOT NULL,
  10956.         operator_emailed sysname collate database_default null,
  10957.         operator_netsent sysname collate database_default null,
  10958.         operator_paged sysname collate database_default null,
  10959.         retries_attempted int NOT NULL,
  10960.         server sysname collate database_default not null
  10961.     )
  10962.     if @@error <> 0
  10963.         return 1
  10964.  
  10965.     -- Insert last history for step_id 1 (Agent running)
  10966.     set rowcount 1
  10967.     insert into #JobHistory exec msdb.dbo.sp_help_jobhistory @job_id = @job_id, @step_id = 1, 
  10968.         @mode = 'FULL'          
  10969.  
  10970.     -- Get the last history
  10971.     select @message = message, @runstatus = run_status, @date = run_date, @time = run_time
  10972.         from #JobHistory
  10973.  
  10974.     -- Reset rowcount
  10975.     set rowcount 0
  10976.  
  10977.     -- Map SQL Agent runstatus to Replication runstatus
  10978.     set @runstatus = 
  10979.     case @runstatus
  10980.         when 0 then 6   -- Fail mapping
  10981.         when 1 then 2   -- Success mapping
  10982.         when 2 then 5   -- Retry mapping
  10983.         when 3 then 2   -- Shutdown mapping
  10984.         when 4 then 3   -- Inprogress mapping
  10985.         when 5 then 0   -- Unknown is mapped to never run
  10986.     end
  10987.  
  10988.     declare @sztime nchar(6)
  10989.     select @sztime = convert(nchar(6), @time)
  10990.  
  10991.     -- If the time is like 53030 (5:30:30), make it 053030
  10992.     if len(@sztime) = 5
  10993.         select @sztime = N'0' + @sztime
  10994.  
  10995.     -- Return status and message
  10996.     select 'runstatus' = isnull(@runstatus, 0), 'message' = @message,  'date' = @date, 
  10997.         'time' = @time, 'datetime' = 
  10998.             -- use this style 20000405 13:05:00.000, refer to sp_MSenumallsubscriptions
  10999.             convert(nchar(8), @date) + N' ' + 
  11000.             substring(@sztime, 1, 2) + N':' +
  11001.             substring(@sztime, 3, 2) + N':' +
  11002.             -- miliseconds are not availible
  11003.             substring(@sztime, 5, 2) + N'.000'
  11004.  
  11005.     drop table #JobHistory
  11006. go 
  11007.  
  11008. raiserror('Creating procedure sp_MSrepl_dbrole', 0,1)
  11009. go
  11010. CREATE PROCEDURE sp_MSrepl_dbrole
  11011.     @rolename       sysname,
  11012.     @loginname      sysname,
  11013.     @operation      nvarchar(10),
  11014.     @is_member      bit = 0 OUTPUT
  11015. AS
  11016.     -- This is an internal stored procedure. 
  11017.     -- If operation is 'add', it will add the login as a user to current database if necessary
  11018.     -- get the user name of the login and add it to the role
  11019.     -- If operation is 'drop', it will drop the user from the role.
  11020.     -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
  11021.     declare @retcode int
  11022.     declare @username sysname
  11023.     declare @sid varbinary(85)
  11024.  
  11025.     select @sid = suser_sid(@loginname)
  11026.  
  11027.     if @operation = 'is_member'
  11028.     begin
  11029.         if exists (select * from sysusers r, sysusers u, sysmembers m where 
  11030.             u.sid = @sid and
  11031.             r.name = @rolename and
  11032.             m.groupuid = r.uid and
  11033.             m.memberuid = u.uid)
  11034.             select @is_member = 1
  11035.         else
  11036.             select @is_member = 0
  11037.         return(0)
  11038.     end
  11039.     
  11040.     -- Add the login to  db  role.
  11041.     if  is_srvrolemember('sysadmin',  @loginname) <> 1
  11042.     begin
  11043.         select @username = name from sysusers where sid = @sid
  11044.         if @operation = 'add'
  11045.         begin
  11046.             if @username is null
  11047.             begin
  11048.                 -- Add the server login to be a user with same name in the database
  11049.                 exec @retcode = dbo.sp_adduser  @loginname
  11050.                 if @retcode<>0 or @@error <> 0
  11051.                     return 1
  11052.                 select @username = @loginname
  11053.             end
  11054.  
  11055.             exec @retcode = dbo.sp_addrolemember @rolename, @username
  11056.             if @@error <> 0 OR @retcode <> 0
  11057.                 return 1
  11058.         end
  11059.         else if @operation = 'drop'
  11060.         begin
  11061.             if @username is not null
  11062.             begin
  11063.                 exec @retcode = dbo.sp_droprolemember @rolename, @username
  11064.                 if @@error <> 0 OR @retcode <> 0
  11065.                     return 1
  11066.             end
  11067.         end
  11068.     end     
  11069. go
  11070.  
  11071. raiserror('Creating procedure sp_changedistributor_password', 0,1)
  11072. go
  11073. CREATE PROCEDURE sp_changedistributor_password (
  11074.     @password sysname       
  11075.     ) AS
  11076.  
  11077.     declare @distributor sysname
  11078.     declare @distnetname sysname
  11079.     declare @retcode int
  11080.     declare @login sysname
  11081.  
  11082.     select @login = 'distributor_admin'
  11083.     SELECT @distributor = NULL
  11084.     SELECT @distributor = srvname, @distnetname = datasource 
  11085.         FROM master..sysservers
  11086.         WHERE  srvstatus & 8 <> 0
  11087.     
  11088.     exec @retcode = dbo.sp_addlinkedsrvlogin 
  11089.         @rmtsrvname= @distributor,
  11090.         @useself = 'false',
  11091.         @locallogin = NULL,
  11092.         @rmtuser = @login,
  11093.         @rmtpassword = @password
  11094.     IF @@error <> 0 OR @retcode <> 0
  11095.     BEGIN
  11096.         RETURN (1)
  11097.     END
  11098.  
  11099.     if UPPER(@distnetname) = UPPER(@@servername)
  11100.     begin
  11101.             -- Change the password if the distributor is local
  11102.         EXEC @retcode = dbo.sp_password NULL, @password, 'distributor_admin'
  11103.         if @@error <> 0 or @retcode <> 0
  11104.             return(1)
  11105.     end
  11106.  
  11107.     return (0)
  11108. GO
  11109.  
  11110. raiserror('Creating procedure sp_oledbinfo', 0,1)
  11111. go
  11112. CREATE PROCEDURE sp_oledbinfo
  11113.     @server nvarchar(128),
  11114.     @infotype nvarchar(128) = NULL,
  11115.     @login nvarchar(128) = NULL,
  11116.     @password nvarchar(128) = NULL
  11117.     AS
  11118.  
  11119.     SET NOCOUNT ON
  11120.  
  11121.     DECLARE @distributor sysname
  11122.     DECLARE @distproc nvarchar (255)
  11123.     DECLARE @retcode int
  11124.  
  11125.     /*
  11126.     ** Get distribution server information for remote RPC
  11127.     ** subscription calls.
  11128.     */
  11129.  
  11130.     EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT
  11131.     IF @@error <> 0 OR @retcode <> 0
  11132.         BEGIN
  11133.         RAISERROR (14071, 16, -1)
  11134.             RETURN (1)
  11135.     END
  11136.  
  11137.     select @distproc = rtrim(@distributor) + '.master.dbo.sp_MSget_oledbinfo'
  11138.     exec @retcode = @distproc @server, @infotype, @login, @password
  11139.     IF @@error <> 0
  11140.         BEGIN
  11141.         RAISERROR (14071, 16, -1)
  11142.         RETURN (1)
  11143.     END
  11144.  
  11145. go
  11146.  
  11147. raiserror('Creating procedure sp_MSget_oledbinfo', 0,1)
  11148. go
  11149. CREATE PROCEDURE sp_MSget_oledbinfo
  11150.     @server nvarchar(128),  -- the name by which the oledb datasource is referred to.
  11151.     @infotype nvarchar(128) = NULL,
  11152.     @login nvarchar(128) = NULL,
  11153.     @password nvarchar(128) = NULL
  11154.     AS
  11155.  
  11156.     SET NOCOUNT ON
  11157.  
  11158.     DECLARE @distproc nvarchar (255)
  11159.     DECLARE @providername nvarchar(256)
  11160.     DECLARE @datasource nvarchar(4000)
  11161.     DECLARE @location nvarchar(4000)
  11162.     DECLARE @providerstring nvarchar(4000)
  11163.     DECLARE @catalog nvarchar(256)
  11164.     DECLARE @retcode int
  11165.  
  11166.     select @providername = providername, @datasource = datasource, @location = location, @providerstring = providerstring, @catalog = catalog
  11167.         from master..sysservers where UPPER(srvname) = UPPER(@server) collate database_default
  11168.  
  11169.     if (@@rowcount = 0)
  11170.     begin
  11171.         raiserror(15015, 16, -1, @server)
  11172.         return (1)
  11173.     end
  11174.  
  11175.     exec @retcode = master..xp_oledbinfo @providername, @datasource, @location, @providerstring, @catalog, @login, @password, @infotype
  11176.     IF @@error <> 0
  11177.         BEGIN
  11178.         RAISERROR (14071, 16, -1)
  11179.         RETURN (1)
  11180.     END
  11181.  
  11182. go
  11183.  
  11184. raiserror('Creating procedure sp_grant_publication_access', 0,1)
  11185. go
  11186. CREATE PROCEDURE sp_grant_publication_access (
  11187.     @publication sysname,
  11188.     @login sysname,
  11189.     @reserved nvarchar(10) = NULL
  11190.         ) AS
  11191.  
  11192.     -- This stored procedure can be called repeatedly.
  11193.     DECLARE @distribdb sysname
  11194.     DECLARE @distproc nvarchar (300)
  11195.     DECLARE @retcode int
  11196.     DECLARE @dist_rpcname sysname
  11197.     DECLARE @database sysname
  11198.     
  11199.     -- Security Check
  11200.     exec @retcode = dbo.sp_MSreplcheck_publish
  11201.     if @@ERROR <> 0 or @retcode <> 0
  11202.         return(1)
  11203.     
  11204.     select @database = db_name()
  11205.  
  11206.     -- Existance check of the publication will be done in sp_MSpublication_access
  11207.     -- Note, even if the login exists, it may or may not has access
  11208.     -- to the server (granted or denied). 
  11209.     if @reserved is null
  11210.     begin
  11211.         if not exists (select * from master..syslogins where 
  11212.             sid = suser_sid(@login) and
  11213.             hasaccess = 1)
  11214.         begin
  11215.             raiserror(15007, 16, -1, @login) 
  11216.             return (1)
  11217.         end
  11218.         
  11219.         -- Don't do the user check if sysadmin since sysadmin can enter
  11220.         -- the database as dbo.
  11221.         if is_srvrolemember('sysadmin',@login) = 0 and
  11222.             not exists (select * from sysusers where
  11223.             (sid = suser_sid(@login) or name = N'guest') and
  11224.             hasdbaccess = 1) 
  11225.         begin
  11226.             raiserror(20619, 16, -1, @login, @database) 
  11227.             return (1)            
  11228.         end
  11229.     end
  11230.  
  11231.     select @database = db_name()
  11232.  
  11233.     EXEC @retcode = dbo.sp_helpdistributor  @rpcsrvname = @dist_rpcname OUTPUT,
  11234.                                         @distribdb   = @distribdb   OUTPUT
  11235.     IF @@error <> 0
  11236.     BEGIN
  11237.          RAISERROR (14071, 16, -1)
  11238.          return (1)
  11239.     END
  11240.  
  11241.     IF @retcode <> 0 OR @distribdb IS NULL OR @dist_rpcname IS NULL
  11242.     BEGIN
  11243.         RAISERROR (14071, 16, -1)
  11244.         return(1)
  11245.     END
  11246.  
  11247.     SELECT @distproc = RTRIM(@dist_rpcname) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSpublication_access'
  11248.     
  11249.     declare @skip bit
  11250.  
  11251.     declare @login2 sysname
  11252.  
  11253.     if @reserved = 'init'
  11254.     begin
  11255.         -- Skip logins that are not at the distributor without
  11256.         -- raiseing error.
  11257.         set @skip = 1
  11258.         declare hC CURSOR LOCAL FAST_FORWARD for
  11259.             select loginname from master..syslogins where
  11260.                 (is_srvrolemember('sysadmin', loginname) = 1 or
  11261.                 sid = suser_sid()) 
  11262.         for read only
  11263.     end
  11264.     else
  11265.     begin
  11266.         set @skip = 0
  11267.         declare hC CURSOR LOCAL FAST_FORWARD for
  11268.                 select @login
  11269.             for read only
  11270.     end
  11271.  
  11272.     open hC
  11273.     fetch hC into @login2
  11274.  
  11275.     while (@@fetch_status <> -1)
  11276.     begin
  11277.         EXEC @retcode = @distproc
  11278.              @publisher = @@SERVERNAME,
  11279.              @publisher_db = @database,
  11280.              @publication = @publication,
  11281.              @login= @login2,
  11282.              @operation = 'add',
  11283.              @skip = @skip
  11284.         IF @@error <> 0 OR @retcode <> 0
  11285.             return (1)
  11286.  
  11287.         fetch hC into @login2
  11288.     end
  11289.     
  11290.     close hC
  11291.     deallocate hC
  11292. GO
  11293.  
  11294. raiserror('Creating procedure sp_revoke_publication_access', 0,1)
  11295. go
  11296. CREATE PROCEDURE sp_revoke_publication_access (
  11297.     @publication sysname,
  11298.     @login sysname
  11299.         ) AS
  11300.  
  11301.     -- This stored procedure can be called repeatedly.
  11302.     DECLARE @distribdb sysname
  11303.     DECLARE @distproc nvarchar (300)
  11304.     DECLARE @retcode int
  11305.     DECLARE @dist_rpcname sysname
  11306.     DECLARE @database sysname
  11307.  
  11308.     -- Security Check
  11309.     exec @retcode = dbo.sp_MSreplcheck_publish
  11310.     if @@ERROR <> 0 or @retcode <> 0
  11311.         return(1)
  11312.  
  11313.     -- Do check existense when dropping since the login might be dropped
  11314.     -- outside replication already.
  11315.  
  11316.     select @database = db_name()
  11317.  
  11318.     EXEC @retcode = dbo.sp_helpdistributor  @rpcsrvname = @dist_rpcname OUTPUT,
  11319.                                         @distribdb   = @distribdb   OUTPUT
  11320.     IF @@error <> 0
  11321.     BEGIN
  11322.          RAISERROR (14071, 16, -1)
  11323.          return (1)
  11324.     END
  11325.  
  11326.     IF @retcode <> 0 OR @distribdb IS NULL OR @dist_rpcname IS NULL
  11327.     BEGIN
  11328.         RAISERROR (14071, 16, -1)
  11329.         return(1)
  11330.     END
  11331.  
  11332.     SELECT @distproc = RTRIM(@dist_rpcname) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSpublication_access'
  11333.     EXEC @retcode = @distproc
  11334.          @publisher = @@SERVERNAME,
  11335.          @publisher_db = @database,
  11336.          @publication = @publication,
  11337.          @login= @login,
  11338.          @operation = 'drop'
  11339.  
  11340.     IF @@error <> 0 OR @retcode <> 0
  11341.         return (1)
  11342. GO
  11343.  
  11344. raiserror('Creating procedure sp_help_publication_access', 0,1)
  11345. go
  11346. CREATE PROCEDURE sp_help_publication_access (
  11347.     @publication sysname,
  11348.     @return_granted bit = 1,
  11349.     @login sysname = '%',
  11350.     @initial_list bit = 0
  11351.         ) AS
  11352.  
  11353.     set nocount on
  11354.     -- This stored procedure can be called repeatedly.
  11355.     DECLARE @distribdb sysname
  11356.     DECLARE @distproc nvarchar (300)
  11357.     DECLARE @retcode int
  11358.     DECLARE @dist_rpcname sysname
  11359.     DECLARE @database sysname
  11360.  
  11361.     exec @retcode = dbo.sp_MSreplcheck_publish
  11362.     if @@ERROR <> 0 or @retcode <> 0
  11363.         return(1)
  11364.  
  11365.     -- Do check existense when dropping since the login might be dropped
  11366.     -- outside replication already.
  11367.  
  11368.     select @database = db_name()
  11369.  
  11370.     EXEC @retcode = dbo.sp_helpdistributor  @rpcsrvname = @dist_rpcname OUTPUT,
  11371.                                         @distribdb   = @distribdb   OUTPUT
  11372.     IF @@error <> 0
  11373.     BEGIN
  11374.          RAISERROR (14071, 16, -1)
  11375.          return (1)
  11376.     END
  11377.  
  11378.     IF @retcode <> 0 OR @distribdb IS NULL OR @dist_rpcname IS NULL
  11379.     BEGIN
  11380.         RAISERROR (14071, 16, -1)
  11381.         return(1)
  11382.     END
  11383.  
  11384.     SELECT @distproc = RTRIM(@dist_rpcname) + '.' + RTRIM(@distribdb) + '.dbo.sp_MSpublication_access'
  11385.  
  11386.     -- Get logins in the PAL if needed
  11387.     if @initial_list = 0
  11388.     begin
  11389.         create table #granted (login sysname collate database_default null)    
  11390.         insert into #granted EXEC @retcode = @distproc
  11391.              @publisher = @@SERVERNAME,
  11392.              @publisher_db = @database,
  11393.              @publication = @publication,
  11394.              @operation = 'help',
  11395.              @login = @login
  11396.  
  11397.         IF @@error <> 0 OR @retcode <> 0
  11398.             return (1)
  11399.     end
  11400.  
  11401.     -- Get distributor valid logins if needed
  11402.     if @return_granted = 0 or @initial_list = 1
  11403.     begin
  11404.         create table #dist_logins(login sysname collate database_default null)
  11405.         insert into #dist_logins EXEC @retcode = @distproc
  11406.              @publisher = @@SERVERNAME,
  11407.              @operation = 'get_logins'
  11408.     end
  11409.  
  11410.     if @initial_list = 1
  11411.     begin
  11412.         -- Get the initial list for the publication to be created
  11413.         -- by the current user
  11414.         -- It contains all the logins sysadmin group and the current user
  11415.         -- that have valid login at the distributor.
  11416.         select l.loginname, l.isntname, l.isntgroup
  11417.          from master..syslogins l, #dist_logins d where
  11418.             l.sid = suser_sid(d.login) and
  11419.             l.hasaccess = 1 and
  11420.             (is_srvrolemember('sysadmin',d.login) = 1 or (l.sid = suser_sid())) 
  11421.     end
  11422.     else if @return_granted = 0
  11423.     begin
  11424.         select l.loginname, l.isntname, l.isntgroup
  11425.          from master..syslogins l, #dist_logins d where
  11426.             l.sid = suser_sid(d.login) and
  11427.             l.hasaccess = 1 and 
  11428.             not exists (select * from #granted g where 
  11429.                 suser_sid(g.login) = l.sid) and
  11430.             exists (select * from sysusers u where
  11431.                 (u.sid = l.sid or u.name = 'guest') and
  11432.                 u.hasdbaccess = 1)
  11433.     end
  11434.     else if @return_granted = 1
  11435.     begin
  11436.         select l.loginname, l.isntname, l.isntgroup from master..syslogins l,
  11437.             #granted g where
  11438.             l.sid = suser_sid(g.login)
  11439.     end
  11440. GO
  11441.  
  11442. raiserror('Creating procedure sp_check_publication_access', 0,1)
  11443. go
  11444. CREATE PROCEDURE sp_check_publication_access
  11445. @publication sysname,
  11446. @given_login sysname = NULL
  11447. AS
  11448.     set nocount on
  11449.     declare @retcode int
  11450.     exec @retcode = dbo.sp_MSreplcheck_pull 
  11451.         @publication = @publication,
  11452.         @given_login = @given_login
  11453.     if @retcode <> 0 or @@error <> 0
  11454.         return (1)
  11455.     return 0
  11456. GO
  11457.  
  11458. exec dbo.sp_MS_marksystemobject sp_check_publication_access
  11459. go
  11460.  
  11461. raiserror('Creating procedure sp_MSget_agent_names', 0,1)
  11462. go
  11463. CREATE PROCEDURE sp_MSget_agent_names
  11464. @publication sysname,        
  11465. @subscriber sysname = NULL,              
  11466. @subscriber_db sysname = NULL,
  11467. @publisher sysname = NULL,
  11468. @publisher_db sysname = NULL
  11469. as
  11470.     set nocount on
  11471.  
  11472.     declare @retcode int
  11473.  
  11474.     if @publisher is null
  11475.     -- We are at the publisher side, call into the distributor
  11476.     begin
  11477.         /*
  11478.         ** Get distribution server information for remote RPC
  11479.         ** agent verification.
  11480.         */
  11481.         declare @distributor sysname
  11482.         declare @distribdb sysname
  11483.         declare @distproc nvarchar(1000), @pubdb sysname
  11484.  
  11485.         select @pubdb = db_name()
  11486.  
  11487.         EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  11488.             @distribdb = @distribdb OUTPUT
  11489.  
  11490.         IF @@error <> 0 OR @retcode <> 0
  11491.         BEGIN
  11492.             RAISERROR (14071, 16, -1)
  11493.             RETURN (1)
  11494.         END
  11495.  
  11496.         /*
  11497.         ** Call proc to change the distributor
  11498.         */
  11499.         SELECT @distproc = RTRIM(@distributor) + '.' + @distribdb + 
  11500.             '.dbo.sp_MSget_agent_names'
  11501.         exec @retcode = @distproc 
  11502.             @publisher = @@SERVERNAME,
  11503.             @publisher_db = @pubdb,
  11504.             @publication = @publication,
  11505.             @subscriber = @subscriber,
  11506.             @subscriber_db = @subscriber_db
  11507.     end
  11508.     else
  11509.     -- We are at the distribution db
  11510.     begin
  11511.         declare @publisher_id smallint
  11512.         select @publisher_id = srvid from master..sysservers where UPPER(srvname) = UPPER(@publisher) collate database_default
  11513.  
  11514.         if @subscriber is null
  11515.         -- Returning publication agents if @subscriber is null
  11516.         begin
  11517.             declare @snapshot_agent sysname, @logreader_agent sysname, @qreader_agent sysname
  11518.             
  11519.             -- Have to use name in sysjobs table because users may rename
  11520.             -- the SQLServerAgent jobs. If users deleted the jobs, DMO scripting will
  11521.             -- create new jobs.
  11522.  
  11523.             select 
  11524.                 'snapshot_agent' = (select j.name from MSsnapshot_agents a, msdb..sysjobs j where
  11525.                     publisher_id = @publisher_id and
  11526.                     publisher_db = @publisher_db collate database_default and
  11527.                     publication = @publication collate database_default and
  11528.                     a.job_id = j.job_id),
  11529.                 'logreader_agent' = (select j.name from MSlogreader_agents a, msdb..sysjobs j where
  11530.                     publisher_id = @publisher_id and
  11531.                     publisher_db = @publisher_db collate database_default and
  11532.                     a.job_id = j.job_id),
  11533.                 'qreader_agent' = (select j.name from MSqreader_agents a, msdb..sysjobs j where
  11534.                     a.job_id = j.job_id)
  11535.         end
  11536.         else
  11537.         begin
  11538.             declare @subscriber_id smallint
  11539.             select @subscriber_id = srvid from master..sysservers where UPPER(srvname) = UPPER(@subscriber) collate database_default
  11540.             declare @publication_type int, @independent_agent bit
  11541.  
  11542.             select @publication_type = publication_type, @independent_agent = independent_agent
  11543.                 from MSpublications where 
  11544.                     publisher_id = @publisher_id and
  11545.                     publisher_db = @publisher_db and
  11546.                     publication = @publication
  11547.  
  11548.             if @publication_type = 2
  11549.             -- Merge publication, get merge agent name
  11550.             begin
  11551.                 select 'merge_agent' = j.name from MSmerge_agents a, msdb..sysjobs j where
  11552.                     publisher_id = @publisher_id and
  11553.                     publisher_db = @publisher_db collate database_default and
  11554.                     publication = @publication collate database_default and
  11555.                     subscriber_id = @subscriber_id and
  11556.                     subscriber_db = @subscriber_db collate database_default and
  11557.                     a.job_id = j.job_id
  11558.             end
  11559.             else
  11560.             begin
  11561.                 select 'distribution_agent' = j.name from MSdistribution_agents a, msdb..sysjobs j where
  11562.                     publisher_id = @publisher_id and
  11563.                     publisher_db = @publisher_db collate database_default and
  11564.                     (publication = @publication collate database_default or
  11565.                      publication = N'ALL' and @independent_agent = 0) and
  11566.                     subscriber_id = @subscriber_id and
  11567.                     subscriber_db = @subscriber_db collate database_default and
  11568.                     a.job_id = j.job_id
  11569.             end
  11570.         end
  11571.     end -- If @publisher is null
  11572.  
  11573. go
  11574.  
  11575. exec dbo.sp_MS_marksystemobject sp_MSget_agent_names
  11576. go
  11577.  
  11578. raiserror('Creating procedure sp_MSinit_replication_perfmon', 0,1)
  11579. go
  11580.  
  11581. create proc sp_MSinit_replication_perfmon
  11582. as
  11583.     declare @agent_type int
  11584.     declare @agent_name nvarchar(100)
  11585.     declare @status int
  11586.  
  11587.     -- Remove all existing instances
  11588.     dbcc deleteinstance ("SQL Replication Agents", "%")
  11589.     dbcc deleteinstance ("SQL Replication Snapshot", "%")
  11590.     dbcc deleteinstance ("SQL Replication Logreader", "%")
  11591.     dbcc deleteinstance ("SQL Replication Distribution", "%")
  11592.     dbcc deleteinstance ("SQL Replication Merge", "%")
  11593.     dbcc deleteinstance ("SQL Replication Queuereader", "%")
  11594.  
  11595.     -- Add and initialize Perfmon SQL Replication Agents instances
  11596.     dbcc addinstance ("SQL Replication Agents", "Snapshot")
  11597.     dbcc addinstance ("SQL Replication Agents", "Logreader")
  11598.     dbcc addinstance ("SQL Replication Agents", "Distribution")
  11599.     dbcc addinstance ("SQL Replication Agents", "Merge")
  11600.     dbcc addinstance ("SQL Replication Agents", "Queuereader")
  11601.     dbcc setinstance ("SQL Replication Agents", "Running", "Snapshot", 0)
  11602.     dbcc setinstance ("SQL Replication Agents", "Running", "Logreader", 0)
  11603.     dbcc setinstance ("SQL Replication Agents", "Running", "Distribution", 0)
  11604.     dbcc setinstance ("SQL Replication Agents", "Running", "Merge", 0)
  11605.     dbcc setinstance ("SQL Replication Agents", "Running", "Queuereader", 0)
  11606.  
  11607.     -- Add instances for each agent currently in the status table
  11608.     declare hC CURSOR LOCAL FAST_FORWARD for select agent_type, agent_name, status from tempdb.dbo.MSreplication_agent_status for read only
  11609.     open hC
  11610.     fetch hC into @agent_type, @agent_name, @status
  11611.     while (@@fetch_status <> -1)
  11612.     begin
  11613.  
  11614.         if @agent_type = 1 
  11615.         begin
  11616.             dbcc addinstance ("SQL Replication Snapshot", @agent_name)
  11617.             if @status = 1 or @status = 3 or @status = 4
  11618.                 dbcc incrementinstance ("SQL Replication Agents", "Running", "Snapshot", 1)
  11619.         end
  11620.         else if @agent_type = 2 
  11621.         begin
  11622.             dbcc addinstance ("SQL Replication Logreader", @agent_name)
  11623.             if @status = 1 or @status = 3 or @status = 4
  11624.                 dbcc incrementinstance ("SQL Replication Agents", "Running", "Logreader", 1)
  11625.         end
  11626.         else if @agent_type = 3 
  11627.         begin
  11628.             dbcc addinstance ("SQL Replication Distribution", @agent_name)
  11629.             if @status = 1 or @status = 3 or @status = 4
  11630.                 dbcc incrementinstance ("SQL Replication Agents", "Running", "Distribution", 1)
  11631.         end
  11632.         else if @agent_type = 4 
  11633.         begin
  11634.             dbcc addinstance ("SQL Replication Merge", @agent_name)
  11635.             if @status = 1 or @status = 3 or @status = 4
  11636.                 dbcc incrementinstance ("SQL Replication Agents", "Running", "Merge", 1)
  11637.         end
  11638.         else if @agent_type = 9 
  11639.         begin
  11640.             dbcc addinstance ("SQL Replication Queuereader", @agent_name)
  11641.             if @status = 1 or @status = 3 or @status = 4
  11642.                 dbcc incrementinstance ("SQL Replication Agents", "Running", "Queuereader", 1)
  11643.         end
  11644.  
  11645.         fetch hC into @agent_type, @agent_name, @status
  11646.     end
  11647.     close hC
  11648.     deallocate hC
  11649. GO
  11650.  
  11651. raiserror('Creating procedure sp_MSrepl_startup', 0,1)
  11652. go
  11653. create procedure sp_MSrepl_startup
  11654. as
  11655.  
  11656.     -- Drop and create publisher side cache table
  11657.     if exists (select * from tempdb..sysobjects where name = 'MSpublisher_access' and
  11658.     type = 'U')
  11659.         drop table tempdb.dbo.MSpublisher_access
  11660.  
  11661.     create table tempdb.dbo.MSpublisher_access
  11662.     (
  11663.     spid int NOT NULL,
  11664.     db_id int not null,
  11665.     publication sysname not null,
  11666.     login_time datetime not null,
  11667.     pubid uniqueidentifier null -- Used for merge only.
  11668.     )
  11669.  
  11670.     CREATE CLUSTERED INDEX ucMSpublisher_access ON tempdb.dbo.MSpublisher_access
  11671.         (spid, publication, db_id)
  11672.  
  11673.     -- Drop and create distributor side cache table
  11674.     -- We need to avoid publisher and distributor using the same table to prevent
  11675.     -- contention in local distributor case.
  11676.     if exists (select * from master..sysservers
  11677.                   WHERE  srvstatus & 8 <> 0 and UPPER(datasource) = UPPER(@@servername) collate database_default)
  11678.     begin
  11679.         if exists (select * from tempdb..sysobjects where name = 'MSdistributor_access' and
  11680.         type = 'U')
  11681.             drop table tempdb.dbo.MSdistributor_access
  11682.  
  11683.         create table tempdb.dbo.MSdistributor_access
  11684.         (
  11685.         spid int NOT NULL,
  11686.         db_id int not null,
  11687.         agent_id int not null,
  11688.         agent_type int not null,
  11689.         publication_id int not null,
  11690.         login_time datetime not null
  11691.         )
  11692.  
  11693.         CREATE CLUSTERED INDEX ucMSdistributor_access ON tempdb.dbo.MSdistributor_access
  11694.             (spid, agent_id, db_id)
  11695.  
  11696.         -- Create repl monitor table
  11697.         exec sp_MScreate_replication_status_table
  11698.    end
  11699. go
  11700.  
  11701. -- If a distributor is installed, mark the sp as a startup sp. 
  11702. if exists (select * FROM master..sysservers WHERE  srvstatus & 8 <> 0)
  11703.     exec dbo.sp_procoption 'sp_MSrepl_startup', 'startup', 'true' 
  11704. go
  11705.  
  11706. raiserror('Creating procedure sp_MSflush_access_cache', 0,1)
  11707. go
  11708. CREATE PROCEDURE sp_MSflush_access_cache 
  11709. AS
  11710.     -- Delete all the 'dead' connections in MSpublisher_access.
  11711.     delete tempdb.dbo.MSpublisher_access 
  11712.         from tempdb.dbo.MSpublisher_access a
  11713.         where not exists (select * from master..sysprocesses p where
  11714.             a.spid = p.spid and
  11715.             p.login_time = a.login_time)
  11716.     if @@error <> 0
  11717.         return 1
  11718.     else
  11719.         return 0
  11720.  
  11721.     if exists (select * from tempdb..sysobjects where name = 'MSdistributor_access' and
  11722.     type = 'U')
  11723.     begin
  11724.         -- Delete all the 'dead' connections in MSdistributor_access.
  11725.         delete tempdb.dbo.MSdistributor_access 
  11726.             from tempdb.dbo.MSdistributor_access a
  11727.             where not exists (select * from master..sysprocesses p where
  11728.                 a.spid = p.spid and
  11729.                 p.login_time = a.login_time)
  11730.         if @@error <> 0
  11731.             return 1
  11732.         else
  11733.             return 0
  11734.     end
  11735.     return (0)
  11736. GO
  11737.  
  11738. raiserror('Creating procedure sp_MSreinit_failed_subscriptions', 0,1)
  11739. go
  11740. -- This stored procedure is used as a response to the Replication Validation Failure Alert.
  11741. -- It will reinit the failed subscription. If the publisher is remote, it must be configured as a remote server 
  11742. -- for this procedure to work.
  11743. create proc sp_MSreinit_failed_subscriptions
  11744. @failure_level int = 0      -- 0 All failure  1 Validation failures
  11745. as
  11746.  
  11747.     declare @publisher sysname
  11748.     declare @publisher_db sysname
  11749.     declare @publication sysname
  11750.     declare @article sysname
  11751.     declare @publication_type int
  11752.     declare @subscriber sysname
  11753.     declare @subscriber_db sysname
  11754.     declare @agent_type int
  11755.     declare @alert_id int
  11756.     declare @proc nvarchar(100)
  11757.     declare @message nvarchar(4000)
  11758.     declare @retcode int
  11759.     declare @found bit
  11760.     declare @return_value int
  11761.     
  11762.     set nocount on
  11763.  
  11764.     set @found = 0          -- set if cursor returns a row
  11765.     set @return_value = 0   -- set to success
  11766.  
  11767.     -- For each publication validation failure, resync the subscription
  11768.     declare hc CURSOR LOCAL FAST_FORWARD for select publisher, publisher_db, publication, publication_type, article, subscriber, 
  11769.         subscriber_db, alert_id from 
  11770.         msdb..sysreplicationalerts where
  11771.         (@failure_level = 0 or (@failure_level = 1 and alert_error_code = 20574)) and   -- 20574 = validation failure
  11772.         status = 0
  11773.         for read only
  11774.  
  11775.     open hc
  11776.     fetch hc into  @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id
  11777.     while (@@fetch_status <> -1)
  11778.     begin
  11779.         
  11780.         set @found = 1
  11781.  
  11782.         -- Reinit snapshot or transactional subscription (article level)
  11783.         if @publication_type = 0 or @publication_type = 1
  11784.         begin
  11785.             set @proc = @publisher + '.' + @publisher_db + '.dbo.sp_reinitsubscription'
  11786.             exec @retcode = @proc
  11787.                 @publication = @publication,
  11788.                 @article = @article,
  11789.                 @subscriber = @subscriber,
  11790.                 @destination_db = @subscriber_db
  11791.             -- Ignore failures, update status bit if successful
  11792.             if @retcode = 0
  11793.             begin
  11794.                 -- Change status to 1 which means the alerts has been serviced
  11795.                 update msdb..sysreplicationalerts set status = 1 where alert_id = @alert_id
  11796.  
  11797.                 -- Raiserror that subscription was reinitialized
  11798.                 if @failure_level = 0
  11799.                     -- 'Subscriber ''%s'' subscription to article ''%s'' in publication ''%s'' has been reinitialized after a synchronization failure.'
  11800.                     raiserror(20576, 10,-1, @subscriber, @article, @publication) 
  11801.                 else if @failure_level  = 1
  11802.                     -- 'Subscriber ''%s'' subscription to article ''%s'' in publication ''%s'' has been reinitialized after a validation failure.'
  11803.                     raiserror(20572, 10,-1, @subscriber, @article, @publication) 
  11804.             end
  11805.             else -- failure
  11806.                 set @return_value = 1
  11807.         end
  11808.         -- Reinit merge subscription (full publication)
  11809.         else if @publication_type = 2       
  11810.         begin
  11811.             set @proc = @publisher + '.' + @publisher_db + '.dbo.sp_reinitmergesubscription'
  11812.             exec @retcode = @proc
  11813.                 @publication = @publication,
  11814.                 @subscriber = @subscriber,
  11815.                 @subscriber_db = @subscriber_db
  11816.             -- Ignore failures, update status bit if successful
  11817.             if @retcode = 0
  11818.             begin
  11819.                 -- Change status to 1 which means the alerts has been serviced
  11820.                 update msdb..sysreplicationalerts set status = 1 where alert_id = @alert_id
  11821.  
  11822.                 -- Raiserror that subscription was reinitialized
  11823.                 if @failure_level = 0
  11824.                     -- 'Subscriber ''%s'' subscription to to article ''%s'' in publication ''%s'' has been reinitialized after a synchronization failure.'
  11825.                      raiserror(20576, 10,-1, @subscriber, @article, @publication) 
  11826.                 else if @failure_level  = 1
  11827.                     -- 'Subscriber ''%s'' subscription to to article ''%s'' in publication ''%s'' has been reinitialized after a validation failure.'
  11828.                     raiserror(20572, 10,-1, @subscriber, @article, @publication)
  11829.             end
  11830.             else -- failure
  11831.                 set @return_value = 1
  11832.         end
  11833.  
  11834.         fetch hc into  @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id
  11835.     end
  11836.  
  11837.     close hc
  11838.     deallocate hc
  11839.  
  11840.     -- Return a message stating no entries where found
  11841.     if @found = 0
  11842.     begin
  11843.         -- 'No entries were found in msdb..sysreplicationalerts.'
  11844.         raiserror(20577, 10,-1) 
  11845.  
  11846.         -- There is most likely a problem, set failure return value
  11847.         set @return_value = 1
  11848.     end
  11849.  
  11850.     return @return_value 
  11851. go
  11852. dump tran master with no_log
  11853. GO
  11854.  
  11855. raiserror('Creating procedure sp_add_datatype_mapping', 0,1)
  11856. go
  11857.  
  11858. -- Add a row into the "MSdatatype_mappings" table
  11859. create procedure sp_add_datatype_mapping (
  11860.     @dbms_name          sysname,
  11861.     @sql_type           sysname,
  11862.     @dest_type          sysname,
  11863.     @dest_prec          int,
  11864.     @dest_create_params int,
  11865.     @dest_nullable      bit
  11866. )
  11867. as
  11868.     set nocount on
  11869.  
  11870.     if @dbms_name is null
  11871.     BEGIN
  11872.         RAISERROR (14043, 16, -1, '@dbms_name')
  11873.         RETURN (1)
  11874.     END
  11875.     
  11876.     if @sql_type is null 
  11877.     BEGIN
  11878.         RAISERROR (14043, 16, -1, '@sql_type')
  11879.         RETURN (1)
  11880.     END
  11881.  
  11882.     if @dest_type is null
  11883.     BEGIN
  11884.         RAISERROR (14043, 16, -1, '@dest_type')
  11885.         RETURN (1)
  11886.     END
  11887.  
  11888.     if @dest_prec is null
  11889.     BEGIN
  11890.         RAISERROR (14043, 16, -1, '@dest_prec')
  11891.         RETURN (1)
  11892.     END
  11893.  
  11894.     if @dest_create_params is null
  11895.     BEGIN
  11896.         RAISERROR (14043, 16, -1, '@dest_create_params')
  11897.         RETURN (1)
  11898.     END
  11899.  
  11900.     if @dest_nullable is null
  11901.     BEGIN
  11902.         RAISERROR (14043, 16, -1, '@dest_nullable')
  11903.         RETURN (1)
  11904.     END
  11905.  
  11906.  
  11907.     insert into msdb..MSdatatype_mappings
  11908.     values (@dbms_name, @sql_type, @dest_type, @dest_prec, @dest_create_params, @dest_nullable)
  11909.  
  11910.     if @@error <> 0
  11911.         return(1)
  11912. GO
  11913.  
  11914. raiserror('Creating procedure sp_MSrepl_gettype_mappings', 0,1)
  11915. go
  11916. create procedure sp_MSrepl_gettype_mappings(
  11917.     @dbms_name          sysname,
  11918.     @sql_type           sysname = '%',
  11919.     @source_prec        int = NULL
  11920. )
  11921. as
  11922.     set nocount on
  11923.     declare @retcode int
  11924.     declare @distributor sysname
  11925.     declare @distribdb sysname
  11926.     declare @distproc nvarchar (255)
  11927.     
  11928.     EXECUTE @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT,
  11929.            @distribdb   = @distribdb OUTPUT
  11930.     IF @@ERROR <> 0 or @retcode <> 0
  11931.     BEGIN
  11932.         RAISERROR (14071, 16, -1)
  11933.         RETURN (1)
  11934.     END
  11935.  
  11936.     SELECT @distproc = RTRIM(@distributor) + '.master' + 
  11937.             '.dbo.sp_help_datatype_mapping'
  11938.  
  11939.     EXECUTE @retcode = @distproc
  11940.                        @dbms_name = @dbms_name,
  11941.                        @sql_type = @sql_type,
  11942.                        @source_prec = @source_prec
  11943.             
  11944.     IF @@ERROR <> 0 OR @retcode <> 0
  11945.         return 1
  11946.     ELSE
  11947.         return 0
  11948. go
  11949.  
  11950. raiserror('Creating procedure sp_help_datatype_mapping', 0,1)
  11951. go
  11952. create procedure sp_help_datatype_mapping(
  11953.     @dbms_name          sysname,
  11954.     @sql_type           sysname = '%',
  11955.     @source_prec        int = NULL
  11956. )
  11957. as
  11958.     set nocount on
  11959.     
  11960.     if @source_prec is NULL
  11961.     begin
  11962.         select sql_type, dest_type, dest_prec, dest_create_params, dest_nullable
  11963.         from msdb..MSdatatype_mappings 
  11964.         where dbms_name = @dbms_name collate database_default
  11965.         and sql_type like @sql_type collate database_default
  11966.     end
  11967.     else
  11968.     begin
  11969.         select sql_type, dest_type, dest_prec, dest_create_params, dest_nullable
  11970.         from msdb..MSdatatype_mappings 
  11971.         where dbms_name = @dbms_name collate database_default
  11972.         and sql_type like @sql_type collate database_default
  11973.         and dest_prec = (select min(dest_prec)
  11974.                             from msdb..MSdatatype_mappings 
  11975.                             where dbms_name = @dbms_name collate database_default
  11976.                             and sql_type like @sql_type collate database_default
  11977.                             and dest_prec >= @source_prec
  11978.                         )
  11979.     end
  11980. GO
  11981.  
  11982. raiserror('Creating procedure sp_MSfix_6x_tasks', 0,1)
  11983. go
  11984. CREATE PROCEDURE sp_MSfix_6x_tasks (
  11985.     @publisher sysname = NULL
  11986. ) AS
  11987.  
  11988.     SET NOCOUNT ON
  11989.  
  11990.     DECLARE @distributor sysname
  11991.     DECLARE @distproc nvarchar (255)
  11992.     declare @retcode int
  11993.  
  11994.     -- If @publisher is null redirect the call to distributor
  11995.     if @publisher is null
  11996.     begin
  11997.         /*
  11998.         ** Get distribution server information for remote RPC
  11999.         ** agent verification.
  12000.         */
  12001.         EXEC @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor OUTPUT
  12002.  
  12003.         IF @@error <> 0 OR @retcode <> 0
  12004.         BEGIN
  12005.             RAISERROR (14071, 16, -1)
  12006.             RETURN (1)
  12007.         END
  12008.  
  12009.         /*
  12010.         ** RPC distributor
  12011.         */
  12012.         SELECT @distproc = RTRIM(@distributor) + '.master.dbo.sp_MSfix_6x_tasks'
  12013.  
  12014.         EXECUTE @retcode = @distproc
  12015.             @publisher = @@SERVERNAME
  12016.         IF @@ERROR <> 0 or @retcode <> 0
  12017.             return (1)
  12018.     end
  12019.     else
  12020.     begin
  12021.  
  12022.         declare @category_id int
  12023.         declare @category_name sysname
  12024.         declare @server sysname
  12025.         declare @databasename sysname
  12026.         declare @name sysname
  12027.         declare @distdb sysname
  12028.         declare @job_id uniqueidentifier
  12029.         declare @sSubsystem sysname
  12030.  
  12031.         -- Drop entry in systasks first.
  12032.         DECLARE hCtasks CURSOR LOCAL FAST_FORWARD FOR
  12033.             SELECT name FROM msdb.dbo.systasks_view st WHERE 
  12034.                 
  12035.                 -- drop distribution agents.
  12036.                 (st.name LIKE @publisher + '_' + '%' + '_' + '%' AND 
  12037.                 LOWER(subsystem) = 'distribution' AND
  12038.                 server = @@SERVERNAME) OR
  12039.                                 
  12040.                 (LOWER(subsystem) = 'logreader' AND
  12041.                 server = @publisher) OR 
  12042.                 
  12043.                 (LOWER(subsystem) = 'snapshot' AND
  12044.                 server = @publisher) OR
  12045.  
  12046.                 (st.name LIKE '%' + '_' + '%' + '_Cleanup' AND 
  12047.                 st.command LIKE '%' + 'sp_replcleanup' + '%' AND
  12048.                 LOWER(subsystem) = 'tsql')
  12049.             FOR READ ONLY
  12050.  
  12051.         OPEN hCtasks
  12052.         FETCH hCtasks INTO @name
  12053.  
  12054.         WHILE (@@fetch_status <> -1)
  12055.         BEGIN
  12056.             
  12057.             EXEC @retcode = msdb.dbo.sp_droptask @name = @name
  12058.             if @retcode <> 0 or @@error <> 0
  12059.                 return(1)
  12060.             FETCH hCtasks INTO @name
  12061.         END
  12062.  
  12063.         -- Now spin through each old replication job and fixup categories names
  12064.         declare hcJobsToFix CURSOR LOCAL FAST_FORWARD for 
  12065.                 select distinct j.job_id, j.name, s.subsystem, 
  12066.                     s.server, s.database_name
  12067.                     from msdb.dbo.sysjobs j left join msdb.dbo.sysjobsteps s
  12068.                         on j.job_id = s.job_id
  12069.                     where j.category_id = 0 and s.step_id = 1 and lower(s.subsystem) in ( 'snapshot', 'logreader', 'distribution' )
  12070.                 for read only
  12071.  
  12072.         open hcJobsToFix 
  12073.         fetch hcJobsToFix into @job_id, @name, @sSubsystem,
  12074.             @server,@databasename
  12075.  
  12076.         while (@@fetch_status <> -1 )
  12077.         begin
  12078.             -- Note, have to make it a transaction, once the category_id is changed,
  12079.             -- the task will never be picked up again.
  12080.             begin tran 
  12081.  
  12082.                 -- Get Distribution category name (assumes category_id = 10)
  12083.                 select @category_id =
  12084.                     case lower(@sSubsystem) 
  12085.                         when 'snapshot' then 15
  12086.                         when 'distribution' then 10
  12087.                         when 'logreader' then 13
  12088.                         else 0
  12089.                     end
  12090.  
  12091.                 select @category_name = name FROM msdb.dbo.syscategories where category_id = @category_id
  12092.                 
  12093.                 -- raiserror( 'Would update %s to category %d based on subsystem value %s', -1, 10, @nJobName, @iCategory, @sSubsystem )
  12094.                 exec @retcode = msdb.dbo.sp_update_job @job_id = @job_id, 
  12095.                     @category_name = @category_name
  12096.                 if @retcode <> 0 or @@error <> 0
  12097.                     goto UNDO
  12098.  
  12099.  
  12100.                 -- Add the replication agent for monitoring
  12101.                 SELECT @distdb = distribution_db from msdb..MSdistpublishers where UPPER(name) = UPPER(@server) collate database_default
  12102.                 IF (@category_id = 13) -- Logreader
  12103.                 BEGIN
  12104.                     SELECT @distproc = @distdb + '.dbo.sp_MSadd_logreader_agent'
  12105.                     EXECUTE @retcode = @distproc
  12106.                         @name = @name,
  12107.                         @publisher = @server,
  12108.                         @publisher_db = @databasename,
  12109.                         @publication = '',  
  12110.                         @local_job = 1,
  12111.                         @job_existing = 1,
  12112.                         @job_id = @job_id
  12113.  
  12114.                     IF (@retcode <> 0 or @@error<>0)
  12115.                         goto UNDO
  12116.                 END
  12117.                 ELSE 
  12118.                 IF (@category_id = 15) -- Snapshot
  12119.                 BEGIN
  12120.                     DECLARE @publication sysname
  12121.  
  12122.                     SELECT @publication = NULL
  12123.                     EXECUTE master.dbo.sp_MSget_publication_from_taskname
  12124.                                             @taskname = @name,
  12125.                                             @publisher = @server,
  12126.                                             @publisherdb = @databasename,
  12127.                                             @publication = @publication OUTPUT
  12128.  
  12129.                     IF (@publication IS NOT NULL )
  12130.                     BEGIN                
  12131.                         SELECT @distproc = @distdb + '.dbo.sp_MSadd_publication'
  12132.                         EXECUTE @retcode = @distproc
  12133.                             @publisher = @server,
  12134.                             @publisher_db = @databasename,
  12135.                             @publication = @publication,
  12136.                             @publication_type = 0 -- Transactional
  12137.                         IF (@retcode <> 0 or @@error<>0)
  12138.                             goto UNDO
  12139.  
  12140.                         SELECT @distproc = @distdb + '.dbo.sp_MSadd_snapshot_agent'
  12141.                         EXECUTE @retcode = @distproc
  12142.                             @name = @name,
  12143.                             @publisher = @server,
  12144.                             @publisher_db = @databasename,
  12145.                             @publication = @publication,
  12146.                             @local_job = 1,
  12147.                             @job_existing = 1,
  12148.                             @snapshot_jobid = @job_id
  12149.                         IF (@retcode <> 0 or @@error<>0)
  12150.                             goto UNDO
  12151.                     END
  12152.                 END
  12153.             commit tran
  12154.             fetch hcJobsToFix into @job_id, @name, @sSubsystem,
  12155.                 @server,@databasename
  12156.         end            
  12157.         close hcJobsToFix
  12158.         deallocate hcJobsToFix
  12159.     end
  12160.     return (0)
  12161. UNDO:
  12162.     if @@trancount <> 0
  12163.         rollback tran
  12164.     return (1)
  12165. GO
  12166.  
  12167. /*
  12168.  * Name :       sp_MShelpconflictpublications
  12169.  * Description: This sp returns a list of publications or subscriptions in the current
  12170.  *    database that may have conflicts. Results are ordered by publication
  12171.  *    name.
  12172.  * Parameters:  1. publication_type( sysname; '%'==ALL (default) | 'merge' | 'queued' )
  12173.  * Output Result Set has the following structure:
  12174.  *  ----------------------------------------------------------------------------------
  12175.  *      Name                Datatype                Description
  12176.  *  ----------------------------------------------------------------------------------
  12177.  *  a. name                    (sysname)            Publication name
  12178.  *  b. publication_type        (varchar(9))        'merge' | 'queued' | 'immediate' (reserved)
  12179.  *  c. merge_pub_id            (uniqueidentifier)    Merge publication identifier
  12180.  *  d. queued_pub_id        (integer)            Queued publication identifier (I would prefer to name this as tran_pub_id)
  12181.  *  e. sub_agent_id            (integer)            Unique publication identifier on a tran subscriber
  12182.  *  NOTE: In case of queued tran publications, either d or e will have a value at any time
  12183.  *  and this will also indicate, if we are processing a subscriber of a publication (d 
  12184.  *  will be NULL and e will have a value) or if we are processing the publisher side (d
  12185.  *  will have a value and e will be NULL)
  12186. */
  12187. raiserror('Creating procedure sp_MShelpconflictpublications', 0,1)
  12188. GO
  12189.  
  12190. CREATE PROCEDURE sp_MShelpconflictpublications ( @publication_type varchar(9) ='%' )
  12191. AS 
  12192. BEGIN
  12193.  
  12194.     SET nocount ON
  12195.     
  12196.     -- validate publication type
  12197.     IF NOT( lower(@publication_type) IN ('%', 'merge', 'queued') )
  12198.     BEGIN
  12199.         raiserror( 'invalid publication type', 16, -1 )
  12200.         RETURN (1)
  12201.     END
  12202.     
  12203.     -- temp table to store combined result set
  12204.     CREATE TABLE #result_list ( publication sysname collate database_default, publication_type VARCHAR(9) DEFAULT 'merge', 
  12205.                                 merge_pub_id UNIQUEIDENTIFIER NULL, 
  12206.                                 queued_pub_id INTEGER NULL, sub_agent_id INTEGER NULL, publisher sysname collate database_default NULL, publisher_db sysname collate database_default NULL)
  12207.  
  12208.     -- fetch merge results into temp table; need not affect any rows
  12209.     IF ( lower(@publication_type) IN ('%', 'merge') )
  12210.     BEGIN
  12211.         IF EXISTS( SELECT * FROM sysobjects WHERE name = 'sysmergepublications' )
  12212.             INSERT #result_list ( publication, merge_pub_id, publisher, publisher_db)
  12213.                 EXEC sp_MShelpmergeconflictpublications
  12214.  
  12215.         -- may return 18757 (not merge published) and that is ok if @publication_type = ALL
  12216.         IF ( @@ERROR <> 0) AND ( @@ERROR = 18757 AND @publication_type = '%' ) 
  12217.             GOTO FAILURE
  12218.                 
  12219.     END
  12220.  
  12221.     -- fetch tran results into temp table
  12222.     IF ( lower(@publication_type) IN ('%', 'queued') )
  12223.     BEGIN
  12224.         INSERT #result_list  ( publication, publication_type, merge_pub_id , queued_pub_id, sub_agent_id )
  12225.             EXEC sp_MShelptranconflictpublications
  12226.         IF ( @@ERROR <> 0) 
  12227.             GOTO FAILURE
  12228.  
  12229.     END
  12230.  
  12231.     -- return combined result list
  12232.     SELECT * FROM #result_list
  12233.  
  12234.     IF EXISTS( SELECT * FROM sysobjects WHERE type = 'U' AND name = '#result_list' )
  12235.         DROP TABLE #result_list
  12236.  
  12237.     RETURN (0)
  12238.  
  12239. FAILURE:
  12240.  
  12241.     IF EXISTS( SELECT * FROM sysobjects WHERE type = 'U' AND name = '#result_list' )
  12242.         DROP TABLE #result_list
  12243.  
  12244.     RETURN (1)
  12245.     
  12246. END
  12247. GO
  12248.  
  12249. raiserror('Creating function system_function_schema.fn_replgetagentcommandlinefromjobid',0,1)
  12250. go
  12251. --
  12252. -- Name: fn_replgetagentcommandlinefromjobid
  12253. --
  12254. -- Description: This function retrieves the command line  
  12255. --              of the replication agent with the 
  12256. --              specified job_id.
  12257. --
  12258. -- Parameters: @agenttype nvarchar(16)
  12259. --             @job_id uniqueidentifier
  12260. -- 
  12261. -- Returns: nvarchar(3200) 
  12262. --
  12263. -- Notes: This function can return null if the 
  12264. --        the given job_id doesn't belong to a
  12265. --        replication agent of the specified type.
  12266. --
  12267. -- Security: Admin access only
  12268. -- 
  12269. create function system_function_schema.fn_replgetagentcommandlinefromjobid (
  12270.     @agenttype nvarchar(16),
  12271.     @job_id uniqueidentifier
  12272.     ) returns nvarchar(3200)
  12273. as
  12274. begin
  12275.     declare @commandline nvarchar(3200)
  12276.     select @commandline = null
  12277.     
  12278.     select @commandline = command 
  12279.       from msdb.dbo.sysjobsteps
  12280.      where job_id = @job_id
  12281.        and upper(subsystem) = upper(@agenttype) collate database_default
  12282.  
  12283.     return @commandline
  12284. end
  12285. go
  12286.  
  12287. raiserror('Creating procedure sp_replproberemoteserver', 0,1)
  12288. go
  12289. --
  12290. -- Name: sp_replproberemoteserver
  12291. --
  12292. -- Description: This is a lightweight wrapper for calling xp_replproberremsrv
  12293. --              with the added nicety of looking up the agent command line
  12294. --              using the given jobid. This procedure supports two different
  12295. --              modes of operation based on the @no_rpc parameter. If the 
  12296. --              @no_rpc parameter is 1, this procedure will not attempt to make
  12297. --              rpc call to the Distributor. The local mode is mainly useful 
  12298. --              for verifying remote pull subscription agent.
  12299. -- 
  12300. -- Parameters: @remoteservername sysname (mandatory) 
  12301. --             @agent_type nvarchar(16) (optional, default = null) 
  12302. --             @agent_jobid uniqueidentifier (optional default = null)
  12303. --             @no_rpc bit (optional default = 0)
  12304. --
  12305. -- Notes: If @job_id is null, only activation verification will be carried
  12306. --        out.
  12307. --
  12308. -- Security: Execute permission of this procedure is granted to public
  12309. --
  12310. -- Result: 'probe_succeeded' 0 or 1
  12311. --
  12312. -- Returns: 0    - succeeded
  12313. --          <> 0 - failed
  12314. --
  12315. create procedure dbo.sp_replproberemoteserver (
  12316.     @remoteservername sysname,
  12317.     @agent_type       nvarchar(16) = null,
  12318.     @agent_jobid      uniqueidentifier = null,
  12319.     @no_rpc           bit = 0
  12320.     ) 
  12321. as
  12322. begin
  12323.     set nocount on
  12324.     declare @retcode        int
  12325.     declare @commandline    nvarchar(3200)
  12326.     declare @distributor    sysname
  12327.     declare @distributiondb sysname     
  12328.     declare @distproc       nvarchar(255)
  12329.     declare @succeeded      nvarchar(10)
  12330.  
  12331.     select @retcode = 0
  12332.     select @commandline = null
  12333.     select @succeeded = null
  12334.  
  12335.     if @agent_type is null
  12336.     begin
  12337.         select @agent_type = 'distribution'
  12338.     end
  12339.     
  12340.     -- @remoteservername cannot be null or empty
  12341.     select @remoteservername = rtrim(ltrim(@remoteservername))
  12342.     if @remoteservername is null or
  12343.        @remoteservername = N''
  12344.     begin
  12345.         raiserror(21263,16,-1,'@remoteservername')
  12346.         return 1
  12347.     end     
  12348.     
  12349.     -- @agent_type must be 'distribution' or 'merge'
  12350.     if @agent_type not in (N'distribution', N'merge')
  12351.     begin
  12352.         raiserror(21182,16,-1) 
  12353.         return 1
  12354.     end
  12355.  
  12356.     -- Get Distributor information
  12357.     if @no_rpc = 0
  12358.     begin
  12359.         exec @retcode = dbo.sp_helpdistributor @rpcsrvname = @distributor output,
  12360.                                           @distribdb = @distributiondb output
  12361.         if @@error <> 0 or @retcode <> 0
  12362.             return 1
  12363.     end
  12364.     else
  12365.     begin
  12366.         select @distributor = @@servername
  12367.     end
  12368.  
  12369.     if upper(@@servername) <> upper(@distributor)
  12370.     begin
  12371.         select @distproc = ltrim(rtrim(@distributor)) + '.' + 
  12372.             'master.dbo.sp_replproberemoteserver'
  12373.         exec @retcode = @distproc @remoteservername, 
  12374.                                   @agent_type, 
  12375.                                   @agent_jobid, 
  12376.                                   1
  12377.         return @retcode
  12378.     end        
  12379.     else
  12380.     begin
  12381.         -- If the given @job_id is not null, try to get
  12382.         -- the agent command line
  12383.         if @agent_jobid is not null 
  12384.         begin
  12385.             select @commandline = fn_replgetagentcommandlinefromjobid(
  12386.                 @agent_type,
  12387.                 @agent_jobid) collate database_default
  12388.  
  12389.             if @commandline is null
  12390.             begin
  12391.                 raiserror(21361,6,-1, @agent_type) 
  12392.                 select 'probe_succeeded' = 0
  12393.                 return 1
  12394.             end
  12395.  
  12396.         end 
  12397.  
  12398.         exec @retcode = master.dbo.xp_replproberemsrv 
  12399.             @remoteservername, 
  12400.             @agent_type, 
  12401.             @succeeded output,
  12402.             @commandline 
  12403.  
  12404.         if lower(@succeeded) = N'true'  
  12405.             select 'probe_succeeded' = 1
  12406.         else
  12407.             select 'probe_succeeded' = 0
  12408.  
  12409.         return @retcode
  12410.     end
  12411.  
  12412.     select 'probe_succeeded' = 0
  12413.  
  12414.     return 1
  12415. end
  12416. go
  12417. exec sp_MS_marksystemobject sp_replproberemoteserver
  12418. go
  12419. grant execute on dbo.sp_replproberemoteserver to public
  12420. go
  12421.  
  12422. raiserror('Creating procedure sp_MScleanupmergepublisher', 0,1)
  12423. go
  12424. --
  12425. -- Name: sp_MScleanupmergepublisher
  12426. -- 
  12427. -- Description: This procedure currently performs the following function(s):
  12428. --              1) Cleans up all the stale dynamic snapshot views
  12429. --              in all databases enabled for merge replication. This 
  12430. --              procedure should normally be called at merge publisher startup.
  12431. --              
  12432. -- Notes: 1)This procedure is enabled as a startup procedure when a database is
  12433. --        enabled as a first merge publisher database on the server and it 
  12434. --        will be unmarked as a startup procedure when the last merge publisher
  12435. --        database is disabled.
  12436. --        2)Errors within the SP are mostly ignored.
  12437. --        3)This procedure can also be used by admins/securityadmins to perform
  12438. --        manual cleanup of all dynamic snapshot views. Note that cleaning up the 
  12439. --        dynamic snapshot views can disrupt dynamic snapshots that are being generated.
  12440. --        
  12441. -- Returns: (undefined)
  12442. --
  12443. -- Security: Only members of the sysadmin fixed server role can execute this
  12444. --           procedure successfully. So for this procedure to function proprely 
  12445. --           as a startup procedure, the MSSQLServer service account must be a 
  12446. --           member of the sysadmin role.
  12447. --
  12448. create procedure sp_MScleanupmergepublisher
  12449. as
  12450. begin
  12451.     set nocount on
  12452.     declare @status_mask int
  12453.     declare @published_mask int
  12454.     declare @published_database_name sysname
  12455.     declare @command nvarchar(4000)
  12456.  
  12457.     -- Masks off the databases with status that we don't want to deal with
  12458.     select @status_mask = 32 | -- loading
  12459.                           64 | -- pre recovery
  12460.                           128 | -- recovering
  12461.                           256 | -- not recovered
  12462.                           512 | -- offline
  12463.                           1024  -- read only
  12464.  
  12465.     select @published_mask = 4 -- Merge published
  12466.  
  12467.     declare hPublishedDatabase cursor local fast_forward for
  12468.         select name from sysdatabases 
  12469.          where (status & @status_mask) = 0
  12470.            and (category & @published_mask) <> 0
  12471.  
  12472.     open hPublishedDatabase
  12473.  
  12474.     fetch hPublishedDatabase into @published_database_name
  12475.     while  (@@fetch_status <> -1)
  12476.     begin
  12477.  
  12478.         select @command = 'use ' + QUOTENAME(@published_database_name) + '
  12479. ' +                       'exec sp_MScleanupmergepublisherdb'
  12480.  
  12481.  
  12482.         exec (@command)
  12483.         -- Ignore errors
  12484.         fetch hPublishedDatabase into @published_database_name
  12485.     end
  12486.  
  12487.     close hPublishedDatabase
  12488.     deallocate hPublishedDatabase
  12489.  
  12490. end
  12491. go
  12492. exec sp_MS_marksystemobject sp_MScleanupmergepublisher
  12493. go
  12494.  
  12495. --
  12496. -- Name: sp_MScleanupdynsnapshotvws
  12497. --
  12498. -- Description: This procedure is used to drop all the views listed in the     
  12499. --              MSdynamicsnapshotviews table of the publisher database. It is 
  12500. --              typically called by the merge cleanup procedure 
  12501. --              (sp_MScleanupmergepublisherdb) during server startup although
  12502. --              the database administrator can choose to proactively call this
  12503. --              procedure manually to clean up any temporary dynamic snapshot
  12504. --              views left over from an abnormally terminated dynamic snapshot
  12505. --              generation session.
  12506. --
  12507. -- Parameter: (none) 
  12508. --                 
  12509. -- Notes: Calling this procedure while a dynamic snapshot is being generated 
  12510. --        will probably disrupt the said dynamic snapshot generation session.
  12511. -- 
  12512. -- Returns: 0 - succeeded
  12513. --          1 - failed
  12514. -- 
  12515. -- Result: none
  12516. --
  12517. -- Security: Execute permission of this procedure is granted to public. 
  12518. --           Internally, this procedure will call sp_MSreplcheck_publish
  12519. --           to make sure that the caller is either server sysadmin or dbo 
  12520. --           of the publishing database
  12521. --              
  12522. raiserror('Creating procedure sp_MScleanupdynsnapshotvws', 0,1)
  12523. go
  12524. create procedure sp_MScleanupdynsnapshotvws
  12525. as
  12526. begin
  12527.     set nocount on    
  12528.     declare @retcode int
  12529.     select @retcode = 0
  12530.     
  12531.     -- Security check
  12532.     exec @retcode = sp_MSreplcheck_publish
  12533.     if @@error<>0 or @retcode<>0
  12534.     begin
  12535.         return 1
  12536.     end
  12537.  
  12538.     -- Do nothing if the MSdynamicsnapshotviews table does not exist
  12539.     if exists (select * from sysobjects where name = N'MSdynamicsnapshotviews')
  12540.     begin
  12541.         declare @dynamic_snapshot_view_name sysname
  12542.         declare @drop_view_command nvarchar(4000) 
  12543.  
  12544.         declare hViews cursor local fast_forward for
  12545.          select dynamic_snapshot_view_name
  12546.            from MSdynamicsnapshotviews
  12547.         if @@error<>0
  12548.         begin
  12549.             goto Failure
  12550.         end
  12551.         
  12552.         open hViews
  12553.         if @@error<>0
  12554.         begin
  12555.            goto Failure
  12556.         end
  12557.     
  12558.         fetch hViews into @dynamic_snapshot_view_name
  12559.         while (@@fetch_status<>-1)
  12560.         begin
  12561.             select @drop_view_command = 'drop view ' + 
  12562.                 quotename(@dynamic_snapshot_view_name)
  12563.             exec(@drop_view_command)
  12564.             if @@error<>0
  12565.             begin
  12566.                 select @retcode = 1 -- Just to indicate that a failure occurred
  12567.             end        
  12568.             delete from MSdynamicsnapshotviews
  12569.              where dynamic_snapshot_view_name = @dynamic_snapshot_view_name
  12570.             if @@error<>0
  12571.             begin
  12572.                 select @retcode = 1 -- Just to indicate that a failure occurred
  12573.             end        
  12574.             fetch hViews into @dynamic_snapshot_view_name
  12575.         end
  12576.     end
  12577.     return @retcode
  12578. Failure:
  12579.     return 1
  12580. end
  12581. go
  12582. exec sp_MS_marksystemobject 'sp_MScleanupdynsnapshotvws'
  12583. go
  12584. raiserror('Creating procedure sp_MScleanupmergepublisherdb',0,1)
  12585. go
  12586. --
  12587. -- Name: sp_MScleanupmergepublisherdb
  12588. --
  12589. -- Description: This procedure is the per-database analogue of 
  12590. --              sp_MScleanupmergepublisher and it currently performs the 
  12591. --              following function(s):
  12592. --              1) Cleans up all the stale dynamic snapshot views
  12593. --              in the current database.
  12594. --
  12595. -- Returns: (undefined)
  12596. --
  12597. -- Security: Only members of the sysadmin fixed server role can execute this
  12598. --           procedure.
  12599. --
  12600. create procedure sp_MScleanupmergepublisherdb
  12601. as
  12602. begin
  12603.     set nocount on
  12604.     declare @temp_login sysname
  12605.  
  12606.     if exists (select * from sysobjects
  12607.         where name = 'MSdynamicsnapshotviews')
  12608.     begin
  12609.         -- Ignore errors
  12610.         exec sp_MScleanupdynsnapshotvws
  12611.     end
  12612.  
  12613. end
  12614. go
  12615. exec sp_MS_marksystemobject sp_MScleanupmergepublisherdb 
  12616. go
  12617.  
  12618. raiserror('Creating procedure sp_MShelp_replication_table',0,1)
  12619. go
  12620. --
  12621. -- Name: sp_MShelp_replication_table
  12622. --
  12623. -- Description: This procedure is used by DMO to get tables can be published and
  12624. --                their properties
  12625. --
  12626. -- Returns: error code
  12627. --
  12628. -- Security: public
  12629. --
  12630. CREATE PROCEDURE sp_MShelp_replication_table (
  12631.     @table_name sysname = NULL,
  12632.     @table_owner sysname = NULL
  12633.     ) 
  12634. AS
  12635.  
  12636. SET NOCOUNT ON
  12637.  
  12638. declare @objid int
  12639.  
  12640. if @table_name is not null
  12641. begin
  12642.     if @table_owner is NULL
  12643.         select @table_owner = user_name()
  12644.     declare @qualified_table_name    nvarchar(260)
  12645.     select @qualified_table_name = QUOTENAME(@table_owner) + '.' + QUOTENAME(@table_name)
  12646.     select @objid = object_id(@qualified_table_name)
  12647.     if @objid is null
  12648.     begin
  12649.         RAISERROR (14027, 11, -1, @qualified_table_name)
  12650.         return(1)
  12651.     end
  12652. end
  12653.  
  12654. create table #merge_objects (objid int primary key)
  12655.  
  12656. create table #queued_tran_objects (objid int primary key)
  12657.  
  12658. if object_id('sysmergearticles') is not null
  12659.     insert into #merge_objects select distinct objid from sysmergearticles where 
  12660.         objid = @objid or @objid is null
  12661.  
  12662. if object_id('sysarticles') is not null
  12663.     insert into #queued_tran_objects select distinct objid from sysarticles a,
  12664.         syspublications p where 
  12665.         (objid = @objid or @objid is null) and 
  12666.         a.pubid = p.pubid and
  12667.         p.allow_queued_tran = 1
  12668.  
  12669. select    'table name' = o.name, 
  12670.         'table owner' = user_name(o.uid), 
  12671.         'ID' = o.id, 
  12672.         'Category' = o.category,
  12673.         'HasGuidColumn' = case when 
  12674.                 exists (select * from syscolumns c where c.id = o.id and
  12675.                 xtype = (select xtype from systypes where name = 'uniqueidentifier')) 
  12676.             then cast(1 as bit) 
  12677.             else cast(0 as bit)
  12678.             end,
  12679.         'HasTimeStampColumn' = ObjectProperty(o.id, 'TableHasTimestamp'),
  12680.         'HasRowVersionColumn' = case when 
  12681.                 exists (select * from syscolumns c where c.id = o.id and 
  12682.                 name = N'msrepl_tran_version')
  12683.             then cast(1 as bit) 
  12684.             else cast(0 as bit)
  12685.             end,
  12686.         'HasIdentityColumn' = ObjectProperty(o.id, 'TableHasIdentity'),
  12687.         'HasSQLVariantColumn' = case when 
  12688.                 exists (select * from syscolumns c where c.id = o.id and
  12689.                 xtype = (select xtype from systypes where name = 'sql_variant')) 
  12690.             then cast(1 as bit) 
  12691.             else cast(0 as bit)
  12692.             end,
  12693.         'HasBigIntColumn' = case when 
  12694.                 exists (select * from syscolumns c where c.id = o.id and
  12695.                 xtype = (select xtype from systypes where name = 'bigint'))
  12696.             then cast(1 as bit) 
  12697.             else cast(0 as bit)
  12698.             end,
  12699.         'HasBigIntIdentityColumn' = case when 
  12700.                 exists (select * from syscolumns c where c.id = o.id and
  12701.                 ColumnProperty(o.id, c.name, 'IsIdentity') = 1 and
  12702.                 xtype = (select xtype from systypes where name = 'bigint'))
  12703.             then cast(1 as bit) 
  12704.             else cast(0 as bit)
  12705.             end,
  12706.         'MergePublished' = case when exists (select * from #merge_objects m where
  12707.             m.objid = o.id)
  12708.             then cast(1 as bit) 
  12709.             else cast(0 as bit)
  12710.             end,
  12711.         'QueuedTranPublished' = case when exists (select * from #queued_tran_objects m where
  12712.             m.objid = o.id)
  12713.             then cast(1 as bit) 
  12714.             else cast(0 as bit)
  12715.             end,
  12716.         'HasIdentityNotForReplColumn' = case when 
  12717.                 exists (select * from syscolumns c where c.id = o.id and 
  12718.                     ColumnProperty(o.id, c.name, 'IsIdNotForRepl') = 1)
  12719.             then cast(1 as bit) 
  12720.             else cast(0 as bit)
  12721.             end
  12722.  
  12723.         from sysobjects o where o.xtype = 'U' and 
  12724.             ObjectProperty(o.id, 'IsMSShipped') = 0 and
  12725.             (o.id = @objid or @objid is null)
  12726.             order by 1, 2
  12727.             
  12728. drop table #merge_objects
  12729. drop table #queued_tran_objects
  12730. go
  12731. exec sp_MS_marksystemobject sp_MShelp_replication_table
  12732. grant execute on dbo.sp_MShelp_replication_table to public
  12733. go
  12734. create proc sp_MScopyscriptfile (
  12735.     @scriptfile nvarchar(4000), 
  12736.     @cmd nvarchar(4000) OUTPUT
  12737. )
  12738. as
  12739. declare @directory nvarchar(4000)
  12740. declare @filename nvarchar(1024)
  12741. declare @subdirectory nvarchar(1024)
  12742. declare @retcode int
  12743.  
  12744. IF @scriptfile IS NULL
  12745. BEGIN
  12746.     RAISERROR (14043, 16, -1, '@scriptfile')
  12747.     RETURN (1)
  12748. END
  12749. -- Create the directory on distributor to store script.
  12750. exec sp_helpdistributor @directory=@directory OUTPUT
  12751. select @subdirectory = convert(nvarchar(64), GetDate(), 121)
  12752. select @subdirectory = replace(@subdirectory, N'-', N'')
  12753. select @subdirectory = replace(@subdirectory, N' ', N'')
  12754. select @subdirectory = replace(@subdirectory, N':', N'')
  12755. select @subdirectory = replace(@subdirectory, N'.', N'')
  12756. if(right(@directory, 1) = N'\')
  12757.     select @directory = @directory + @subdirectory
  12758. else
  12759.     select @directory = @directory + N'\' + @subdirectory
  12760. select @cmd = N'md "' + @directory + '"'
  12761. exec @retcode = master..xp_cmdshell @cmd, NO_OUTPUT
  12762. if(@retcode <> 0)
  12763. begin
  12764.     raiserror(21330, 16, -1, @cmd)
  12765.     return (1)
  12766. end
  12767.  
  12768. -- Copy script to distributor
  12769. select @cmd = N'copy "' + @scriptfile + N'" "' + @directory + N'"'
  12770. exec @retcode = master..xp_cmdshell @cmd, NO_OUTPUT
  12771. if(@retcode <> 0)
  12772. begin 
  12773.     raiserror(21331, 16, -1, @cmd)
  12774.     return (1)
  12775. end
  12776.  
  12777. -- Prepare command, to be posted to log
  12778. select @filename = right(@scriptfile, charindex(N'\', reverse(@scriptfile)))
  12779. if(left(@filename, 1) = N'\')    
  12780.     select @cmd = @directory + @filename
  12781. else
  12782.     select @cmd = @directory + N'\' + @filename
  12783. go
  12784. exec sp_MS_marksystemobject sp_MScopyscriptfile
  12785. go
  12786. grant execute on dbo.sp_MScopyscriptfile to public
  12787. go
  12788. /*
  12789. ** Add extended stored procedures for replication support.
  12790. */
  12791. sp_addextendedproc  'sp_repldone', 'repldone extended procedure'
  12792. go
  12793.  
  12794. sp_addextendedproc  'sp_repltrans', 'repltrans extended procedure'
  12795. go
  12796.  
  12797. sp_addextendedproc  'sp_replcounters', 'replcounters extended procedure'
  12798. go
  12799.  
  12800. sp_addextendedproc  'sp_replcmds', 'replcmds extended procedure'
  12801. go
  12802.  
  12803. sp_addextendedproc  'sp_replflush', 'replflush extended procedure'
  12804. go
  12805.  
  12806. dump tran master with no_log
  12807. go
  12808.  
  12809. sp_addextendedproc  'sp_replpostcmd', 'replpostcmd extended procedure'
  12810. go
  12811. sp_addextendedproc  'sp_replpostschema', 'replpostschema extended procedure'
  12812. go
  12813.  
  12814. sp_addextendedproc  'sp_replincrementlsn', 'replincrementlsn extended procedure'
  12815. go
  12816.  
  12817. sp_addextendedproc  'sp_replupdateschema', 'replupdateschema extended procedure'
  12818. go
  12819.  
  12820. sp_addextendedproc  'sp_replsetoriginator', 'replsetoriginator extended procedure'
  12821. go
  12822.  
  12823. sp_addextendedproc  'sp_replsetsyncstatus', 'replsetsyncstatus extended procedure'
  12824. go
  12825.  
  12826. sp_addextendedproc  'sp_replpostsyncstatus', 'replpostsyncstatus extended procedure'
  12827. go
  12828.  
  12829. /*
  12830. ** Add xp_enum_dsn extended procedure
  12831. */
  12832. sp_addextendedproc 'xp_dsninfo','xpstar.dll'
  12833. go
  12834. exec dbo.sp_MS_marksystemobject xp_dsninfo
  12835. go
  12836.  
  12837. /*
  12838. ** Add xp_enum_dsn extended procedure
  12839. */
  12840. sp_addextendedproc 'xp_enumdsn','xpstar.dll'
  12841. go
  12842. exec dbo.sp_MS_marksystemobject xp_enumdsn
  12843. go
  12844.  
  12845. /*
  12846. ** Add xp_oledbinfo extended procedure
  12847. */
  12848. sp_addextendedproc 'xp_oledbinfo','xprepl.dll'
  12849. go
  12850. exec dbo.sp_MS_marksystemobject xp_oledbinfo
  12851. go
  12852.  
  12853. /*
  12854. ** Add xp_repl_encrypt extended procedure
  12855. */
  12856. sp_addextendedproc 'xp_repl_encrypt','xprepl.dll'
  12857. go
  12858. exec dbo.sp_MS_marksystemobject xp_repl_encrypt
  12859. go
  12860.  
  12861.  
  12862. /*
  12863. ** Add xp_repl_convert_encrypt extended procedure
  12864. */
  12865. sp_addextendedproc 'xp_repl_convert_encrypt','xprepl.dll'
  12866. go
  12867. exec dbo.sp_MS_marksystemobject xp_repl_convert_encrypt
  12868. go
  12869.  
  12870.  
  12871.  
  12872. /*
  12873. ** Add xp_repl_convert_encrypt extended procedure
  12874. */
  12875. sp_addextendedproc 'xp_repl_help_connect','xprepl.dll'
  12876. go
  12877. exec dbo.sp_MS_marksystemobject xp_repl_help_connect
  12878. go
  12879.  
  12880.  
  12881.  
  12882. /*
  12883. ** Add xp_replproberemsrv extended procedure
  12884. */
  12885. sp_addextendedproc 'xp_replproberemsrv','xprepl.dll'
  12886. go
  12887. exec dbo.sp_MS_marksystemobject xp_replproberemsrv
  12888. go
  12889.  
  12890. dump tran master with no_log
  12891. go
  12892.  
  12893. grant execute on dbo.sp_addpublication_snapshot to public
  12894. go
  12895. grant execute on dbo.sp_MShelpobjectpublications to public
  12896. go
  12897. grant execute on dbo.sp_helpreplicationdb to public
  12898. go
  12899. grant execute on dbo.sp_enumdsn to public
  12900. go
  12901. grant execute on dbo.sp_helpsubscriberinfo to public
  12902. go
  12903. grant execute on dbo.sp_replica to public
  12904. go
  12905. grant execute on dbo.sp_distcounters to public
  12906. go
  12907. grant execute on dbo.sp_helpdistributor to public
  12908. go
  12909. grant execute on dbo.sp_helpdistributiondb to public
  12910. go
  12911. grant execute on dbo.sp_helpdistpublisher to public
  12912. go
  12913. grant execute on dbo.sp_replcounters to public
  12914. go
  12915. grant execute on dbo.sp_MShelp_distdb to public
  12916. go
  12917. grant execute on dbo.sp_grant_publication_access to public
  12918. go
  12919. grant execute on dbo.sp_revoke_publication_access to public
  12920. go
  12921. grant execute on dbo.sp_help_publication_access to public
  12922. go
  12923. grant execute on dbo.sp_check_publication_access to public
  12924. go
  12925. grant execute on dbo.sp_replsetoriginator to public
  12926. go
  12927.  
  12928.  
  12929. GRANT EXECUTE ON dbo.sp_MShelpconflictpublications TO PUBLIC
  12930. GO
  12931.  
  12932. grant execute on dbo.sp_repldone to public
  12933. go
  12934. grant execute on dbo.sp_repltrans to public
  12935. go
  12936. grant execute on dbo.sp_replcounters to public
  12937. go
  12938. grant execute on dbo.sp_replcmds to public
  12939. go
  12940. grant execute on dbo.sp_replpostschema to public
  12941. go
  12942. grant execute on dbo.sp_replincrementlsn to public
  12943. go
  12944. grant execute on dbo.sp_replsetsyncstatus to public
  12945. go
  12946. grant execute on dbo.sp_replpostsyncstatus to public
  12947. go
  12948. grant execute on sp_MSenum_replication_job to public
  12949. go
  12950. grant execute on sp_MSrepl_gettype_mappings to public
  12951. go
  12952. grant execute on dbo.xp_replproberemsrv to public
  12953. grant execute on sp_MShelp_replication_status to public
  12954. grant execute on sp_MSenum_replication_agents to public
  12955. -- proc need to be granted to public for replmonitor role
  12956. grant execute on sp_help_agent_default to public
  12957. grant execute on sp_help_agent_profile to public
  12958. grant execute on sp_help_agent_parameter to public
  12959. grant execute on sp_helpdistributor_properties to public
  12960. grant execute on sp_MScleanupdynsnapshotvws to public
  12961. grant execute on sp_MSget_agent_names to public
  12962. go
  12963.  
  12964.  
  12965. dump tran master with no_log
  12966. go
  12967.  
  12968.  
  12969.  
  12970. dump tran master with no_log
  12971. go
  12972. sp_configure 'allow updates',0
  12973. go
  12974. reconfigure with override
  12975. go
  12976.  
  12977. print ''
  12978. print 'Checking objects created by replcom.sql.'
  12979. go
  12980. --obsolete   exec dbo.sp_check_objects 'repl'
  12981. exec dbo.sp_MS_upd_sysobj_category 2  --set sysobjects.category | 2 based on crdate.
  12982. go
  12983.  
  12984. print ''
  12985. print 'replcom.sql completed successfully.'
  12986. go
  12987.  
  12988. dump tran master with no_log
  12989. go
  12990. checkpoint
  12991. go
  12992. -- - -----
  12993.