【问题标题】:Service Broker: How can I detect the script is executed on the wanted machine?Service Broker:如何检测脚本是否在所需机器上执行?
【发布时间】:2012-11-03 20:24:21
【问题描述】:

我的 SQL 脚本是从模板生成的。它们包含 IP 地址。它们可能很多,操作员可能会错误地执行不正确的脚本。脚本如何检查它是否在正确的机器上启动? (否则,我想打印消息并退出。)

有可能吗?

谢谢, 彼得

【问题讨论】:

标签: sql-server service-broker


【解决方案1】:

更新答案

这是我从http://weblogs.sqlteam.com/peterl/archive/2008/07/16/How-to-get-IP-address.aspx 找到的脚本,经过一些修改以更好地满足您的需求:

DECLARE @TargetIpAddress varchar(15);
SET @TargetIpAddress = '127.0.0.1'; --<== The IP address of the server you want.

DECLARE @Interfaces TABLE
(
    RowID int IDENTITY(0, 1)
   ,Interface char(38)
   ,IP varchar(15)
);

INSERT @Interfaces ( Interface )
  EXEC master..xp_regenumkeys N'HKEY_LOCAL_MACHINE',
       N'System\CurrentControlSet\Services\TcpIP\Parameters\Interfaces';

DECLARE @RowID int
       ,@IP varchar(15)
       ,@Key nvarchar(200);

SELECT @RowID = MAX(RowID)
  FROM @Interfaces;

WHILE @RowID >= 0
BEGIN
    SELECT @Key = N'System\CurrentControlSet\Services\TcpIP\Parameters\Interfaces\' + Interface
     FROM @Interfaces
    WHERE RowID = @RowID;

    EXEC master..xp_regread N'HKEY_LOCAL_MACHINE', @Key, N'DhcpIPAddress', @IP OUTPUT;

    IF @IP <> '0.0.0.0'
    UPDATE @Interfaces
       SET IP = @IP
     WHERE RowID = @RowID;

    SET @RowID = @RowID - 1;
END;

IF NOT EXISTS (SELECT IP FROM @Interfaces WHERE IP = @TargetIpAddress)
BEGIN
    DECLARE @ErrorMessage varchar(2000);
    SET @ErrorMessage  = 'This is not the correct server. This server does not have an IP address of %s.';
    SET @TargetIpAddress = ISNULL(@TargetIpAddress, 'NULL');
    RAISERROR(@ErrorMessage, 16, 1, @TargetIpAddress);
END

-- The rest of the script...

原答案

似乎使用 Server\Instance 名称而不是 IP 地址会更容易使用,并且如果以后为服务器分配了不同的 IP 地址,则不太可能中断。

-- You can get the instance name like this:
SELECT @@SERVERNAME +'\'+ @@SERVICENAME AS 'Instance';

-- Although, you might prefer this instead:
SELECT CAST(SERVERPROPERTY('MachineName') AS nvarchar(128))
      +COALESCE('\'+CAST(SERVERPROPERTY('InstanceName') AS nvarchar(128)), '');

-- NetBIOS name of the local computer on which the instance of SQL Server
-- is currently running.
-- If the instance of SQL Server is in a failover cluster and you want to obtain
-- the name of the failover clustered instance, use the MachineName property. 
SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS');

您可以在MSDN: SERVERPROPERTY (Transact-SQL) 找到有关 SERVERPROPERTY 函数的详细信息。虽然,此函数不提供任何方式来获取服务器/实例的 IP 地址 - 没有提供此信息的内置函数。

【讨论】:

  • +1 由于各种原因我更喜欢 IP,但您的回答对我来说也很有价值。谢谢。
  • 如果您也想封装代码,可以将我在更新答案中包含的脚本包装到存储过程中。
【解决方案2】:
Create Procedure P_GetIPAddresses (@IPS varchar(4000) out)
as
begin
Select @IPS=''
Create TABLE #temp (Line varchar(200))
Insert #temp exec master..xp_cmdshell 'ipconfig'
Select @IPS = @IPS + Coalesce(RTRIM(Replace(SubString(Line,1,CharIndex(':',line)-1)  ,'.','')) + SubString(Line,CharIndex(':',line) ,200),'')
from #temp
where upper (Line) like '%ADRESS%'
--SELECT * from #tmp --DEBUG
DROP TABLE #temp

end 

xp_cmdshell 禁用时的用法,解析地址由您决定...

EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO


Declare @IPS Varchar(4000)

exec P_GetIPAddresses @IPS out
Select  @IPS

EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 0
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

【讨论】:

  • 嗯...我仍然不喜欢ipconfig 解决方案。你觉得比stackoverflow.com/a/9622810/1346705好吗?
  • 似曾相识……是你不喜欢的xp_cmdshel还是ipconfig?
  • 好吧,两者都有。如果可以使用内置机制获得相同的信息,我觉得我不应该使用外部工具。您对 chris.leonard 提到的sys.dm_exec_connections 有任何经验吗?我尝试了他的解决方案(请参阅参考资料)并且它有效。但是,我不知道它是如何工作的,以及它是否是正确的方式。
  • Select local_net_address from sys.dm_exec_connections where session_ID= @@SPID 工作正常,如果你连接到远程服务器,如果你在本地机器上运行脚本,它将为 NULL
【解决方案3】:

我可以提供一个 xp_GetIP.dll,但仅使用 SQL-Server 2005 32 位测试 您可以通过以下方式注册

EXEC sp_addextendedproc xp_GetIP, 'C:\temp\xpGetIP.dll'

电话会是

Declare @IP varchar(100)

exec xp_GetIP @IP output
print @IP

仅输出:192.168.69.69

编辑: 使用 SQL-Server 2008 R2 64 位和 64 位 DLL

【讨论】:

    【解决方案4】:

    很抱歉重新发布,但对总是错过访问 SQL-Server 中的 systemadata 的机会感到恼火,我决定编写一个扩展存储过程作为 WMI 的桥梁。

    下载http://bummisoft.de/download/XP_WMI.zip

    电话是:

    exec xp_wmiv3 'Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE'
    

    该 DLL 可用于 32 位和 64 位 SQLServer,并且可免费用于非商业用途。

    安装:

    EXEC sp_addextendedproc xp_wmiv3, '<Your Path>\XP_WMIV3_DLL.dll'
    

    例如:EXEC sp_addextendedproc xp_wmiv3, 'C:\DLLs\XP_WMIV3_DLL.dll'

    卸载

    EXEC sp_dropextendedproc xp_wmiv3
    

    用法

    例如

    exec xp_wmiv3 'SELECT * FROM Win32_Volume'
    exec xp_wmiv3 'SELECT * FROM CIM_Userdevice where Name like "%HID%"'
    
    
    
    create table #tmp(
        Domain varchar(255),
        Name varchar(255),Sid varchar(255)
    )
    insert into #tmp 
    exec xp_wmiV2 'SELECT Domain, SID, Name FROM Win32_UserAccount where Status = "OK"'
    select * from #tmp
    drop table #tmp
    

    目前在 SQL-Server 2005 和 SQL-Server 2008 下测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多