Это сложно, потому что разрешение объекта основано на схеме по умолчанию, активной при анализе пакета. Таким образом, партия как это:
DECLARE @cookie varbinary(8000);
exec sp_setapprole a_role,'P@ssword', @fCreateCookie = true, @cookie = @cookie output
--go
select * from t
Будет ссылаться на dbo.t, даже если a_role имеет другую схему по умолчанию. Если разбить его на две партии, то t разрешится до a.t.
Либо это, либо вы используете статический SQL в хранимой процедуре, которая разрешается относительно схемы процедуры, а не default_schema любого пользователя.
Кроме того, я не думаю, что роли приложений - это правильный подход. Вы можете сделать это проще, используя олицетворение, чем роли приложения. EG предоставляет пользователям приложения право выдавать себя за пользователя, который имеет права только в определенной схеме. Что-то вроде:
create role app_users
create user a_user without login with default_schema=a
grant select, insert, update, delete, execute on schema::a to a_user
grant impersonate on user::a_user to app_users
go
execute as user='a_user'
select * from t --resolves to a.t
select * from dbo.t --fails
revert