Tratando de entender el comportamiento del procedimiento almacenado

Tratando de entender el comportamiento del procedimiento almacenado

Estoy cansado de buscar esto, pero no pude encontrar nada.

Tengo tres bases de datos en SQL Server y aunque todos los procedimientos almacenados están en la base de datos Main, funcionan con tablas de las otras bases de datos.

Mi pregunta es: si tienes la consulta

select name 
from SecondDatabase.dbo.SomeTable 
where id = 56

y esta consulta se almacena en la base de datos principal, ¿se ejecutará en la base de datos principal e irá hasta la segunda base de datos y devolverá los datos, o se ejecutará en la segunda base de datos y tendrá el resultado seleccionado directamente?

(espero que entiendas mi pregunta)

Mostrar la mejor respuesta

No entiendo lo que estás preguntando. ¿Las tres bases de datos están en la misma instancia? ¿Puedes compartir algún código e intentar explicar cuál es tu pregunta?

Hola Sean. Sí, está en la misma instancia, pero estoy tratando de entender en un contexto general cómo se comporta el motor en este tipo de entorno. Trate de imaginar dos bases de datos particionadas, una la primera tiene todos los procedimientos almacenados pero desea hacer una selección en la segunda.

Avatar S3S

La definición de principal no está clara aquí. Simplemente parece que está ejecutando un procedimiento que está en ServerA contra ServerB. ¿Esta pregunta es si es posible o cómo hacerlo?

Lo siento, solo era una forma de llamar a las bases de datos. Puedes decir que es la primera base de datos y la segunda base de datos.

Puede calificar el esquema de la base de datos y el propietario del esquema en sus objetos. Ejemplo: FROM SecondDatabase.dbo.SomeTable, esto siempre se ejecutaría en la tabla SomeTable definida para el propietario de dbo en el esquema de la base de datos SecondDatabase incluso si el el contexto actual era un usuario diferente y un esquema de base de datos diferente. Si no califica esos 2 elementos (esquema de base de datos y propietario del esquema), los valores activos actuales se usan para ambos implícitamente. En el caso anterior, si ejecutó un proceso almacenado definido en la base de datos Main con el usuario de esquema dbo entonces sería main.dbo.SomeTable

Totalmente no obtener lo que usted está pidiendo. Supongo que te refieres a algo como select * from SecondDatabase.dbo.TableName where somevalue = 'asdf'. Pero sigo sin entender lo que preguntas.

La consulta anterior (ahora editada) siempre se ejecutará en SecondDatabase.dbo.SomeTable incluso si el contexto de la base de datos activa era otra base de datos e incluso si el usuario activo tenía un esquema predeterminado diferente.

La consulta anterior (ahora editada) siempre se ejecutará en SecondDatabase.dbo.SomeTable incluso si el contexto de la base de datos activa era otra base de datos e incluso si el usuario activo tenía un esquema predeterminado diferente. Esto se debe a que el objeto SomeTable está calificado con el esquema y el propietario del esquema.

Prueba para ilustrar que lo siguiente todavía devuelve los resultados ejecutados (suponiendo que los objetos existen y el contexto de usuario activo tiene acceso a ellos)

USE [OtherDatabaseSchema]
GO

SELECT TOP 10 *
FROM [SecondDatabase].[dbo].[SomeTable]

Creo que está malinterpretando la diferencia entre una base de datos y una instancia.

Una instancia es el software que ejecuta el servicio SQL. Cada instancia puede tener varias bases de datos. Por ejemplo, hay una base de datos master y una base de datos tempdb para cada instancia de SQL Server, estas son bases de datos del sistema. Puede crear cualquier número de bases de datos de usuarios. Todas estas bases de datos serán manejadas por la misma instancia de SQL Server (en la misma máquina).

Una sesión de cliente en particular se conecta primero a una instancia y luego a una base de datos en particular, por eso incluye a qué base de datos se conectará de forma predeterminada en las cadenas de conexión (o al iniciar sesión). Cuando escribe select name from SecondDatabase.dbo.SomeTable, le está diciendo al servicio SQL que recupere datos del SecondDatabase, incluso si su sesión está vinculada a cualquier otra base de datos. Luego, el motor usará su credencial de inicio de sesión para hacer coincidir un usuario de la otra base de datos (ya que los usuarios van por base de datos e inician sesión por instancia) para validar si tiene suficientes privilegios para consultar esa tabla, antes de buscar los datos.

Una historia completamente diferente sería intentar acceder a los datos desde otra instancia (máquina), en la que necesitará un servidor vinculado, un conjunto de filas abierto o similar.

use FirstDatabase
select name 
from SecondDatabase.dbo.SomeTable 
where id = 56

Pregunta:

¿Se ejecutará en la base de datos principal e irá hasta la segunda? base de datos y devuelve los datos, o se ejecutará en la segunda base de datos y tienes el resultado seleccionado directamente?

Tu primera suposición es correcta:

Esta consulta se ejecutará en una primera base de datos, usará el contexto y todas las configuraciones (ANSI, optimizador de consultas y estadísticas relacionadas) de la primera base de datos pero obtendrá datos de una tabla de la segunda base de datos .

Solo un ejemplo de una vida: si la base de datos tiene que permanecer en un modo de compatibilidad antiguo, pero las nuevas funciones de T-SQL deben usarse ocasionalmente, la consulta puede cambiar el contexto a tempdb (que normalmente se establece en el nivel de compatibilidad más reciente) y ejecutar consultas que hagan referencia a datos de cualquier otra base de datos a la que se haya concedido acceso. El uso de esas nuevas funciones no generará excepciones