web-dev-qa-db-ja.com

SQL 2008、所有者のような別のユーザーとしてビューから選択

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

代わりにテーブル値関数を使用しますか?

ただし、マルチステートメント関数である必要があります。
インライン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
1
gbn

これまでに考えられるより透過的なソリューションは、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
0
opensas