gpt4 book ai didi

c# - SqlCommandBuilder() 为基础表而不是 View 创建插入/更新

转载 作者:行者123 更新时间:2023-11-30 17:43:34 24 4
gpt4 key购买 nike

我有两个模式,像这样:

  • Schema 'data' --> 保存表,没有人可以从外部访问它们
  • Schema 'ui' --> 包含可从外部访问的 View ;这个想法是您可以选择/删除/更新/插入这些 View 。因此,我正在进行所有权链。

例如:

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

现在,如果我以用户身份连接 SQL Studio,一切正常:

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)

但是,如果我在使用 SqlCommandBuilder 的 .NET/C# 中编写程序:

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();

==> 然后在下面,INSERT DOES NOT WORK!

[编辑]:

SqlCommandBuilder 正在分析 View ,而不是像

这样创建命令
INSERT INTO ui.vwTest ...

它正在创造

INSERT INTO data.tblTest ...

所以实际上,SqlCommandBuilder 试图“智能化”并访问 View 的基础表,而不是访问 View 。

问题:这种行为可以改变吗?

顺便说一句,为了更清楚一点,我在这里进行所有权链

我的用户有权查看架构 ui 中的 View ,但他们无权查看架构 data。但是,由于所有权变更,用户可以通过模式 data 中的 View 间接访问表。

详细来说,一个用户被附加到一个自定义角色,例如“role_user”,并且该角色对架构具有权限,如下所示:

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

但该角色对架构“数据”没有任何权利!!

此设置的好处是您可以应用行级安全性。使用 View 中的 where 过滤器,您可以只选择允许用户查看的记录。

如前所述,它在 SQL 窗口中运行良好,但不适用于 SQLCommandBuilder。 SQLCommandBuilder 分析 View ,并尝试直接访问基础表,而不是访问 View 。

7 年前,有人问过这个问题:https://stackoverflow.com/a/320684/2504785然后他的解决方案是自己编写 SQL 命令。但可能,现在存在另一种解决方案?然而,到目前为止我还没有找到......

[/EDIT]

最佳答案

好的,现在明确的答案是:

SqlCommandBuilder 正试图变得“智能”。如果您使用 SELECT * FROM vwTest 之类的命令打开它,那么它会分析 View 并为基础表创建命令,例如 INSERT into tblTest ...

所以问题是:SqlCommandBuilder 为基础表而不是 View 创建命令。

解决方案:

到目前为止,我没有找到改变 SqlCommandBuilder 行为的方法。

因此,我重写了所有的加载和更新,现在所有的事情都是手动完成的。加载现在完全通过 SqlDataReader 进行——无需使用 SqlDataAdapter 加载到 DataTable。所有更新都是通过创建和执行 SqlCommand 完成的,无需 SqlCommandBuilder

这是一项艰巨的工作,但作为返回,该应用程序现在速度极快。与 SqlCommandBuilderSqlDataAdapter 相比,加载速度。可能我会在某个时候进行基准比较。但是,当加载之前需要 5 秒时,现在“立即”完成了。

关于c# - SqlCommandBuilder() 为基础表而不是 View 创建插入/更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30749222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com