日期:2014-05-17  浏览次数:20461 次

由链接数据库做的本地视图无法创建触发器?
EXEC master.dbo.sp_addlinkedserver 
@server = N'MYSQLOS', @srvproduct=N'127.0.0.1', @provider=N'MSDASQL', @provstr=N'Driver={MySQL ODBC 5.1 Driver};Server=127.0.0.1;Database=db;User=user;Password=***;Option=3;'

CREATE VIEW [dbo].[View_Order]
AS
SELECT * FROM OPENQUERY(MYSQL, 'select *  from order') AS derivedtbl_1

 在本地SQL Server 2008 R2中通过上面的代码创建链接数据库和视图,用SQL查询或者视图都能正常访问,当在视图上创建触发器的时候就提示“消息 8197,级别 16,状态 6,过程 Remote_Num,第 1 行
对象 'View_Order' 不存在,或对此操作无效。” 代码入下

CREATE TRIGGER Remote_Num
   ON  View_Order 
   AFTER UPDATE
AS
IF UPDATE(isvalid) 
BEGIN

declare @o_isvalid nvarchar(1)  --修改之前的
declare @n_isvalid nvarchar(1)  --修改之后的
declare @o_id bigint

END
GO

 请问这个是代码有问题还是是链接数据库不能做触发器呢?因为触发的动作是由远程的MySQL服务器做的,还有其他方案可以实现当MySQL服务器里数据库数据变化了,这边MSSQL数据库就做一些动作呢
链接数据库触发器

------解决方案--------------------
官方文档: 视图只能被 INSTEAD OF 触发器引用。
参考 http://technet.microsoft.com/zh-cn/library/ms189799(v=sql.105).aspx

try this,

CREATE TRIGGER Remote_Num
ON  View_Order 
INSTEAD OF UPDATE
AS
IF UPDATE(isvalid) 
BEGIN

declare @o_isvalid nvarchar(1)  --修改之前的
declare @n_isvalid nvarchar(1)  --修改之后的
declare @o_id bigint

END
GO

------解决方案--------------------
请问LZ是直接更新视图吗,如 update View_Order set ... ??

或者可能是逻辑问题,把变量@n_isvalid,@o_isvalid打印出来看看.