AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 343638
Accepted
SE1986
SE1986
Asked: 2024-11-16 00:57:28 +0800 CST2024-11-16 00:57:28 +0800 CST 2024-11-16 00:57:28 +0800 CST

Como a resolução de nomes funciona com procedimentos armazenados temporários?

  • 772

Digamos que eu tenha os dois bancos de dados a seguir

USE [master]
CREATE DATABASE Jack
GO

CREATE DATABASE Jill
GO

USE Jack
GO
CREATE TABLE JacksTable
(
    Id INT
)
INSERT INTO JacksTable VALUES (1)

Se eu criar o seguinte procedimento armazenado temporário no contexto do banco de dados Jack:

USE Jack
GO

CREATE PROC #Temp
AS
    SELECT  *
    FROM    JacksTable
GO

e então execute no banco de dados Jack:

USE Jack
GO
EXEC #Temp

Eu obtive o resultado1

Se eu então executar no contexto do banco de dados Jill:

USE Jill
GO
EXEC #Temp

Eu entendo1

Agora, se eu abandonar o procedimento

DROP PROC #Temp

e crie o procedimento novamente no contexto do banco de dados Jill:

USE Jill
GO

CREATE PROC #Temp
AS
    SELECT  *
    FROM    JacksTable 
GO

e execute-o

USE Jill
GO    
EXEC #Temp

Recebo um erro

Msg 208, Level 16, State 1, Procedure #Temp, Line 4 [Batch Start Line 74]
Invalid object name 'JacksTable'.

Se eu tentar executá-lo a partir do banco de dados Jack:

USE Jack
GO
EXEC #Temp

Eu entendo

Msg 208, Level 16, State 1, Procedure #Temp, Line 4 [Batch Start Line 74]
Invalid object name 'JacksTable'.

Se eu então abandonar o procedimento

DROP PROC #Temp

Recrie novamente no contexto do banco de dados Jill

USE Jill
GO

CREATE PROC #Temp
AS
    SELECT  *
    FROM    JacksTable 
GO

e desta vez executado a partir do banco de dados Jack

USE Jack
GO
EXEC #Temp

Recebo o mesmo erro de ligação

Msg 208, Level 16, State 1, Procedure #Temp, Line 4 [Batch Start Line 74]
Invalid object name 'JacksTable'.

isso me diz que o SQL Server tenta vincular os objetos no procedimento temporário ao banco de dados que estava no contexto quando o procedimento armazenado temporário foi criado.

este artigo sugere

Quando um procedimento armazenado é executado pela primeira vez, o processador de consulta lê o texto do procedimento armazenado na exibição do catálogo sys.sql_modules e verifica se os nomes dos objetos usados ​​pelo procedimento estão presentes.

Em qual banco de dados essa verificação é realizada? Eu diria que seria tempdb, pois esse é o banco de dados no qual a definição de procedimentos armazenados temporários é persistida? Se for, essa resolução falharia em todos os casos (a menos que criássemos as tabelas em tempdb), então não pode ser isso.

Com base no que vi acima, parece ser o banco de dados que estava no escopo quando o procedimento armazenado temporário foi criado (em vez do banco de dados em que a definição do objeto é persistida - tempdb). No entanto, se esse for realmente o caso, como o SQL Server sabe qual banco de dados é esse e onde ele está armazenado? Eu verifiquei sys.sql_expression_dependencies, sys.sql_modules, sys.objectse sys.procedurese nenhum parece ter essa informação

sql-server
  • 1 1 respostas
  • 70 Views

1 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2024-11-16T03:54:56+08:002024-11-16T03:54:56+08:00

    Se você executar um SELECTcontra sys.fn_dblogdepois tempdbde criar o proc, poderá ver que os únicos lugares em que ele escreve são

    • sys.sysschobjs
    • sys.syssingleobjrefs
    • sys.sysobjvalores
    • sys.syssoftobjrefs

    Você só pode vê-los ao conectar via DAC , mas eu acabei de fazer isso e parece que indepidtem tempdb.sys.syssingleobjrefsisso

    SELECT p.id, 
           refs.indepid AS potential_database_id,
           p.name AS proc_name, 
           REVERSE(CAST(REVERSE(imageval) AS NVARCHAR(MAX))) AS proc_definition
    FROM tempdb.sys.sysschobjs p
    JOIN tempdb.sys.syssingleobjrefs refs ON p.id = refs.depid AND refs.class = 70 AND refs.depsubid = 0
    JOIN tempdb.sys.sysobjvalues v on v.objid =p.id 
    WHERE p.name LIKE '#Temp%' and p.type = 'P'
    

    A busca sys.all_sql_modulespor objetos WHERE definition LIKE '%syssingleobjrefs%' AND definition like '%indepid%'não mostra nada promissor para obter essas informações sem usar o DAC.

    sys.sql_modulesolha para essa coluna para determinar, execute_as_principal_idmas está filtrando class = 22nesse caso e observei 70as entradas retornadas pelo acima.

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve