【问题标题】:DB2: How to get generated always as statement to work with session userDB2:如何生成始终作为与会话用户一起使用的语句
【发布时间】:2017-02-02 18:24:52
【问题描述】:

我需要将用户戳记入表中,但我还没有弄清楚 GENERATED FOR EACH ROW ON UPDATE AS 语句如何与 DB2 10.5 (LUW) 中的 SESSION_USER 变量一起工作。

设法使用具有用于强制更新语句中的评估的假变量的函数来实现工作:

CREATE OR REPLACE FUNCTION XXX.CURRENT_USER( tmp varchar(128))
    SPECIFIC xxx.XXX_CURRENT_USER
RETURNS VARCHAR(128) 
CONTAINS SQL DETERMINISTIC NO EXTERNAL ACTION 
BEGIN
  RETURN session_user ;
END
GO

CREATE TABLE xxx (
    i INTEGER,
    t VARCHAR(128) GENERATED ALWAYS AS (XXX.CURRENT_USER(i))
)

但是,对于像这样的基本事物,少一些“hacky”实现会更好。

对于时间戳,有“FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP”语句,但其他寄存器变量似乎没有等效项。

非常感谢您的帮助

【问题讨论】:

    标签: sql db2 default-value create-table autogeneratecolumn


    【解决方案1】:

    这行得通吗?

    CREATE TABLE xxx (
        i INTEGER,
        t VARCHAR(128) WITH DEFAULT session_user
    );
    

    我手头没有要检查的 DB2,但这与其他数据库中使用的语法非常相似(尽管更典型的语法不使用 WITH)。

    【讨论】:

    • 感谢您的反馈。不幸的是,它不适用于更新语句。我想自动捕获谁修改了行而不使用触发器。
    • @JMX 。 . .我认为您的代码也不会这样做。我认为您需要使用触发器。
    • 实际上,如果函数依赖于行值,例如在这种情况下的列“i”,它会这样做。
    • @JMX 。 . .哦,我明白了。现在说得通了。
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2011-09-21
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多