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
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
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