【发布时间】:2015-08-25 06:50:40
【问题描述】:
我有两个架构,像这样:
- Schema 'data' --> 保存表,没有人可以从外部访问它们
- Schema 'ui' --> 保存可从外部访问的视图;这个想法是您可以在这些视图上选择/删除/更新/插入。因此,我正在执行所有权链接。
例如:
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)
但是,如果我用 .NET/C# 编写一个使用 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();
==> 然后在下面,INSERT DOES NOT WORK!
[编辑]:
SqlCommandBuilder 正在分析视图,而不是创建类似的命令
INSERT INTO ui.vwTest ...
它正在创建
INSERT INTO data.tblTest ...
所以事实上,SqlCommandBuilder 试图“智能”并访问视图的底层表,而不是访问视图。
问题:这种行为可以改变吗?
顺便说一句,为了更清楚起见,我在这里进行所有权链接。
我的用户有权查看架构 ui 中的视图,但他们无权查看架构 数据。但是,由于所有权变更,用户可以通过模式 data 中的视图间接访问表。
详细地说,用户被附加到一个自定义角色,例如“role_user”,角色对架构有权限,如下:
GRANT SELECT, UPDATE, INSERT, DELETE ON SCHEMA ui TO role_user ;
但该角色对架构“数据”没有任何权利!!
此设置的好处是您可以应用行级安全性。使用视图中的 where 过滤器,您可以只选择允许用户查看的记录。
如前所述,它在 SQL 窗口中可以正常工作,但不能在 SQLCommandBuilder 中使用。 SQLCommandBuilder 分析视图,并尝试直接访问基础表,而不是访问视图。
7年前,有人问过这个问题:https://stackoverflow.com/a/320684/2504785 然后他的解决方案是自己编写 SQL 命令。 但可能,现在存在另一种解决方案?但是,我目前没有找到...
[/EDIT]
【问题讨论】:
-
我认为问题不在于
SqlCommandBuilder。您的视图与表位于不同的架构中,我的猜测是来自 c# 的连接没有访问此架构或此表的权限。 -
@ZoharPeled:在代码中您看到,视图已被访问,但在错误消息中提到了该表。 Giosco 不想授予对表的访问权限,只是为了查看。
-
我目前没有可以玩的服务器,但是如果没有记忆,您需要对视图从中选择的所有表具有选择权限,但是,如果您使用存储过程,您只需要执行权限。我会在几个小时后尝试验证。
-
对不起@ZoharPeled,你是对的。 Giosco 看到这个:msdn.microsoft.com/en-us/library/ms180800.aspx#Security
标签: c# .net sql-server azure-sql-database sql-server-2014