-- SQL Server 2005 创建跨服务器“触发器” --

luoyoumou 2010-06-10 05:28:59
加精
-- 今天的唯一一点收获,贴出来与大家分享!(欢迎大家多提宝贵意见!)

http://topic.csdn.net/u/20100610/09/80f14ecc-ff88-4d96-97e7-1a6e3cf1fa53.html?11629

-- 整了一上午终于把楼主这个问题给整好了!
-- 比如说:在本地 test 数据库 与局域网 245 的 hlldb数据库中 都有一张结构如下的表 t

CREATE TABLE T(
id INT,
name VARCHAR(20)
);

-- 现在假设当 本地 test 数据库 中的 表 t中插入记录行的同时向 局域网 245 的 hlldb数据库 的表t 插入相同的记录行,
-- 实现如下(用触发器实现)

-- Step 1 :创建链接服务器、及其登录授权(在本地 test数据库执行)
--创建链接服务器
-- 示例代码:
-- exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
-- exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '

-- 实际操作代码:
exec sp_addlinkedserver 'it245 ', ' ', 'SQLOLEDB ', '192.168.1.245'
exec sp_addlinkedsrvlogin 'it245 ', 'false ',null, 'sa', 'go2wan@szty'

-- Step 2 :创建触发器(在本地 test数据库执行)
CREATE TRIGGER tr_in_t on [dbo].[t]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
DECLARE @id INT, @name VARCHAR(20);
SELECT @id=id, @name=name FROM inserted;

INSERT INTO it245.hlldb.dbo.t(id,name) VALUES(@id,@name);
END

INSERT INTO t(id,name) values(1,'luoyoumou1');


-- 如果出现这样的错误:(请参考以下五个网址的文档)
链接服务器"it245"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。

-- http://hi.baidu.com/wgx331/blog/item/ef81be45deaadc27cffca32e.html
-- http://blog.pfan.cn/jixian/34117.html
-- http://dyuan.blog.sohu.com/16734773.html
-- http://sai5d.blog.163.com/blog/static/62225483200901322939411/
-- http://topic.csdn.net/t/20060523/11/4771841.html

INSERT INTO t(id,name) values(1,'luoyoumou1');

SELECT * FROM t;
SELECT * FROM it245.hlldb.dbo.t;
...全文
3388 186 打赏 收藏 转发到动态 举报
写回复
用AI写文章
186 条回复
切换为时间正序
请发表友善的回复…
发表回复
buller 2012-08-01
  • 打赏
  • 举报
回复
收藏。。还没调通
vicry_ha 2012-07-09
  • 打赏
  • 举报
回复
怎么就出现
“链接服务器"NET_SERVER"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。
消息 7391,级别 16,状态 2,过程 SyncData_ACRTA,第 28 行
无法执行该操作,因为链接服务器 "NET_SERVER" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。”
解决一天了,也不行,有会得得吗
hai138884466 2011-07-25
  • 打赏
  • 举报
回复
有个疑问,一锅远程的电脑没有开的话怎么办,不但无法存入数据,触发器还会卡死,请问怎么办
abuying 2010-11-07
  • 打赏
  • 举报
回复
登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

可以使用登录触发器来审核和控制服务器会话,例如通过跟踪登录活动、限制 SQL Server 的登录名或限制特定登录名的会话数。例如,在以下代码中,如果登录名 login_test 已经创建了三个用户会话,登录触发器将拒绝由该登录名启动的 SQL Server 登录尝试。

USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
(SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
END;




请注意,LOGON 事件对应于 AUDIT_LOGIN SQL Trace 事件,该事件可在事件通知中使用。触发器与事件通知的主要区别在于触发器随事件同步引发,而事件通知是异步的。也就是说,例如,如果要停止建立会话,则必须使用登录触发器。AUDIT_LOGIN 事件的事件通知不能用于此目的。
abuying 2010-11-07
  • 打赏
  • 举报
回复
若要更改定义了服务器范围 (ON ALL SERVER) 的 DDL 触发器或者更改登录触发器,需要对该服务器拥有 CONTROL SERVER 权限。若要更改定义了数据库范围 (ON DATABASE) 的 DDL 触发器,需要对当前数据库拥有 ALTER ANY DATABASE DDL TRIGGER 权限。

create TRIGGER trigger_name
ON { DATABASE | ALL SERVER }

DATABASE
将 DDL 触发器的作用域应用于当前数据库。如果指定了此参数,则只要当前数据库中出现 event_type 或 event_group,就会激发该触发器。

ALL SERVER
将 DDL 或登录触发器的作用域应用于当前服务器。如果指定了此参数,则只要当前服务器中的任何位置上出现 event_type 或 event_group,就会激发该触发器。
zxssy1 2010-11-07
  • 打赏
  • 举报
回复
学习了,簇
lao_bulls 2010-08-31
  • 打赏
  • 举报
回复
学习了
sts120069856 2010-07-02
  • 打赏
  • 举报
回复
这个方法,从2000 里触发数据到2005里行得通吗?
AbstractObject 2010-06-22
  • 打赏
  • 举报
回复
学习一下
lancer0723 2010-06-22
  • 打赏
  • 举报
回复
哪下的 学习一下
user_xj 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 luoyoumou 的回复:]
-- 今天的唯一一点收获,贴出来与大家分享!(欢迎大家多提宝贵意见!)

http://topic.csdn.net/u/20100610/09/80f14ecc-ff88-4d96-97e7-1a6e3cf1fa53.html?11629

SQL code

-- 整了一上午终于把楼主这个问题给整好了!
-- 比如说:在本地 test 数据库 与局域网 245 的 hlldb……
[/Quote]

貌似~有用 谢过
shuangbaojun 2010-06-22
  • 打赏
  • 举报
回复
LZ的代码确定可以跑通吗
wo237285809 2010-06-21
  • 打赏
  • 举报
回复
很好啊
wo237285809 2010-06-21
  • 打赏
  • 举报
回复
不错,好帖子
wo237285809 2010-06-21
  • 打赏
  • 举报
回复
路过看下
huwen7565833 2010-06-21
  • 打赏
  • 举报
回复
楼主好人啊!!!学习了!!
A123132hy 2010-06-21
  • 打赏
  • 举报
回复
来看看
lc502324976 2010-06-20
  • 打赏
  • 举报
回复
挺好……谢谢
zhu8323124 2010-06-20
  • 打赏
  • 举报
回复
路过,学习下
hzl199006 2010-06-20
  • 打赏
  • 举报
回复
定淡淡的
加载更多回复(161)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧