sql server触发器存入远程数据库.doc
SQL code通过触发器实现数据库的即时同步 -即时同步两个表的实例: -测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test-创建测试表,不能用标识列做主键,因为不能进行正常更新-在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器if exists (select * from dbo.sysobjects where id = object_id(N'test') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table testcreate table test(id int not null constraint PK_test primary key ,name varchar(10)go-创建同步的触发器create trigger t_test on testfor insert,update,deleteasset XACT_ABORT on-启动远程服务器的MSDTC服务exec master.xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master.xp_cmdshell ''net start msdtc'',no_output"',no_output-启动本机的MSDTC服务exec master.xp_cmdshell 'net start msdtc',no_output-进行分布事务处理,如果表用标识列做主键,用下面的方法BEGIN DISTRIBUTED TRANSACTIONdelete from openrowset('sqloledb','xz''sa''',test.dbo.test) where id in(select id from deleted)insert into openrowset('sqloledb','xz''sa''',test.dbo.test) select * from insertedcommit trango-插入数据测试insert into testselect 1,'aa'union all select 2,'bb'union all select 3,'c'union all select 4,'dd'union all select 5,'ab'union all select 6,'bc'union all select 7,'ddd'-删除数据测试delete from test where id in(1,4,6)-更新数据测试update test set name=name+'_123' where id in(3,5)-显示测试的结果select * from test a full joinopenrowset('sqloledb','xz''sa''',test.dbo.test) b on a.id=b.idSQLSERVER 本地查询更新操作远程数据库的代码 复制代码代码如下: -PK select * from sys.key_constraints where object_id = OBJECT_ID('TB') -FK select * from sys.foreign_keys where parent_object_id =OBJECT_ID('TB') -创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' -查询示例 select * from ITSV.数据库名.dbo.表名 -导入示例 select * into 表 from ITSV.数据库名.dbo.表名 -以后不再使用时删除链接服务器 exec sp_dropserver 'ITSV ', 'droplogins ' -连接远程/局域网数据(openrowset/openquery/opendatasource) -1、openrowset -查询示例 select * from openrowset( 'SQLOLEDB ', 'sql服务器名 ' '用户名 ' '密码 ',数据库名.dbo.表名) -生成本地表 select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 ' '用户名 ' '密码 ',数据库名.dbo.表名) -把本地表导入远程表 insert openrowset( 'SQLOLEDB ', 'sql服务器名 ' '用户名 ' '密码 ',数据库名.dbo.表名) select *from 本地表 -更新本地表 update b set b.列A=a.列A from openrowset( 'SQLOLEDB ', 'sql服务器名 ' '用户名 ' '密码 ',数据库名.dbo.表名)as a inner join 本地表 b on a.column1=b.column1 -openquery用法需要创建一个连接 -首先创建一个连接创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' -查询 select * FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') -把本地表导入远程表 insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') select * from 本地表 -更新本地表 update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a inner join 本地表 b on a.列A=b.列A -3、opendatasource/openrowset SELECT * FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_taSQL不同服务器数据库之间的数据操作整理(完整版)-1. 创建链接服务器-1.1 创建一个链接名EXEC sp_addlinkedserver 'LinkName','','SQLOLEDB','远程服务器名或ip地址' -有自定义实例名还要加上"/实例名" /*例如:EXEC sp_addlinkedserver 'TonyLink','','SQLOLEDB','192.168.58.208' */ -1.2 创建登录信息(或叫创建链接服务器登录名映射)(只需选择一种方式)-1.2.1 以windows认证的方式登录EXEC sp_addlinkedsrvlogin 'LinkName' -或EXEC sp_addlinkedsrvlogin 'LinkName','true' /*例如:EXEC sp_addlinkedsrvlogin 'TonyLink' */ -1.2.2 以SQL认证的方式登录 EXEC sp_addlinkedsrvlogin 'LinkName','false',NULL,'用户名','密码' /*例如:EXEC sp_addlinkedsrvlogin 'TonyLink','false',null,'sa','123' */ -2. 链接服务器相关数据操作-2.1 查询示例SELECT * FROM LinkName.数据库名.架构名.表名 /*例如:SELECT * FROM TonyLink.Mydb.dbo.tb */-2.2 导入示例SELECT * INTO 表名 FROM LinkName.数据库名.架构名.表名 /*例如:SELECT * INTO Newtb FROM TonyLink.Mydb.dbo.tb */-2.3 更新示例UPDATE LinkName.数据库名.架构名.表名 SET 字段='值' WHERE 字段='条件' /*例如:UPDATE TonyLink.Mydb.dbo.tb SET Persons='g' WHERE Persons='a' */-2.4 删除示例DELETE LinkName.数据库名.架构名.表名 WHERE 字段名='条件' /*例如:DELETE TonyLink.Mydb.dbo.tb WHERE Persons='g' */ -3. 通过行集函数(OPENQUERY/OPENROWSET/OPENDATASOURCE)操作方法-3.1 OPENQUERY 方法(需要借助刚创建的链接服务器):-3.1.1 查询示例SELECT * FROM OPENQUERY(LinkName,'SELECT * FROM 数据库名.架构名.表名') /* 例如:SELECT * FROM OPENQUERY(TonyLink,'SELECT * FROM Mydb.dbo.tb') */-3.1.2 导入示例-3.1.2.1 导入所有列INSERT OPENQUERY(LinkName, 'SELECT * FROM 数据库名.架构名.表名') SELECT * FROM 本地表 /* 例如:INSERT OPENQUERY(TonyLink,'SELECT * FROM Mydb.dbo.tb') SELECT * FROM tb */-3.1.2.2 导入指定列INSERT OPENQUERY(LinkName, 'SELECT * FROM 数据库名.架构名.表名') (列,列.) SELECT 列,列. FROM 本地表 /* 例如:INSERT OPENQUERY(TonyLink,'SELECT * FROM Mydb.dbo.tb')(RANGE,LEVEL,Persons) SELECT RANGE,LEVEL,Persons FROM tb */-3.1.3 更新示例UPDATE OPENQUERY(LinkName, 'SELECT * FROM 数据库名.架构名.表名') SET 字段='值' WHERE 字段='条件' /*例如:UPDATE OPENQUERY(TonyLink, 'SELECT * FROM Mydb.dbo.tb') SET Persons='g' WHERE Persons='a' */-3.1.4 删除示例DELETE OPENQUERY(LinkName, 'SELECT * FROM 数据库名.架构名.表名') WHERE 字段名='条件' /*例如:DELETE OPENQUERY(TonyLink, 'SELECT * FROM Mydb.dbo.tb') WHERE Persons='g' */ -3.2 OPENROWSET方法(不需要用到创建好的链接名。如果连接的实例名不是默认的,需要在"sql服务器名或IP地址"后加上"/实例名")-3.2.1 查询示例-3.2.1.1 Windows认证方式查询(以下方法之一即可)SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;Trusted_Connection=yes',数据库名.架构名.表名)SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服务器名或IP地址;Trusted_Connection=yes',数据库名.架构名.表名)SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;Trusted_Connection=yes','SELECT * FROM 数据库名.架构名.表名')SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服务器名或IP地址;Trusted_Connection=yes','SELECT * FROM 数据库名.架构名.表名') /* 例如:SELECT * FROM OPENROWSET('SQLOLEDB','Server=192.168.58.208;Trusted_Connection=yes',Mydb.dbo.tb) 或:SELECT * FROM OPENROWSET('SQLNCLI','Server=192.168.58.208;Trusted_Connection=yes',Mydb.dbo.tb) 或:SELECT * FROM OPENROWSET('SQLOLEDB','Server=192.168.58.208;Trusted_Connection=yes','SELECT * FROM Mydb.dbo.tb') 或:SELECT * FROM OPENROWSET('SQLNCLI','Server=192.168.58.208;Trusted_Connection=yes','SELECT * FROM Mydb.dbo.tb') */-3.2.1.2 SQL认证方式查询(以下方法之一即可)SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码',数据库名.架构名.表名)SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码',数据库名.架构名.表名)SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码','SELECT * FROM 数据库名.架构名.表名')SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码','SELECT * FROM 数据库名.架构名.表名')SELECT * FROM OPENROWSET('SQLOLEDB', 'sql服务器名''用户名' '密码',数据库名.架构名.表名)SELECT * FROM OPENROWSET('SQLNCLI', 'sql服务器名''用户名' '密码',数据库名.架构名.表名)SELECT * FROM OPENROWSET('SQLOLEDB', 'sql服务器名''用户名' '密码','SELECT * FROM 数据库名.架构名.表名')SELECT * FROM OPENROWSET('SQLNCLI', 'sql服务器名''用户名' '密码','SELECT * FROM 数据库名.架构名.表名') /* 例如:SELECT * FROM OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb) 或:SELECT * FROM OPENROWSET('SQLNCLI','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb) 或:SELECT * FROM OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123','SELECT * FROM Mydb.dbo.tb') 或:SELECT * FROM OPENROWSET('SQLNCLI','server=192.168.58.208;uid=sa;pwd=123','SELECT * FROM Mydb.dbo.tb') 或:SELECT * FROM OPENROWSET('SQLOLEDB','192.168.58.208''sa''123',mydb.dbo.tb) 或:SELECT * FROM OPENROWSET('SQLNCLI','192.168.58.208''sa''123',mydb.dbo.tb) 或:SELECT * FROM OPENROWSET('SQLOLEDB','192.168.58.208''sa''123','SELECT * FROM Mydb.dbo.tb') 或:SELECT * FROM OPENROWSET('SQLNCLI','192.168.58.208''sa''123','SELECT * FROM Mydb.dbo.tb') */-3.2.2 导入示例-3.2.2.1 导入所有列INSERT OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码',数据库名.架构名.表名)SELECT * FROM 本地表 /* 例如:INSERT OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb) SELECT * FROM tb */-3.2.2.2 导入指定列INSERT OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码',数据库名.架构名.表名)(列,列.)SELECT 列,列. FROM 本地表 /* 例如:INSERT OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)(RANGE,LEVEL,Persons) SELECT RANGE,LEVEL,Persons FROM tb */-注:更多替代方法参考.2.1查询示例,只需替换行集函数(OPENROWSET)内的内容即可。-3.2.3 更新示例UPDATE OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码',数据库名.架构名.表名)SET 字段='值'WHERE 字段='条件' /*例如:UPDATE OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb) SET Persons='g' WHERE Persons='a' */-注:更多替代方法参考.2.1查询示例,只需替换行集函数(OPENROWSET)内的内容即可。-3.2.4 删除示例DELETE OPENROWSET('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码',数据库名.架构名.表名) WHERE 字段名='条件' /*例如:DELETE OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb) WHERE Persons='g' */-注:更多替代方法参考.2.1查询示例,只需替换行集函数(OPENROWSET)内的内容即可。 -3.3 OPENDATASOURCE方法(不需要用到创建好的链接名。如果连接的实例名不是默认的,需要在"sql服务器名或IP地址"后加上"/实例名")-3.3.1 查询示例-3.3.1.1 Windows认证方式查询(以下方法之一即可)SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'server=sql服务器名或IP地址;Trusted_Connection=yes').数据库名.架构名.表名SELECT * FROM OPENDATASOURCE('SQLNCLI', 'server=sql服务器名或IP地址;Trusted_Connection=yes').数据库名.架构名.表名 /* 例如:SELECT * FROM OPENDATASOURCE('SQLOLEDB','Server=192.168.58.208;Trusted_Connection=yes').Mydb.dbo.tb 或:SELECT * FROM OPENDATASOURCE('SQLNCLI','Server=192.168.58.208;Trusted_Connection=yes').Mydb.dbo.tb */-3.3.1.2 SQL认证方式查询(以下方法之一即可)SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名SELECT * FROM OPENDATASOURCE('SQLNCLI', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名SELECT * FROM OPENDATASOURCE('SQLNCLI', 'Data Source=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名 /* 例如:SELECT * FROM OPENDATASOURCE('SQLOLEDB','Server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb 或:SELECT * FROM OPENDATASOURCE('SQLNCLI','Server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb 或:SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb 或:SELECT * FROM OPENDATASOURCE('SQLNCLI','Data source=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb */-3.3.2 导入示例-3.3.2.1 导入所有列INSERT OPENDATASOURCE('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名SELECT * FROM 本地表 /* 例如:INSERT OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb SELECT * FROM tb */-3.3.2.2 导入指定列INSERT OPENDATASOURCE('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名(列,列.)SELECT 列,列. FROM 本地表 /* 例如:INSERT OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb(RANGE,LEVEL,Persons) SELECT RANGE,LEVEL,Persons FROM tb */-注:更多替代方法参考.3.1查询示例,只需替换行集函数(OPENDATASOURCE)内的内容即可。-3.3.3 更新示例UPDATE OPENDATASOURCE('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名SET 字段='值'WHERE 字段='条件' /*例如:UPDATE OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb SET Persons='g' WHERE Persons='a' */-注:更多替代方法参考.3.1查询示例,只需替换行集函数(OPENDATASOURCE)内的内容即可。-3.3.4 删除示例DELETE OPENDATASOURCE('SQLOLEDB', 'server=sql服务器名或IP地址;uid=用户名;pwd=密码').数据库名.架构名.表名WHERE 字段名='条件' /*例如:DELETE OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb WHERE Persons='g' */-注:更多替代方法参考.3.1查询示例,只需替换行集函数(OPENDATASOURCE)内的内容即可。 -4. 删除链接服务器方法-如果以后不再使用时可删除链接信息-4.1 删除登录信息(或叫删除链接服务器登录名映射)EXEC sp_droplinkedsrvlogin 'LinkName',NULL /*例如:EXEC sp_droplinkedsrvlogin 'TonyLink',NULL */-4.2 删除链接服务器名称EXEC sp_dropserver 'LinkName','droplogins' -如果指定droplogins,则在删除链接服务器之前要删除登录名映射 /*例如:EXEC sp_dropserver 'TonyLink','droplogins' */ -附:获取Provider Name的方法(EXEC master.xp_enum_oledb_providers)SELECT CAST(Provider Name AS VARCHAR(30) ProviderName, CAST(Provider Description AS VARCHAR(60) ProviderDescriptionFROM OPENROWSET( 'SQLOLEDB', 'Server=.;Trusted_Connection=yes', 'SET FMTONLY OFF; EXEC master.xp_enum_oledb_providers' )/*ProviderName ProviderDescription- -SQLOLEDB Microsoft OLE DB Provider for SQL ServerDTSPackageDSO Microsoft OLE DB Provider for DTS PackagesSQLReplication.OLEDB SQL Server Replication OLE DB Provider for DTSMSOLAP Microsoft OLE DB Provider for Analysis Services 10.0MSDMine Microsoft OLE DB Provider For Data Mining ServicesMicrosoft.ACE.OLEDB.12.0 Microsoft Office 12.0 Access Database Engine OLE DB ProviderADsDSOObject OLE DB Provider for Microsoft Directory ServicesSQLNCLI10 SQL Server Native Client 10.0MSDAIPP.DSO Microsoft OLE DB Provider for Internet PublishingMSDASQL Microsoft OLE DB Provider for ODBC DriversMicrosoft.Jet.OLEDB.4.0 Microsoft Jet 4.0 OLE DB ProviderMSDAOSP Microsoft OLE DB Simple ProviderMSDAORA Microsoft OLE DB Provider for OracleMSIDXS Microsoft OLE DB Provider for Indexing Service(14 行受影响)*/ OpenRowSet相关帮助:- 包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的临时方法。对于较频繁引用 OLE DB 数据源的情况,请改为使用链接服务器。有关详细信息,请参阅 链接服务器。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 访问接口的功能,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,但 OPENROWSET 只返回第一个结果集。 OPENROWSET 还通过内置的 BULK 访问接口支持大容量操作,正是有了该访问接口,才能从文件读取数据并将数据作为行集返回。 Transact-SQL 语法约定语法OPENROWSET ( 'provider_name' , 'datasource' ; 'user_id' ; 'password' | 'provider_string' , catalog. schema. object | 'query' | BULK 'data_file' , FORMATFILE = 'format_file_path' <bulk_options> | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB ) <bulk_options> := , CODEPAGE = 'ACP' | 'OEM' | 'RAW' | 'code_page' , ERRORFILE = 'file_name' , FIRSTROW = first_row , LASTROW = last_row , MAXERRORS = maximum_errors , ROWS_PER_BATCH = rows_per_batch , ORDER ( column ASC | DESC ,.n ) UNIQUE 参数' provider_name '字符串,表示在注册表中指定的 OLE DB 访问接口的友好名称(或 PROGID)。provider_name 没有默认值。' datasource '对应于特定 OLE DB 数据源的字符串常量。datasource 是要传递给访问接口的 IDBProperties 接口的 DBPROP_INIT_DATASOURC