将新行添加到表后动态创建视图

Posted

技术标签:

【中文标题】将新行添加到表后动态创建视图【英文标题】:Create a view dynamically after a new row is added to a table 【发布时间】:2013-02-01 09:42:39 【问题描述】:

我有一个包含 4 个表的数据库

-电池 -细胞 -所有者

每个电池有多个电池和一个所有者。

单元格表将包含大量条目。 我想要一个触发器,为每个显示电池信息及其电池信息的新电池创建视图。

我有一个运行良好的 postgre sql 触发器(感谢 *** :)):

    BEGIN

EXECUTE $$CREATE OR REPLACE VIEW battery_vue
AS
SELECT * FROM cells WHERE battery_serial = $$ || NEW.battery_serial;

RETURN NEW;

END;

但我无法将其转置到 SQL Server,而且我完全不知道该怎么做。

这是我的数据库的简单图表:

所以最后对于每个新电池,我都需要查看它及其电池。

Ps : 对不起,如果我的英语不流利:/

【问题讨论】:

只是为了让我了解这里的工作流程...添加新电池记录时,您想要触发触发器并创建该新电池及其相关电池信息的物理视图吗?你为什么要那样做?您当然可以在单元格记录上存储 DATETIME 标记并使用日期范围搜索返回所有数据?? 我想要独立查看每个电池,因为将有数千个电池,每个电池包含 10 到 1000 个电池,我需要快速访问数据以显示用户的统计数据加上:所有视图必须实时更新,因为单元格数据将每分钟更新一次 查询视图比直接查询表有什么优势?如果我理解正确,您希望能够使用SELECT * FROM dbo.cells_1234 而不是SELECT * FROM dbo.cells WHERE battery_serial = 1234。但是第二个查询通常会更简单,因为battery_serial 值是作为参数传递的,您不必动态构造视图名称。电池的数量并不重要,更多的是表格和索引设计的问题。但是也许你可以展示你的 PostgreSQL 查询是什么样的,以更好地说明你的需求? 【参考方案1】:

希望这会为您指明正确的方向...

   /*Create a test table*/
IF OBJECT_ID('TestBattery') IS NOT NULL
BEGIN
    DROP TABLE dbo.[TestBattery]
END
GO

CREATE TABLE dbo.[TestBattery]
(
id          INT
,owner_id    INT
,data_id     INT
)
GO

/*Create a test trigger*/
IF OBJECT_ID('trg_TestBattery_CreateView') IS NOT NULL
BEGIN
    DROP Trigger dbo.trg_TestBattery_CreateView
END
GO


CREATE TRIGGER [dbo].[trg_TestBattery_CreateView]
ON [dbo].[TestBattery] AFTER INSERT
AS
SET NOCOUNT ON 

DECLARE @BatteryID      INT
        ,@View          VARCHAR(200)
        ,@SQLCreateView VARCHAR(MAX)

SELECT @BatteryID = ID FROM INSERTED

/*Dynamically generate new view name based on BatteryID that was inserted*/
SELECT @View = 'TestBattery_'+CAST(@BatteryID AS VARCHAR)

/*Generate SQL to create the view*/
SELECT @SQLCreateView = 'CREATE VIEW '+@View+' AS SELECT [id],[owner_id],[data_id] FROM dbo.[TestBattery] WHERE ID = '+CAST(@BatteryID AS VARCHAR)

/*We create the view only if it doesn't exist*/
IF OBJECT_ID(@View) IS NULL
BEGIN

EXEC(@SQLCreateView)

END
GO

/*Testing your trigger*/
INSERT INTO TestBattery
(
id
,owner_id
,data_id
)
SELECT
'1'
,'2'
,'3'

SELECT * FROM TestBattery
SELECT * FROM TestBattery_1

/*Take out the trash*/
DROP TABLE TestBattery
DROP VIEW TestBattery_1

【讨论】:

以上是关于将新行添加到表后动态创建视图的主要内容,如果未能解决你的问题,请参考以下文章

水平堆栈视图新行 - Swift

使用Ember.js将新行动态地插入到表上下文中

在oracle中插入表B后创建触发器以将新行添加到表A中时出错

如何将包含现有行和新行的新列添加到表中?

使用 PHP 和 Ajax 创建动态表以将数据插入表中,如果不在视图或第一页中,则无法使用按钮

使用 RxSwift 将 Alamofire 请求绑定到表视图