Fil*_*loo 3 sql-server transactional-replication
sp_msreplcheck_publish
是一个 sp,用于检查您是否有足够的权限运行语句来更改已发布的表(事务复制)。
尝试在没有提升权限的情况下更改已发布的表会触发tr_MStran_altertable
调用sp_MStran_ddlrepl
执行的触发器sp_msreplcheck_publish
。它正确返回:
只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行此操作。
对我来说,神秘的是我在发布的数据库或主数据库中找不到这个 sp。是按需生成的吗?
如果在一般视图中隐藏,但是如果您使用专用管理员连接进行连接,则可以通过以下方式看到它master
:
USE [master];
GO
SELECT OBJECT_DEFINITION(OBJECT_ID(N'sys.sp_msreplcheck_publish'));
Run Code Online (Sandbox Code Playgroud)
但不确定您需要查看定义的目的,或者为什么知道它的存储位置会帮助您完成任何事情。它真的很简单,而且无论它存储在哪里,你都无法更改它:
create procedure sys.sp_MSreplcheck_publish
as
begin
--
-- Do the sysadmin check first as it is 4 times more efficient
-- than is_member call and reduces performance overhead in case
-- the user has sysadmin privileges
--
if is_srvrolemember('sysadmin') = 1 or
is_member ('db_owner') = 1
begin
return (0)
end
else
begin
raiserror (21050, 14, -1)
return (1)
end
end
Run Code Online (Sandbox Code Playgroud)