在 sql-server 中创建一个允许输入新记录的视图
creating a view in sql-server that allows the entry of new records
我在 sql 服务器 2012 中有一个名为 AccntTemp 的 table,它有一堆列和一个 ID 列。必须在此 table 中输入数据的人不应该能够看到 ID 列和其他一些列,但需要能够输入数据。
所以,我需要创建一个允许输入新记录但只显示我想让她看到的字段的视图。我知道如何创建视图,以便它只显示我希望她看到的字段,但我不知道如何创建视图以允许输入新记录。
我必须对我的查询进行哪些更改才能使其正常工作?
CREATE VIEW dbo.DataEntry
AS
SELECT code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno
FROM accnttemp
这只是创建了视图,但是当我转到视图时,我无法修改任何记录或添加任何新记录。我该如何做到这一点?
视图不应允许插入数据,只能读取。您希望通过触发器执行的操作是可能的,但不建议这样做。
您正在查找函数或存储过程。
正在更新答案以防止垃圾评论:
这就是为什么你给他们一个接受参数的存储过程。他们对底层逻辑一无所知,他们只知道这个存储过程将他们提供的参数放入他们需要的 table 中。他们检查视图,他们的新数据现在就在那里。
这通常是不好的做法,因为您只能通过使用触发器来完成它,这可能会产生一些令人讨厌的副作用。因此,如果做得正确并且一切都已考虑在内(现在和未来),那就继续吧。无论如何,用户必须对基础 table 具有 INSERT, UPDATE, DELETE
权限。
文档中有内容。检查这个 link
Updatable Views
You can modify the data of an underlying base table through a view, as
long as the following conditions are true:
Any modifications, including UPDATE, INSERT, and DELETE statements,
must reference columns from only one base table.
The columns being modified in the view must directly reference the
underlying data in the table columns. The columns cannot be derived in
any other way, such as through the following:
An aggregate function: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV,
STDEVP, VAR, and VARP.
A computation. The column cannot be computed from an expression that
uses other columns. Columns that are formed by using the set operators
UNION, UNION ALL, CROSSJOIN, EXCEPT, and INTERSECT amount to a
computation and are also not updatable.
The columns being modified are not affected by GROUP BY, HAVING, or
DISTINCT clauses.
TOP is not used anywhere in the select_statement of the view
together with the WITH CHECK OPTION clause.
如果您的视图尚未更新table,出于某种原因(最简单的视图应该是),那么您必须实现手动操作基础 table 的触发器.
例如
CREATE TRIGGER T_DataEntry_I on dbo.DataEntry
instead of insert
as
insert into accnttemp(code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno)
SELECT code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno
FROM inserted
需要进行任何更改才能使插入成功。
视图不允许 INSERT
s 的一个常见原因是,如果基础 table 中有其他列,NULL
和默认值都不起作用。在这种情况下,您必须将这些列添加到上述触发器代码中,并为它们选择或计算适当的值。
如果不清楚,我不同意TTeeple的回答。 SQL 的设计是尽可能让视图和表无法区分。您应该能够用视图替换 table(具有相同的列定义,并将数据保存在适当的其他 table 中),而不必对使用它的任何客户端应用程序进行任何更改。
事实上,最初的 Codd's Rules for Relational Databases 观点之一 应该 更新 table:
Rule 6: The view updating rule:
All views that are theoretically updatable must be updatable by the system.
不幸的是,后来发现对于某些视图,虽然人类可以为它们实施更新,但系统无法找到这样做的方法。
我在 sql 服务器 2012 中有一个名为 AccntTemp 的 table,它有一堆列和一个 ID 列。必须在此 table 中输入数据的人不应该能够看到 ID 列和其他一些列,但需要能够输入数据。
所以,我需要创建一个允许输入新记录但只显示我想让她看到的字段的视图。我知道如何创建视图,以便它只显示我希望她看到的字段,但我不知道如何创建视图以允许输入新记录。
我必须对我的查询进行哪些更改才能使其正常工作?
CREATE VIEW dbo.DataEntry
AS
SELECT code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno
FROM accnttemp
这只是创建了视图,但是当我转到视图时,我无法修改任何记录或添加任何新记录。我该如何做到这一点?
视图不应允许插入数据,只能读取。您希望通过触发器执行的操作是可能的,但不建议这样做。
您正在查找函数或存储过程。
正在更新答案以防止垃圾评论:
这就是为什么你给他们一个接受参数的存储过程。他们对底层逻辑一无所知,他们只知道这个存储过程将他们提供的参数放入他们需要的 table 中。他们检查视图,他们的新数据现在就在那里。
这通常是不好的做法,因为您只能通过使用触发器来完成它,这可能会产生一些令人讨厌的副作用。因此,如果做得正确并且一切都已考虑在内(现在和未来),那就继续吧。无论如何,用户必须对基础 table 具有 INSERT, UPDATE, DELETE
权限。
文档中有内容。检查这个 link
Updatable Views
You can modify the data of an underlying base table through a view, as long as the following conditions are true:
Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.
The columns being modified in the view must directly reference the underlying data in the table columns. The columns cannot be derived in any other way, such as through the following:
An aggregate function: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, and VARP.
A computation. The column cannot be computed from an expression that uses other columns. Columns that are formed by using the set operators UNION, UNION ALL, CROSSJOIN, EXCEPT, and INTERSECT amount to a computation and are also not updatable.
The columns being modified are not affected by GROUP BY, HAVING, or DISTINCT clauses.
TOP is not used anywhere in the select_statement of the view together with the WITH CHECK OPTION clause.
如果您的视图尚未更新table,出于某种原因(最简单的视图应该是),那么您必须实现手动操作基础 table 的触发器.
例如
CREATE TRIGGER T_DataEntry_I on dbo.DataEntry
instead of insert
as
insert into accnttemp(code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno)
SELECT code, invno, ven, invdate, amon, accno, amnt, jno, saccno, ckno
FROM inserted
需要进行任何更改才能使插入成功。
视图不允许 INSERT
s 的一个常见原因是,如果基础 table 中有其他列,NULL
和默认值都不起作用。在这种情况下,您必须将这些列添加到上述触发器代码中,并为它们选择或计算适当的值。
如果不清楚,我不同意TTeeple的回答。 SQL 的设计是尽可能让视图和表无法区分。您应该能够用视图替换 table(具有相同的列定义,并将数据保存在适当的其他 table 中),而不必对使用它的任何客户端应用程序进行任何更改。
事实上,最初的 Codd's Rules for Relational Databases 观点之一 应该 更新 table:
Rule 6: The view updating rule:
All views that are theoretically updatable must be updatable by the system.
不幸的是,后来发现对于某些视图,虽然人类可以为它们实施更新,但系统无法找到这样做的方法。