昨天有个十多年的项目突然无法正常查询,通过排查发现其使用truncate table remote远程数据库上的表,第一眼有点懵逼。从没有使用过这种方法,通过百度得出
要想在本地访问服务器上的数据库数据得先执行两个存储过程:
exec sp_addlinkedserver '[目标服务器]','','SQLOLEDB','[服务器]' exec sp_addlinkedsrvlogin '[目标服务器]', 'false', NULL, '[数据库账号]', '[数据库密码]' 执行完后便可以访问了 select * into [表名] from [目标服务器].[数据库].dbo.[表名]
故以本机执行以下T-SQL
--gamedb
declare @ServerName varchar(128)
declare @IP varchar(15)
declare @Database varchar(128)
declare @Password varchar(128)
set @ServerName ='服务器名'
set @IP ='服务器IP'
set @Database ='访问数据库库名'
set @Password ='密码'
exec sp_addlinkedserver
@server = @ServerName,
@srvproduct = '',
@provider = 'SQLOLEDB',
@datasrc = @IP,
@catalog = @Database
exec sp_addlinkedsrvlogin
@rmtsrvname = @ServerName,
@useself = 'true',
@rmtuser = '访问账号',
@rmtpassword = @Password
exec sp_serveroption
@server = @ServerName,
@optname = 'RPC',
@optvalue = 'true'
exec sp_serveroption
@server = @ServerName,
@optname = 'RPC out',
@optvalue = 'true'
EXEC sp_addlinkedsrvlogin @ServerName, 'TRUE'
报错提示用户没有操作权限,我登录的账号是管理员的账号,于是乎
查看当前USER为guest,执行下面赋权语句
SELECT CURRENT_USER;
GRANT EXECUTE ON SYS.XP_PROP_OLEDB_PROVIDER TO guest;
此过程并没有解决相关问题,通过查询,可能和计算机名有关,只好远程到数据库服务器。通过服务器本机执行
首先查询select * from sysservers
看到系统存储有该访问linkedserver,判断可能是访问数据库密码更换原因
决定先删除重新执行
进行删除操作
sp_configure 'allow updates', 1 RECONFIGURE WITH OVERRIDE delete from sysservers where srvname='连接对方数据库IP' sp_configure 'allow updates', 0 RECONFIGURE WITH OVERRIDE
注:(此过程需逐步执行)
最后执行上面的T-SQL成功解救问题