我有一个专用架构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()
. 但是,该函数不会返回任何我可以用来检查是否已指定架构或与此相关的架构的任何内容...
有没有人有任何想法我怎么能做到这一点?
我对 ERP 应用程序进行编程、管理和支持。我更常见的任务之一是了解数据的来源,找到应用程序中特定报告字段与其数据输入字段之间的链接。为此,我必须手动检查一个或多个视图的 DDL SQL 以了解表列,以便将一个视图的表列与另一个视图的表列进行匹配。此手动任务可能需要检查四个或五个抽象层。
是否有一种更快的方法来检查元数据以查找如何从其基表列计算视图列?有没有办法检查 Oracle 的执行计划以查看重写的查询,跳过对中间视图的手动检查?
是否可以有一个基于 Identity 列的具有 PK 的表?
假设我有一个客户表,两个字段对于我们的案例很重要,Id
即 isPK
nvarchar(20)
和SequenceId
which 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) 我有 2 个插入后触发器和 1 个而不是插入触发器的问题。After Insert 触发器应该执行一些操作,但不会触发这些操作。
当替代触发器触发时,它们的动作 After Triggers 工作正常。
让我解释:
“替代”触发器验证该ID
值是否为 Null。如果是,则触发器在表 ( TRADE_APPR
) 中执行插入操作,填充ID
SQL 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) 假设我想从数据库中删除一个名为“abc cba”的用户。所以我运行以下查询:
DELETE FROM table WHERE fname = 'abc' AND last name = 'cba'; commit;
Run Code Online (Sandbox Code Playgroud)
现在,可以有更多我不知道这个名字的用户。显而易见的选择是事先运行 select 语句并检查我是否删除了我真正想删除的内容,但我仍然是人类,我可以忘记这一点并最终搜索备份以检索丢失的数据。
我的问题是:有没有办法对语句强加某些规则,之后它们将不会执行 DML 语句(例如,如果删除的行数超过某个阈值,则不执行删除)?
创建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)
我能够结合Insert
并Update
喜欢这样的:
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 ×6
trigger ×3
oracle ×2
sql-server ×2
ddl ×1
ddl-trigger ×1
plsql ×1
postgresql ×1
t-sql ×1
view ×1