0

6 个月以来,我的链接服务器在 SQL Server 中正常工作。一切正常,但奇怪的事情开始发生。一周前,我被告知同步无法正常工作。我发现链接的服务器已经消失了。我再次添加了它们,但 3 天后又添加了,但 3 天后它们又消失了。

我没有手动删除它们。

有没有可能是什么东西把它们去掉了?

如何防止自动删除?

Windows 服务器 2019、SQL 服务器 2017

4

2 回答 2

1

创建一个包含跟踪操作的表,例如:

CREATE TABLE EventLogTable (
    EventLogTableID INT IDENTITY PRIMARY KEY,
    EventType NVARCHAR(100),
    PostTime DATETIME,
    SPID INT,
    ServerName NVARCHAR(100),
    LoginName NVARCHAR(100),
    ObjectName NVARCHAR(100),
    ObjectType NVARCHAR(100),
    [Parameters] NVARCHAR(1000),
    TargetObjectName NVARCHAR(100),
    TargetObjectType NVARCHAR(100),
    TSQLCommand NVARCHAR(1000))

然后通过EVENTDATA()函数创建一个监控链接服务器事件的 DDL 服务器触发器:

CREATE TRIGGER utrLogLinkedServerOperations ON ALL SERVER FOR 
    CREATE_LINKED_SERVER, 
    DROP_LINKED_SERVER,
    ALTER_LINKED_SERVER
AS
BEGIN

    DECLARE @EventXML XML = EVENTDATA()  

    INSERT INTO EventLogTable (
        EventType,
        PostTime,
        SPID,
        ServerName,
        LoginName,
        ObjectName,
        ObjectType,
        [Parameters],
        TargetObjectName,
        TargetObjectType,
        TSQLCommand)
    SELECT
        EventType = @EventXML.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
        PostTime = @EventXML.value('(/EVENT_INSTANCE/PostTime)[1]', 'nvarchar(100)'),
        SPID = @EventXML.value('(/EVENT_INSTANCE/SPID)[1]', 'nvarchar(100)'),
        ServerName = @EventXML.value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(100)'),
        LoginName = @EventXML.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
        ObjectName = @EventXML.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)'),
        ObjectType = @EventXML.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(100)'),
        [Parameters] = @EventXML.value('(/EVENT_INSTANCE/Parameters)[1]', 'NVARCHAR(1000)'),
        TargetObjectName = @EventXML.value('(/EVENT_INSTANCE/TargetObjectName)[1]','nvarchar(100)'),
        TargetObjectType = @EventXML.value('(/EVENT_INSTANCE/TargetObjectType)[1]', 'nvarchar(100)'),
        TSQLCommand = @EventXML.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(1000)')

END

您可以在此处找到 XML 模式。确保启用触发器:

ENABLE TRIGGER utrLogLinkedServerOperations ON ALL SERVER

现在尝试创建、修改和删除一些链接服务器,以检查触发器是否正确地在表中创建日志。然后等待忍者攻击。

您也可以在触发器内回滚操作,但请注意,您可能最终甚至不允许所需的进程来操作链接的服务器。

于 2019-11-28T12:44:37.653 回答
0

删除链接服务器需要ALTER ANY LINKED SERVER权限。

要找出谁可以做到这一点,您应该permission在服务器级别找到谁拥有它(我在 中搜索的第二个查询sys.server_permissions)。很少有人明确授予此权限,因此您也应该在其中sysadmins进行搜索setupadmins

我还包括control server有权进行我的搜索的委托人。

请注意,即使您可以设置DDL-trigger某人,control server或者sysadmin可以在他想要放下linked servers而不被捕获时轻松禁用它。

select sp.name as RoleName,   
       member.name as MemberName  
from sys.server_role_members  rm
    join sys.server_principals as sp  
        on rm.role_principal_id = sp.principal_id  
    join sys.server_principals as member  
        on rm.member_principal_id = member.principal_id
where sp.name in ('sysadmin', 'setupadmin');

select  suser_name(grantee_principal_id), permission_name
from sys.server_permissions
where permission_name in ('ALTER ANY LINKED SERVER', 'CONTROL SERVER');
于 2019-11-28T13:38:31.620 回答