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]