SqlCommandBuilder () cria inserção / atualização para tabelas subjacentes em vez de uma exibição

Eu tenho dois esquemas, assim:

Esquema 'dados' -> mantém tabelas e ninguém tem acesso a elas de foraO esquema 'ui' -> contém visualizações acessíveis de fora; a idéia é que você pode selecionar / excluir / atualizar / inserir nessas visualizações. Então, eu estou fazendoencadeamento de propriedade.

Por exemplo:

create table data.tblTest (TestKey int not null primary key);
create view ui.vwTest as select * from data.tblTest;

Agora, se eu me conectar como usuário com o SQL Studio, está tudo bem:

select * from ui.vwTest; -- WORKS (this is correct)
select * from data.tblTest; -- ERROR (this is correct)

insert into   ui.vwTest  (TestKey) values (17); -- WORKS (this is correct)
insert into data.tblTest (TestKey) values (17); -- ERROR (this is correct)

No entanto, se eu escrever um programa em .NET / C # que use SqlCommandBuilder:

SqlDataAdapter ada = new SqlDataAdapter('select * from ui.vwTest', conn);
SqlCommandBuilder b = new SqlCommandBuilder(mSQLAda);
ada.UpdateCommand = b.GetUpdateCommand();
ada.InsertCommand = b.GetInsertCommand();
ada.DeleteCommand = b.GetDeleteCommand();

==> Em seguida, a seguir, oINSERIR NÃO FUNCIONA!

[EDITAR]:

O SqlCommandBuilder está analisando o modo de exibição e, em vez de criar um comando como

INSERT INTO ui.vwTest ...

está criando

INSERT INTO data.tblTest ...

Portanto, de fato, o SqlCommandBuilder tenta ser "inteligente" e acessa as tabelas subjacentes da exibição, em vez de acessar a exibição.

Pergunta: Esse comportamento pode ser alterado?

BTW, só para deixar mais claro, eu estou fazendoencadeamento de propriedade aqui.

Meus usuários têm o direito de ver as visualizações no esquemaui, mas eles não têm direito ao esquemadados. No entanto, devido à propriedade, os usuários podem acessar as tabelas indiretamente por meio das visualizações no esquemadados.

Em detalhes, um usuário é anexado a uma função personalizada, por exemplo "role_user", e a função tem direitos no esquema, da seguinte maneira:

GRANT SELECT, UPDATE, INSERT, DELETE ON SCHEMA ui TO role_user ;

mas o papel não tem direitos sobre os dados do esquema !!

O bom dessa configuração é que você pode aplicar a segurança no nível da linha. Com um filtro where na visualização, você pode selecionar apenas os registros que o usuário pode ver.

Como dito, ele funciona bem dentro da janela SQL, mas não com o SQLCommandBuilder. O SQLCommandBuilder analisa a exibição e tenta acessar diretamente as tabelas subjacentes, em vez de acessar a exibição.

Há 7 anos, alguém perguntou isso:https://stackoverflow.com/a/320684/2504785 E sua solução então foi escrever os comandos SQL. Mas, possivelmente, existe agora outra solução? No entanto, não encontrei nenhum até agora ...

[/EDITAR]

questionAnswers(2)

yourAnswerToTheQuestion