Risultati diversi da sys.database come utenti diversi
-
31-10-2019 - |
Domanda
Abbiamo un lavoro di agente SQL configurato per essere eseguito come utente "DBO". Questo lavoro ottiene un elenco di database definiti in sys.database Quella corrispondenza uno schema di denominazione. Il lavoro esegue quindi alcuni SQL dinamici per ripulire alcune vecchie tabelle di transazione. Il lavoro inizia contro tempdb.
Il lavoro agente funziona bene sul mio database di sviluppo (SQL Server 2008 R2 Standard Edition 10.50.2500.0). Il lavoro ottiene correttamente l'elenco dei database. Tuttavia, su un sistema clienti (SQL Server 2008 R2 Standard Edition 64-BIT 10.50.1600.1), il lavoro non trova database corrispondenti nonostante siano esistenti.
Sul sistema clienti, un semplice select * from sys.databases
Eseguire contro tempdb in una finestra di query restituisce tutti e 10 i database nel sistema.
Usando il profiler, ho visto la chiamata dell'agente SQL EXECUTE AS USER = N'dbo' WITH NO REVERT
Quando si esegue questo lavoro. Ho duplicato il problema usando il seguente SQL:
use tempdb
-- results: tempdb, <my SQL user>, dbo
select
db_name() as [Current Database],
suser_name() as [Current Context],
user_name() as [Current User]
-- results: tempdb, 10 (which I expect)
select
db_name() as [Current Database],
count(*)
from sys.databases
execute as user = N'dbo'
-- results: tempdb, sa, dbo
select
db_name() as [Current Database],
suser_name() as [Current Context],
user_name() as [Current User]
-- results: tempdb, 2 (?!?)
select
db_name() as [Current Database],
count(*)
from sys.databases
revert
Se cambio "uso tempdb" in "usa master", i risultati sono i 10 database previsti per ogni query.
Perché Sys.Database dovrebbe restituire risultati diversi quando viene eseguito come DBO utente dal database TempDB? E perché restituisce tutti i database use master
Come utente DBO?
Maggiori informazioni - Se eseguo questo script in SQL Server Management Studio senza includere il revert
In fondo, il mio elenco di database si restringe agli stessi due che questa query ritorna da Sys.Database.
Nessuna soluzione corretta