on 2011 Apr 15 7:30 AM
Frequently I have to use queries of the following kind to update a local table based on values from a proxy table (usually the remote server being a MS SQL Server):
:::SQL
update LocalTable LT
set col = PT.col
from LocalTable LT inner join ProxyTable PT on LT.pk = PT.pk;
AFAIK, these queries are generally not supported and return a SQLCODE -728 ("Update operation attempted on non-updatable remote query").
My usual workaround is to fetch the needed remote values in a local temporary table and join that against the local table, something like
:::SQL
select pk, col into local temporary table TempTable
from ProxyTable
order by pk;
update LocalTable LT
set col = TT.col
from LocalTable LT inner join TempTable TT on LT.pk = TT.pk;
drop table TempTable;
Question:
While that workaround is acceptable, is there a way in v12.0.1 to allow one-step updates with remote tables, i.e. some tuning of server capabilities or the like?
(Note: The udate/delete itself would always modify the local table, not the remote one - the latter often being used with a read-only remote server.)
Request clarification before answering.
Volker,
I am sorry to tell you that the restriction with performing update/delete operations on a join between a proxy table and a local table is still in place for SA 12.0.1 and will likely remain in place for quite some time. I realize that the restriction only makes sense when it is actually the remote table that is being updated or deleted from; however, for consistency and other less obvious/internal reasons, the restriction is in place regardless of whether it is the local or remote table that is being modified. There are no tweaks you can make to capability bits or options that will allow the restriction to be relaxed. Your approach of using an intermediate temporary table is the correct/recommended approach.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You may be able to use the MERGE statement like:
:::SQL
MERGE INTO LocalTable USING ProxyTable ON LocalTable.pk = ProxyTable.pk WHEN MATCHED THEN UPDATE WHEN NOT MATCHED THEN SKIP;
http://dcx.sybase.com/index.html#1201/en/dbreference/merge-statement.html
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I have been very existing about this approach - MERGE is one of the newer statements I don't use too often.
However, unfortunately, this approach seems to fail, too, with a -134 ("MERGE INTO <remote_table> is not supported") error message (tested on Win32 with 12.0.1.3298). Note that - in contrast to the error message - I'm trying to merge into the LocalTable as in Tyson's sample.
As I understand, the particular branches of a MERGE statement's actions are done with ordinary INSERT/UPDATE/DELETE statements - therefore it seems reasonable that MERGE has the same restrictions as the underlying UPDATE statement.
User | Count |
---|---|
76 | |
30 | |
8 | |
8 | |
7 | |
7 | |
6 | |
5 | |
4 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.