SQL Server 2008では、システムはsys.database_role_membersとsys.database_principalsを表示し、現在のアカウントが表示を許可されているユーザーとグループのみを返します。
特定のアカウントが存在するかどうかを確認する必要があるため、現在のアカウントの権限に関係なく、既存のすべてのsqlアカウントアカウントを表示する必要があります。つまり、以前のバージョンと同じように使用します。
「EXECUTE AS OWNER」のようないくつかのオプションはありますか?
何かのようなもの
create view dbo.vUsers select as owner as
select * from sys.database_principals
代わりにテーブル値関数を使用しますか?
ただし、マルチステートメント関数である必要があります。
インラインUDFSはEXECUTE AS
を許可しません(ビューのような単なるマクロであるためと思います)
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
これまでに考えられるより透過的なソリューションは、sys_database_principalsとsys_database_rolesのようなテーブルをいくつか作成することです。
それらを指すようにビューを更新する
次に、現在ログインしているアカウントに関係なく所有者として実行されるストアドプロシージャを定義し、次のようにテーブルに入力します。
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