Question

Nous avons un travail d'agent SQL configuré pour s'exécuter en tant que "DBO" utilisateur. Ce travail obtient une liste de bases de données définies dans SYS.Databases Cela correspond à un schéma de dénomination. Le travail effectue ensuite un SQL dynamique pour nettoyer certaines anciennes tables de transaction. Le travail commence contre TempDB.

Le travail d'agent s'exécute bien dans ma propre base de données de développement (SQL Server 2008 R2 Standard Edition 10.50.2500.0). Le travail obtient correctement la liste des bases de données. Cependant, sur un système client (SQL Server 2008 R2 R2 Standard Edition 64 BIT 10.50.1600.1), le travail ne trouve aucune base de données correspondante malgré leur existant.

Sur le système client, un simple select * from sys.databases Exécuter contre TempDB dans une fenêtre de requête renvoie les 10 bases de données du système.

En utilisant le profileur, j'ai vu l'appel de l'agent SQL EXECUTE AS USER = N'dbo' WITH NO REVERT Lors de l'exécution de ce travail. J'ai dupliqué le problème en utilisant le SQL suivant:

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

Si je change «Utilisez TempDB» pour «utiliser maître», les résultats sont les 10 bases de données attendues pour chaque requête.

Pourquoi les SYS.Databases rendraient-ils différents résultats lors de l'exécution en tant que DBO utilisateur à partir de la base de données TempDB? Et pourquoi renvoie-t-il toutes les bases de données avec use master comme l'utilisateur DBO?

Plus d'informations - Si j'exécute ce script dans SQL Server Management Studio sans inclure le revert En bas, ma liste de bases de données se rétrécit aux deux mêmes que cette requête renvoie des SYS.Databases.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top