我今天一直在用触发器测试一些东西,但我坚持不懈,我不知道是什么导致了我的问题。
\n\nDELIMITER $$\n\nUSE `pucko`$$\n\nCREATE TRIGGER `after_delete_Alien`\nAFTER DELETE ON `Alien` FOR EACH ROW BEGIN \n DECLARE vapenid INT;\n DECLARE alien_count INT;\n DECLARE rymdskepp_count INT;\n\n SET vapenid = (SELECT vapen FROM `Alien_Anv\xc3\xa4nder_Vapen` WHERE idAlien = OLD.idAlien);\n\n SIGNAL SQLSTATE \'45000\' SET MESSAGE_TEXT = vapenid; // Debug, this shows that vapenid is null?\n\n DELETE FROM `Alien_Anv\xc3\xa4nder_Vapen` WHERE idAlien = OLD.idAlien;\n\n SET alien_count = (SELECT count(*) FROM `Alien_Anv\xc3\xa4nder_Vapen` WHERE vapen = vapenid);\n SET rymdskepp_count = (SELECT count(*) FROM `Rymdskepp_Anv\xc3\xa4nder_Vapen` WHERE vapen = vapenid);\n\n\n if(alien_count …Run Code Online (Sandbox Code Playgroud) 我有一个创建触发器的脚本,我想多次运行它,如果触发器已经存在,则需要跳过创建部分。
mysql触发器中是否有“如果不存在则创建”?
我试过 :
IF NOT EXISTS ((SELECT TRIGGER_NAME
FROM information_schema.triggers
WHERE TRIGGER_SCHEMA = 'xxx_admin' AND TRIGGER_NAME = 'test_AFTER_UPDATE'))
THEN
CREATE DEFINER=`root`@`localhost` TRIGGER `xxx_admin`.`test_AFTER_UPDATE` AFTER UPDATE ON `test` FOR EACH ROW
BEGIN
INSERT INTO auditTest
select *, now() from test where id = NEW.id;
END;
END IF;
Run Code Online (Sandbox Code Playgroud)
我得到:语法错误“'IF'在此位置不是有效输入
我有一个专用架构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(). 但是,该函数不会返回任何我可以用来检查是否已指定架构或与此相关的架构的任何内容...
有没有人有任何想法我怎么能做到这一点?
我有两个表和一个触发器,并且正在ProjectsTable像这样插入值:
CREATE TABLE ProjectsTable
(
ProjectID NUMBER(6) NOT NULL,
ProjectName VARCHAR2(200) NOT NULL,
Cost NUMBER(10,2),
ExpenseTotal NUMBER(10,2),
CostRemaining NUMBER(10,2),
PRIMARY KEY (ProjectID)
);
CREATE TABLE ExpenseTable
(
ID NUMBER(6) NOT NULL,
ProjectID NUMBER(6) NOT NULL,
ExpenseAmount NUMBER(10,2),
ExpenseDate NUMBER(4),
CONSTRAINT fk
FOREIGN KEY (ProjectID)
REFERENCES ProjectsTable(ProjectID)
);
CREATE TRIGGER ExpenseSum AFTER INSERT ON ExpenseTable FOR EACH ROW
BEGIN
UPDATE ProjectsTable P
SET ExpenseTotal =
(SELECT SUM(ExpenseAmount) from ExpenseTable
where ExpenseTable.ProjectID= P.ProjectID)
where P.ProjectID = :New.ProjectID;
END;
/
INSERT …Run Code Online (Sandbox Code Playgroud) 好吧,幸运的是我在我的测试环境中遇到了这个错误。我非常害怕这个错误,以至于我禁用了我在生产环境中使用的所有登录触发器。
我创建了著名的登录触发器,并将数据库置于离线模式,只是为了处理其他事情。然后我发现因为触发器找不到表,所以我不能再访问实例了。有很多与此相关的问题,但即使做了我能找到的一切,我仍然无法访问该实例,即使使用 SQLCMD 也无法访问。
我这样做:
sqlcmd -S server\instance -U sa -P <pass> -A
Run Code Online (Sandbox Code Playgroud)
如果我不使用,-A我会收到著名的错误:
logon failed for sa due trigger execution.
Run Code Online (Sandbox Code Playgroud)
如果我使用-A:
Sqlcmd:错误:Microsoft ODBC Driver 11 for SQL Server:SQL Server 网络接口:获取专用管理员连接 (DAC) 端口时出错。确保 SQL Browser 正在运行,或检查端口号 [xFFFFFFFF] 的错误日志。. Sqlcmd:错误:用于 SQL Server 的 Microsoft ODBC 驱动程序 11:登录超时已过期。Sqlcmd:错误:Microsoft ODBC Driver 11 for SQL Server:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。
为什么我无法连接到sql server
sql server express 在这里。
我可以启用 SQL Browser,但我仍然无法访问它。
我不认为这个问题是重复的,因为不是关于触发器,而是关于为什么我无法使用 SQLCMD 访问服务器。我几乎知道如何解决这个问题。我只是不知道如何在不触发触发器的情况下访问 sql server。
我是 PL/pgSQL 的新手……我使用 Postgres 9.5.0,每次插入新记录时都需要更新一列。该列应从area_pol和 中输入的值中填写area_ofi。
我正在尝试创建此功能以适合我的情况:
CREATE OR REPLACE FUNCTION sch_cap.fc_atualiza_dif_area()
RETURNS trigger AS
$$
BEGIN
UPDATE
sch_cap.tbl_cap
SET
dif_area = abs(100 - (tbl_cap.area_pol / (tbl_cap.area_ofi * 100)));
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER tg_atualiza_dif_area
BEFORE INSERT OR UPDATE ON sch_cap.tbl_cap
FOR EACH ROW EXECUTE PROCEDURE sch_cap.fc_atualiza_dif_area();
Run Code Online (Sandbox Code Playgroud)
但是当我尝试插入记录时,出现以下错误:
错误:超出堆栈深度限制
提示:在确保平台的堆栈深度限制足够后,增加配置参数“max_stack_depth”(当前为 2048kB)。
如何做对?
我想要一个不是表所有者的用户,授予关闭和打开触发器的权限。可以做到吗?
在 Microsoft SQL Server 2017+ 中,我想为单个用户授予dbcreator角色,但只允许她创建名称与固定前缀匹配的数据库。
是否可以使用内置功能或存储过程在数据库级别执行此操作?
我的代码在 PostgreSQL 中运行良好,现在必须将其移植到 MS SQL Server。它涉及具有删除/更新事件潜在周期的表,并且 SQL Server 正在抱怨它:
-- TABLE t_parent
CREATE TABLE t_parent (m_id INT IDENTITY PRIMARY KEY NOT NULL, m_name nvarchar(450));
-- TABLE t_child
CREATE TABLE t_child (m_id INT IDENTITY PRIMARY KEY NOT NULL, m_name nvarchar(450),
id_parent int CONSTRAINT fk_t_child_parent FOREIGN KEY REFERENCES t_parent(m_id)
--ON DELETE CASCADE ON UPDATE CASCADE
);
-- TABLE t_link
CREATE TABLE t_link (m_id INT IDENTITY PRIMARY KEY NOT NULL,
id_parent int CONSTRAINT fk_t_link_parent FOREIGN KEY REFERENCES t_parent(m_id)
-- ON DELETE CASCADE ON …Run Code Online (Sandbox Code Playgroud) 我们定义了一系列配置,其中,在 RESTful API 的驱动下,最终用户可以构建新的修订版本。配置的某些组件可以有多个值;修订涉及具有一对多关系的多个表。
因为配置被运往别处,修订被标记为已部署,并且变得不可变。如果用户想对配置进行更改,他们必须创建一个新修订(可以从现有修订中克隆)。每个配置的一个 修订版可以标记为“当前”;这允许用户随意在过去的修订之间切换,或者通过不选择任何修订来完全禁用配置。当前版本已部署,当将不同版本标记为“当前”时,您将替换已部署的配置。
我们已经准备好了一切来强制部署修订的不变性;当您第一次使用修订作为当前修订时,该deployed列会自动转换为TRUE,并且所有进一步的INSERT,UPDATE和DELETE与修订相关表中部署的修订 ID 匹配的行的操作都将被阻止。
但是,用于公共名称表中的name列的任何值在所有当前配置的所有“当前”修订中都必须是唯一的。我正在尝试找出执行此操作的最佳策略。
如果这是从配置到公共名称的简单一对多关系,则可以通过对name列使用唯一约束来解决。相反,这是一种一对多模式,revision充当桥接表,并将current_revision_id一对多对多关系“折叠”为从配置到虚拟的一对多关系公共名称。
这是一组简化的表格,用于说明我们的情况:
Run Code Online (Sandbox Code Playgroud)-- Configurations CREATE TABLE config ( id INT PRIMARY KEY, name VARCHAR(100), current_revision_id INT ); -- Have multiple revisions CREATE TABLE revision ( id INT PRIMARY KEY, config_id INT NOT NULL REFERENCES config(id), created_at TIMESTAMP WITH TIME ZONE …
trigger ×10
postgresql ×3
sql-server ×3
mysql ×2
permissions ×2
cascade ×1
dac ×1
ddl ×1
ddl-trigger ×1
delete ×1
dml ×1
foreign-key ×1
functions ×1
insert ×1
oracle ×1
oracle-11g ×1
plpgsql ×1
t-sql ×1