标签: dml

PostgreSQL 事件触发器强制将扩展安装到特定模式

我有一个专用架构extensions(PostgreSQL v 9.6.3),我打算在其中安装我的数据库的所有扩展。我想以某种方式禁止(或至少提醒)用户在没有指定特定架构的情况下安装扩展。

所以这应该失败

CREATE EXTENSION tablefunc;
Run Code Online (Sandbox Code Playgroud)

但这应该会成功:

CREATE EXTENSION tablefunc SCHEMA extensions;
Run Code Online (Sandbox Code Playgroud)

为此,我尝试创建事件触发器:

CREATE EVENT TRIGGER e010_verify_extension_schema_et
  ON ddl_command_end
  WHEN TAG IN ('CREATE EXTENSION')
  EXECUTE PROCEDURE verify_extension_schema();
Run Code Online (Sandbox Code Playgroud)

verify_extension_schema()功能上,我正在尝试使用pg_catalog.pg_event_trigger_ddl_commands(). 但是,该函数不会返回任何我可以用来检查是否已指定架构或与此相关的架构的任何内容...

有没有人有任何想法我怎么能做到这一点?

postgresql trigger dml ddl ddl-trigger

5
推荐指数
1
解决办法
412
查看次数

如何找到视图列的基表列?

我对 ERP 应用程序进行编程、管理和支持。我更常见的任务之一是了解数据的来源,找到应用程序中特定报告字段与其数据输入字段之间的链接。为此,我必须手动检查一个或多个视图的 DDL SQL 以了解表列,以便将一个视图的表列与另一个视图的表列进行匹配。此手动任务可能需要检查四个或五个抽象层。

是否有一种更快的方法来检查元数据以查找如何从其基表列计算视图列?有没有办法检查 Oracle 的执行计划以查看重写的查询,跳过对中间视图的手动检查?

oracle oracle-11g-r2 dml view

3
推荐指数
1
解决办法
513
查看次数

T-SQL 基于标识列插入值

是否可以有一个基于 Identity 列的具有 PK 的表?

假设我有一个客户表,两个字段对于我们的案例很重要,Id即 isPK nvarchar(20)SequenceIdwhich is int identity(1,1)。我想要一个存储过程,该过程将具有(除其他外)一个参数@CustomerType,并根据此参数生成值Id并将新行插入表中。像这样的东西:

CREATE PROCEDURE createCustomer
@CustomerType int, 
@GivenName nvarchar(20), 
@Surname nvarchar(20), 
@BirthDate date = null
...
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @prefix nvarchar(1) = N'x'
    IF @CustomerType = 1
    BEGIN
        SET @prefix = N'P'
    END
...
    ELSE
    BEGIN
        SET @prefix = N'x'
    END

    INSERT INTO [dbo].[Customers]
           ([Id],
            [GivenName],[Surname],[BirthDate])
    VALUES
           (@prefix + (SequenceId + 1000000),
        @GivenName,@Surname,@BirthDate);

    SELECT INSERTED.Id AS CustomerId; …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server dml t-sql

2
推荐指数
1
解决办法
5252
查看次数

SQL Server 插入后触发器不执行操作

我有 2 个插入后触发器和 1 个而不是插入触发器的问题。After Insert 触发器应该执行一些操作,但不会触发这些操作。

当替代触发器触发时,它们的动作 After Triggers 工作正常。

让我解释:

“替代”触发器验证该ID值是否为 Null。如果是,则触发器在表 ( TRADE_APPR) 中执行插入操作,填充IDSQL Server 序列中的值。

当替代触发器执行操作时,插入后触发器也执行它们的操作。

我的而不是插入触发器的代码是这样的:

ALTER TRIGGER [ConfirmMgr].[TG_TRADE_APPR_BER_I] 
ON [ConfirmMgr].TRADE_APPR] 
INSTEAD OF INSERT
AS
   DECLARE
      @user_name            varchar(50),
      @appr_username        varchar(50),
      @appr_id          int,
      @v_id             int,
      @appr_timestamp       datetime
BEGIN 
    SELECT @appr_username = APPR_BY_USERNAME FROM inserted

    IF (@appr_username) IS NULL
    BEGIN
            SELECT @user_name = SUSER_NAME()
            UPDATE tbl SET APPR_BY_USERNAME = UPPER(@user_name)
            FROM ConfirmMgr.TRADE_APPR tbl
            INNER JOIN inserted i ON tbl.ID = i.ID
    END …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server dml sql-server-2012

2
推荐指数
1
解决办法
5066
查看次数

是否可以验证 DML 语句?

假设我想从数据库中删除一个名为“abc cba”的用户。所以我运行以下查询:

DELETE FROM table WHERE fname = 'abc' AND last name = 'cba'; commit;
Run Code Online (Sandbox Code Playgroud)

现在,可以有更多我不知道这个名字的用户。显而易见的选择是事先运行 select 语句并检查我是否删除了我真正想删除的内容,但我仍然是人类,我可以忘记这一点并最终搜索备份以检索丢失的数据。

我的问题是:有没有办法对语句强加某些规则,之后它们将不会执行 DML 语句(例如,如果删除的行数超过某个阈值,则不执行删除)?

dml

1
推荐指数
1
解决办法
657
查看次数

如何在 Oracle db 中的同一个 `Instead Of` 触发器中组合插入、更新和删除?

创建Instead Of触发器时,Sql Developer 允许在同一个触发器中包含所有 3 个 DML 操作:

在此处输入图片说明

结果 SQL 如下所示:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF DELETE OR INSERT OR UPDATE ON PO_COSTED_BOM_V 
BEGIN
  NULL;
END;
Run Code Online (Sandbox Code Playgroud)

我能够结合InsertUpdate喜欢这样的:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF INSERT OR UPDATE OR DELETE ON PO_COSTED_BOM_V 
BEGIN
  UPDATE SRC_TBL SET CFG_VALUE = :NEW.CFG_VALUE
  WHERE CFG_NAME = :NEW.CFG_NAME;
  IF SQL%NOTFOUND THEN
      INSERT INTO SRC_TBL (CFG_NAME, CFG_VALUE) 
         VALUES(:NEW.CFG_NAME, :NEW.CFG_VALUE);
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)
  • 但是如何将Delete语句放入触发器中?
  • 触发器如何知道执行了哪个 DML 操作?

谢谢

trigger oracle plsql dml

1
推荐指数
1
解决办法
9452
查看次数