设在db1的tb1上insert时,同时往db2的tb2进行insert. tb1,tb2结构相同.use db1 go create trigger tb1_insert on tb1 for insert as insert db2..tb2 select * from inserted --若表中含有标识列,那么请不要用select *,采用除标识列外的列名列表按顺序写出来. go
ALTER trigger [dbo].[tb1_insert] on [dbo].[R_LouDongXinXi] for insert asINSERT OPENDATASOURCE( 'SQLOLEDB', 'Data Source=192.168.1.160;User ID=sa;Password=123456' ).search.dbo.R_LouDongXinXi SELECT * FROM INSERTED报错ALTER trigger [dbo].[tb1_insert] on [search].[dbo].[R_LouDongXinXi] for insert as EXEC sp_addlinkedserver 'zhangl', '', 'MSDASQL', NULL, NULL, 'DRIVER={SQL Server};SERVER=192.168.1.198;UID=sa;PWD=123456;' GO insert zhangl.search.dbo.R_LouDongXinXi select * from inserted [/code] 还是报错 郁闷
我整个是这样写的,触发器我不怎么会 ALTER trigger [dbo].[tb2_insert] on [dbo].[R_LouDongXinXi] for insert asINSERT OPENDATASOURCE( 'SQLOLEDB', 'Server=192.168.1.160;UID=sa;Password=123456' ).search.dbo.R_LouDongXinXi SELECT * FROM INSERTED
go
create trigger tb1_insert
on tb1
for insert
as
insert db2..tb2 select * from inserted --若表中含有标识列,那么请不要用select *,采用除标识列外的列名列表按顺序写出来.
go
频繁使用的话,直接使用 sp_addlinkedserver来建立链接服务器.参见:http://topic.csdn.net/u/20071203/21/d3f4eac1-4241-44cf-9246-8938141094c9.html触发器里执行
insert 链接服务器名.search.dbo.tb2 select * from inserted
'sqloledb',
'data source=192.168.1.198;user id=sa;password=123456'
).search.dbo.R_LouDongXinXi
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的授权说明"。
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。
消息 7399,级别 16,状态 1,过程 tb1_insert,第 7 行
链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 报错。身份验证失败。
消息 7303,级别 16,状态 1,过程 tb1_insert,第 7 行
无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。
'SQLOLEDB',
'Data Source192.168.1.198;User ID=sa;Password=123456'
).search.dbo.R_LouDongXinXi /*可以加成 (f1,f2,f3)*/
SELECT * /*可以改成 f1,f2,f3*/
FROM INSERTED设当前机器的数据库下的表上建立了触发器,触发器中执行以上的语句,
那么,当对当前机器的这个表进行数据插入时,插入的数据同时被写到 192.168.1.198的 search库下的loudongxinxi表
on [dbo].[R_LouDongXinXi]
for insert
as
INSERT OPENDATASOURCE(
'SQLOLEDB',
'Data Source192.168.1.160;User ID=sa;Password=123456'
).search.dbo.R_LouDongXinXi
SELECT * FROM INSERTEDgo是这样的错误链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。
消息 7303,级别 16,状态 1,过程 tb1_insert,第 6 行
无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。
'SQLOLEDB',
'Data Source=192.168.1.198;User ID=sa;Password=123456'
).search.dbo.R_LouDongXinXi /*可以加成 (f1,f2,f3)*/
SELECT * /*可以改成 f1,f2,f3*/
FROM INSERTED
ALTER trigger [dbo].[tb1_insert]
on [dbo].[R_LouDongXinXi]
for insert
asINSERT OPENDATASOURCE(
'SQLOLEDB',
'Data Source=192.168.1.160;User ID=sa;Password=123456'
).search.dbo.R_LouDongXinXi
SELECT * FROM INSERTED报错ALTER trigger [dbo].[tb1_insert]
on [search].[dbo].[R_LouDongXinXi]
for insert
as
EXEC sp_addlinkedserver
'zhangl',
'',
'MSDASQL',
NULL,
NULL,
'DRIVER={SQL Server};SERVER=192.168.1.198;UID=sa;PWD=123456;'
GO
insert zhangl.search.dbo.R_LouDongXinXi
select * from inserted
[/code]
还是报错 郁闷
csdn乱加空格,害人啊.
INSERT OPENDATASOURCE(
'SQLOLEDB',
'Data Source=192.168.1.198;User ID=sa;Password=123456'
).search.dbo.R_LouDongXinXi /*可以加成 (f1,f2,f3)*/
SELECT * /*可以改成 f1,f2,f3*/
FROM INSERTED
--将上面的写法换为下面的:看它怎么加空格,呵呵
INSERT OPENDATASOURCE(
'SQLOLEDB',
'Server=192.168.1.198;UID=sa;Password=123456'
).search.dbo.R_LouDongXinXi /*可以加成 (f1,f2,f3)*/
SELECT * /*可以改成 f1,f2,f3*/
FROM INSERTED第二种
sp_addlinkedserver不需要每次在触发器里创建, 你先建过一次,那么服务器里就被保存了.
报错原因应该也是由于 sql server中间给加多了空格.
同样也可以改成
provider=sqloledb 这样的oledb连接方式
INSERT OPENDATASOURCE(
'SQLOLEDB',
'Server=192.168.1.198;UID=sa;Password=123456'
).search.dbo.R_LouDongXinXi /*可以加成 (f1,f2,f3)*/
SELECT * FROM INSERTED
我执行了上面的SQL,开始说没有启用远程/网络事务之类的,后来都解决了,可是插入数据的时候2个表都没有存到,也没有报错信息...
ALTER trigger [dbo].[tb2_insert]
on [dbo].[R_LouDongXinXi]
for insert
asINSERT OPENDATASOURCE(
'SQLOLEDB',
'Server=192.168.1.160;UID=sa;Password=123456'
).search.dbo.R_LouDongXinXi
SELECT * FROM INSERTED
那么触发器要建在 192.168.1.1的服务器的search库的r_loudongxinxi表上.