我有一个 SQL Server 2012 实例,其中一个链接服务器使用 System i Access ODBC 驱动程序指向 IBM Iseries 系统上的 db2 数据库。
我正在尝试启用分布式事务。我相信该提供商确实根据IBM 文档支持它们(除非我误解了该链接)。
我正在运行以下查询:
BEGIN TRANSACTION
UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE
SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[IBM][System i Access ODBC 驱动程序]登记 DTC 阶段失败。2”。消息 7391,级别 16,状态 2,第 2 行 由于链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”无法开始分布式事务,因此无法执行该操作。
我对这个错误所做的所有研究都遇到过想要禁用分布式事务而不是让它们工作的人。我已经在链接服务器属性上将“启用分布式事务的提升”设置为 true。
任何想法如何让这个工作?
编辑:更多信息/更新。当我在 Windows 日志中注意到这一点时,我正准备暂时放弃这个并等待帮助:
当 XA 事务被禁用时,调用者试图注册一个 XA 资源。
我找到了这个链接,它告诉我如何修改 …
sql-server linked-server sql-server-2012 iseries distributed-transactions
(SQL Server 2008 R2 Standard,数据库完全恢复)
我有一个包含字段 id、firstname、lastname 的表。执行一条语句:
insert into dbo.sometable (id, firstname, lastname) values (1, 'John', 'Smith')
Run Code Online (Sandbox Code Playgroud)
几个小时后,另一个语句被执行:
update dbo.sometable set firstname='Matt' where id=1
Run Code Online (Sandbox Code Playgroud)
是否有一种方法或工具可以让我们查看记录的历史记录(Y 人在 X 日期插入了一条记录,这些是插入的值,并且 B 人在 A 日期更新了相同的记录,并且这些是更新后的新值)?
熟悉 DB2 for i(即 iSeries 上的 DB2)的用户可能知道一个名为 CRTDBFJRN 的 TAA 工具集命令,该命令可以将给定表上的所有事务转储到另一个表中,从而清晰地显示插入、更新和被删除的字段。更新。
SQL Server Enterprise 有 CDC,但我们有标准版;我可以使用触发器通过存储在审计表中来跟踪更改的数据。触发器的使用将需要另外两个对象 - 触发器和审计表,并且触发器将在每次更改时触发。如果工具可以从交易文件中按需重放交易,那就太好了。
当审计师询问财务记录的历史记录(例如,在一天插入和更新)时,您使用什么工具或执行哪些任务,例如:谁更改了此记录,更改了什么,此记录最初是什么时候输入,原始输入时的数据是什么等?
任何帮助将不胜感激。谢谢你。
我登录到一个 SQL Server 数据库,它有一个 AS400 服务器作为链接服务器。
我发现如果我在 OPENQUERY 中运行选择,那么针对这个 AS400 服务器运行查询会快得多...
SELECT EMEQP#
FROM _
WHERE EMALOC = '467' AND EMDLCD = 'A' AND EMSTAT NOT IN ('S', 'J', 'V')
Run Code Online (Sandbox Code Playgroud)
执行时间:46秒
SELECT EMEQP#
FROM
OPENQUERY(_, '
SELECT EMEQP#
FROM _
WHERE EMALOC = ''467'' AND EMDLCD = ''A'' AND EMSTAT NOT IN (''S'', ''J'', ''V'')
')
Run Code Online (Sandbox Code Playgroud)
执行时间:1秒
有人可以解释或链接我为什么/如何发生这种情况吗?
我有一个带有日常事务表的 DB2 数据库,每天在一天结束时将其清除为历史记录表。
我通过 java-JDBC INSERT 命令将行插入到这个表中,它们通常需要不到一秒钟的时间来完成,但有时(我仍然不确定是什么模式)它可能需要一分钟才能完成 INSERT 命令,因为我没有在 JDBC 驱动程序上配置超时,它等待命令完成然后继续。
这些 INSERT 命令每天执行数千次,但这只会发生在其中每天大约 5 或 10 次。该表有一些索引和一个附加在 AFTER INSERT 事件上的触发器。
有什么工具或技术可以用来衡量在我的 INSERT 命令上执行什么需要这么长时间?我想知道它是索引,触发器还是出于任何原因,查询本身。
我对下面的声明有疑问。查询的主要目的是将客户列表从 ODBC 提取到 Access 数据库中(我们的客户存储在 IBM i 上的 DB2 中)。该查询旨在查找超过 13 个月未交付 (RS2101F.DELDATE) 但尚未被抑制 (OM01U1.OM01068) 的客户 (OM01U1.OM01015)。我确实需要所有的列来研究设备和财务记录,所以我无法移除它们。不过,该声明是从几个表中提取的。我认为问题可能出在“Group By”上。当我收到结果时,我也得到了重复的出口 (OM01U1.OM01015)。我只需要看到最后一次交货日期 (RS2101F.DELDATE) 一次。请不要把我打得太糟,我没有创建这个查询,我只是继承了它。我知道这很遥远,而且可能有更好的方法来获取我需要的信息。我感谢任何帮助家伙!
SELECT
OM01U1.OM01041 as Loc,
OM01U1.OM01015 AS Outlet,
OM01U1.OM01945 AS OLTyp,
OM01U1.OM01052 AS Outlet_Name,
OM01U1.OM01054A AS Street_Number,
OM01U1.OM01054C AS Street_Name,
OM01U1.OM01055A AS City,
OM01U1.OM01055B AS State,
OM01U1.OM01106 AS Zip,
OM01U1.OM01058A AS Area_Code,
OM01U1.OM01058C AS Phone,
OM01U1.OM01037 AS Channel,
OM01U1.OM01926 AS USA_Type,
OM01U1.OM01078 AS Key_Acct,
OM01U1.OM01110 AS TRDGRP,
OM01U1.OM01034 AS Trade_Name,
OM01U1.OM01248 AS DTC,
OM01U1.OM01073 AS Sales_Route,
OM01U1.OM01068 AS Sup_CDE,
OM01U1.OM01982 …
Run Code Online (Sandbox Code Playgroud) 当我想将一个表更新为 SQL Server 中另一个表中的值时,我将使用以下语法:
UPDATE t1
SET t1.a = t2.a
FROM t1
INNER JOIN t2 ON t2.b = t1.b
Run Code Online (Sandbox Code Playgroud)
iSeries 7 的语法是什么?
我的客户在他们的 IBMi 上有一个表,外键指向另一个表。它没有显示一个SELECT * FROM lib.table
. 但是,如果我在列列表中特别提及它。它确实出现了。
SELECT
col1, col2.col3, fxcolid
FROM lib.table
Run Code Online (Sandbox Code Playgroud)
我正在使用 jt400 驱动程序从SQLWorkbench/J进行查询。
如果 DB2 for IBM i 7.1 中已经存在全局临时表,那么测试的语法是什么?
我试过这个DECLARE GLOBAL TEMPORARY TABLE
:
SELECT * FROM QSYS2.SYSTABLES WHERE SYSTEM_TABLE_SCHEMA = 'QTEMP';
Run Code Online (Sandbox Code Playgroud)
它返回了一个空的结果集。永久表似乎包含在该视图中,但不包含临时表。
最终,我需要有条件地删除临时表或截断/删除数据(如果存在)。
iseries ×8
db2 ×5
sql-server ×3
insert ×1
jdbc ×1
ms-access ×1
odbc ×1
performance ×1
transaction ×1