我在我的服务器上安装了一个遗留应用程序,该应用程序配置为仅与一个用户“sa”一起工作,并且在此应用程序中编写了类似定时炸弹的脚本,只要它找到另一个用户,它就会毫不费力地删除该用户。
我们需要使用另一个应用程序访问数据库,并且“sa”的密码丢失,因此剩下的唯一方法是创建另一个具有系统管理员权限的用户。
但由于脚本删除了所有用户,我不能做任何特别的事情,所以我的问题是:
每次尝试删除我的用户时,如何阻止该脚本或回滚其工作?
假设我有一个表,trx_request其中包含以下数据
id | confirmed(TIME) | finished(TIME)
-------------------------------------
1 | 12:05:00 | NULL
2 | 13:11:00 | NULL
Run Code Online (Sandbox Code Playgroud)
和另一个trx_updates使用以下数据调用的表
request(FK) | role(INT) | added(TIME)
------------------------------------------
1 | 1 | 14:02:00
Run Code Online (Sandbox Code Playgroud)
我想制作一个触发器,在将记录插入后trx_updates,计算该request字段中有多少记录具有相同的值(例如有多少个“1”)。然后,检查计数是否达到 4(“1”出现 4 次)。当它发生时,它会将 更新trx_requests.finished为 NOW()。
如何在触发器中创建一个计数语句?或者触发器是要走的路?
我想创建一个触发器,它并不如他的名字删除客户Peter。我怎样才能做到这一点?
CREATE TRIGGER trgCUSTOMER ON customer
FOR DELETE
AS
BEGIN
IF (SELECT name FROM deleted) not like 'Peter'
BEGIN
delete from customer where name = (select name from deleted);
END
END;
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2008 Management Studio。我.bak从客户那里得到了一个备份文件来解决一个特定的问题。
从.bak文件中恢复数据库后,我无法执行任何更改查询或更改主密钥。
在我的新数据库中,在客户端环境 DB 中创建的所有触发器都附加到它。所以得到以下错误。
消息 208,级别 16,状态 1,过程 dbtrg_DBEventsmodel,第 16 行
无效的对象名称“DBMonitor.dbo.ddl_DBEvents”。
有没有办法在恢复的数据库中分离这些触发器?
我知道这是您可以在本网站上找到的最简单的问题,但我无法在互联网上找到答案。
如何检查触发器是否由INSERT或触发DELETE?
CREATE TRIGGER [dbo].[TestTrigger]
On [dbo].[Table1]
AFTER INSERT, DELETE
AS
--if save
--do some work
--else if delete
--do some work other work
Run Code Online (Sandbox Code Playgroud)
如果是insert,我想做一些工作,如果是delete ,我想做一些其他工作。
请提供相同的代码片段。
我的同事问我很简单,但对我来说很难的问题:
如果我deleted在INSTEAD OF触发器中有 10 条记录的表并且我删除了其中的 8 条记录,那么我deleted在AFTER触发器中的表中有多少条记录?
我认为它应该是 10,但我不确定。
创建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语句放入触发器中?谢谢
背景
我们正在将遗留应用程序从非关系型数据库迁移到 PostgreSQL。
问题
我们希望在许多字段上启用外键以实现未来的数据完整性,以便报告工具可以轻松确定哪些表已链接。某些当前数据无法通过 FK 检查,并且由于连接到数据库的旧应用程序,我们还无法打开 FK。
临时解决方案
一些程序员建议我们禁用数据库上的触发器,如此处所示,这样 FK 就不会被强制执行,但仍可用于报告工具。
题
我担心这会导致一系列其他意想不到的后果,但我不确定它们是什么。谁能消除我的恐惧或解释为什么这是一个非常糟糕的主意?我假设它不好的一个原因是它会禁用所有触发器,而不仅仅是触发 FK 约束的触发器。
参考我之前关于首选设计的问题,以避免循环或多个更新路径参照完整性通过ON UPDATE CASCADE和级联更新和删除ON DELETE CASCADE,我正在尝试使用触发器作为替代方案。
对于这个例子,我试图尽可能地简化设计。
我有一张Parent桌子和一张Child桌子;Parent并Child共享一列,ParentName。每当Parent.ParentName发生变化时,我都想在Child.ParentName.
够简单吗?如果我更新 中的单行Parent,我可以使用inserted和deleted表很容易地知道要更新Parent和Child表中的哪一行。像这样的东西:
UPDATE Parent
SET Parent.ParentName = inserted.ParentName
FROM Parent
INNER JOIN deleted ON Parent.ParentName = deleted.ParentName
CROSS JOIN inserted;
UPDATE Child
SET Child.ParentName = inserted.ParentName
FROM Child
INNER JOIN deleted ON Child.ParentName = deleted.ParentName
CROSS JOIN inserted;
Run Code Online (Sandbox Code Playgroud)
很明显,如果Parent在一个 …
我对数据库问题没有太多经验,所以请原谅文字墙,我相信上下文对于理解问题和目标很重要。
我每天都会从另一个系统收到一个 CSV 文件,我希望将其保留在 Microsoft SQL Server 上运行的数据库中。为了实现这一点,我每天安排一个 PowerShell 脚本,它使用 bcp 实用程序将 CSV ( accounts.csv ) “加载”到accounts_stage具有 CSV 文件“精确”布局的表 ( ) 中。此外,我将时间戳“写入”到另一个表 ( import_stage) 中。该accounts_stage表具有触发器集,并且 bcp 配置为触发该触发器。
导入完成后,我想“规范化”数据。对于一个基本示例,假设这仅涉及合同编号(在 CSV 文件中名为“Vnr”的字段),它是一个字符串。我有另一个表 ( contracts),它被触发器填充:
INSERT INTO dzp.contractid(vnr)
SELECT DISTINCT
a.Vnr
FROM dzp.accounts_stage a
WHERE NOT EXISTS(
SELECT id.vnr
FROM dzp.contractid id
)
Run Code Online (Sandbox Code Playgroud)
这应该并且似乎完成了将所有导入到表中的合同编号contractids。contractids.contractId是 BIGINT PRIMARY KEY、IDENTITY 和自动增量。
我将导入元数据添加到我的表中,如下所示:
CREATE TABLE #IMPORTMETADATA
([importid] bigint
,[generated_timestamp] datetime …Run Code Online (Sandbox Code Playgroud)