web-dev-qa-db-fra.com

SQL 2008, sélectionnez à partir d'une vue comme utilisateur différent, comme le propriétaire

Dans SQL Server 2008, le système Vues SYS.DATABASE_ROLE_MEMBers et SYS.DATABASE_PRINCIPALLS ne renvoie que les utilisateurs et le groupe que le compte actuel est autorisé à afficher.

Je dois vérifier l'identification d'un certain compte existant, alors j'ai besoin de voir tous les comptes de compte SQL existants, quelles que soient les autorisations du compte courant, je veux dire, comme si elle était utilisée dans les versions précédentes.

Y a-t-il une option comme "exécuter comme propriétaire" mais pour des vues?

Quelque chose comme

create view dbo.vUsers select as owner as

select * from sys.database_principals
4
opensas

Utilisez une fonction de valeurs de table à la place?

Il doit y avoir une fonction de multitisité cependant.
UDF en ligne ne permet pas EXECUTE AS (Je suppose parce qu'ils sont simplement des macros comme des vues)

CREATE FUNCTION dbo.vUsers ()
RETURNS @dbprincipals TABLE (
    name sysname NOT NULL,
    type char(1) NOT NULL
    )
WITH EXECUTE AS OWNER
AS
BEGIN
    INSERT @dbprincipals
    SELECT name, type FROM sys.database_principals;

    RETURN;
END
GO
1
gbn

La solution la plus transparente que je puisse penser jusqu'à présent consiste à créer quelques tables telles que Sys_Database_Principaux et Sys_Database_Roles,

mettre à jour la vue pour les pointer sur eux

puis définissez une procédure stockée, qui sera exécutée en tant que propriétaire, quel que soit le compte enregistré actuellement et que Woul remplir les tables comme celle-ci.

create procedure dbo.tmp_fill with execute as owner as
begin

    if exists( select * from sysobjects where type = 'U' and name = 'sys_database_role_members' )
        drop table dbo.sys_database_role_members
    select * into sys_database_role_members from sys.database_role_members

    if exists( select * from sysobjects where type = 'U' and name = 'sys_database_principals' )
        drop table dbo.sys_database_principals
    select * into sys_database_principals from sys.database_principals

end
0
opensas