views:

2951

answers:

9

We have a classic ASP application that simply works and we have been loathe to modify the code lest we invoke the wrath of some long-dead Greek gods.

We recently had the requirement to add a feature to an application. The feature implementation is really just a database operation requires minimal change to the UI.

I changed the UI and made the minor modification to submit a new data value to the sproc call (sproc1).

In sproc1 that is called directly from ASP, we added a new call to another sproc that happens to be located on another server, sproc2.

Somehow, this does not work via our ASP app, but works in SQL Management Studio.

Here's the technical details:

  1. SQL 2005 on both database servers.
  2. Sql Login is authenticating from the ASP application to SQL 2005 Server 1.
  3. Linked server from Server 1 to Server 2 is working.
  4. When executing sproc1 from SQL Management Studio - works fine. Even when credentialed as the same user our code uses (the application sql login).
  5. sproc2 works when called independently of sproc1 from SQL Management Studio.
  6. VBScript (ASP) captures an error which is emitted in the XML back to the client. Error number is 0, error description is blank. Both from the ADODB.Connection object and from whatever Err.Number/Err.Description yields in VBScript from the ASP side.

So without any errors, nor any reproducibility (i.e. through SQL Mgmt Studio) - does anyone know the issue?

Our current plan is to break down and dig into the code on the ASP side and make a completely separate call to Server 2.sproc2 directly from ASP rather than trying to piggy-back through sproc1.

+1  A: 

You could be suffering from the double-hop problem

The double-hop issue is when the ASP/X page tries to use resources that are located on a server that is different from the IIS server.

Windows NT Challenge/Response does not support double-hop impersonations (in that once passed to the IIS server, the same credentials cannot be passed to a back-end server for authentication).

You should verify the attempted second connection using SQL Profiler.

Note that with your manual testing you are not authenticating via IIS. It's only when you initiate the sql via the ASP/X page that this problem manifests.

More resources:

Ed Guiness
A: 

Example code might help :) Are you trying to return two tables from the stored procedure; I don't think ADO 2.6 can handle multiple tables being returned.

Martin Clarke
A: 

I did consider that (double-hop), but what is the difference between a sproc-in-a-sproc call like I am referring to vs. a typical cross-server join via INNER JOIN? Both would be executed on Server1, using the Linked Server credentials, and authenticating to Server 2.

Can anyone confirm that calling a sproc cross-server is different than doing a join on data tables? And why?

If the Linked Server config is a sql account - is that considered a double-hop (since what you refer to is NTLM double-hops?)

In terms of whether multiple resultsets are coming back - no. Both Server1.Sproc1 and Server2.Sproc2 would be "ExecuteNonQuery()" in the .net world and return nothing (no resultsets and no return values).

Aaron
A: 

Try to check the permissions to the database for the user specified in the connection string. Use the same user name in the connection string to log in to the database while using sql mgmt studio.

create some temporary table to write the intermediate values and exceptions since it can be a effective way of debugging your application.

Aravind
+3  A: 

Have you got set nocount on set in both stored procedures? I had a similar issue once and whilst I can't remember exactly how I solved it at the moment, I know that had something to do with it!

Luke Bennett
A: 

Can I just check: You made the addition of sproc2? Prior to that it was working fine for ages.

Could you not change where you call sproc2 from? Rather than calling it from inside sproc1, can you call it from the ASP? That way you control the authentication to SQL in the code, and don't have to rely on setting up any trusts or shared remote authentication on the servers.

Pavling
A: 

How is your linked server set up? You generally have some options as to how it authenticates to the remote server, which include logging in as the currently logged in user or specifying a SQL login to always use. Have you tried setting it to always use a specific account? That should eliminate any possible permissions issues in calling the remote procedure...

Telos
A: 

My first reaction is that this might not be an issue of calling cross-server, but one of calling a second proc from a first, and that this might be what's acting differently in the two different environments.

My first question is this: what happens if you remove the cross-server aspect from the equation? If you could set up a test system where your first proc calls your second proc, but the second proc is on the same server and/or in the same database, do you still get the same problem?

Along these same lines: In my experience, when the application and SSMS have gotten different results like that, it has often been an issue of the stored procedures' settings. It could be, as Luke says, NOCOUNT. I've had this sort of thing happen from extraneous PRINT statements in the code, although I seem to remember the PRINTed value becoming part of the error description (very counterintuitively).

If anything is returned in the Messages window when you run this in SSMS, find out where it is coming from and make it stop. I would have to look up the technical terms, but my recollection is that different querying environments have different sensitivities to "errors", and that a default connection via SSSM will not throw an error at certain times when an ADO connection from a scripting language will.

One final thought: in case it is an environment thing, try different settings on your ASP page's connection string. E.g., if you have an OLEDB connection, try ODBC. Try the native and non-native SQL Server drivers. Check out what connection string options your provider supports, and try any of them that seem like they might be worth trying.

kcrumley
I was finally able to implement this code. I broke out the call to SPROC2 from ASP. STILL ERRORS! I reviewed the code for NOCOUNT and PRINT (and anything else that would give output) but to no avail. I ended up writing a hack because the error number = 0 consistently.
Aaron
+1  A: 

I had a similar problem and I solved it by setting nocount on and removing print commands.