【发布时间】:2019-08-16 15:38:50
【问题描述】:
我在删除一行(用户)后编写了触发器来删除名称由该行的 ID 组成的表(但不是每个 ID 都有一个表),如果表中我不喜欢在代码中抛出异常不存在!
CREATE TRIGGER AfterDeleteUser
ON usersProject
FOR DELETE
AS DECLARE @IDres VARCHAR(50),
@tablename VARCHAR(50)
SELECT @IDres = ins.IDressource FROM DELETED ins;
set @tablename = concat('MSG_', @IDres);
SET NOCOUNT ON;
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N'DROP TABLE '+QUOTENAME(@tablename)
EXECUTE sp_executesql @Sql;
go
当表不存在时出现此错误!
Msg 3701、Niveau 11、État 5、Ligne 7
无法删除表“MSG_”,因为它不存在或您没有权限。
【问题讨论】:
-
对象名称应使用
SysName而不是VARCHAR(50) -
在 SQL Server 2016 中,您可以使用:DROP TABLE IF EXISTS ...
-
表退出时触发器运行良好
-
@ManelHkiri 好吧,您还有另一个选项,它在两个版本中都适用。
-
好吧,也许
this demo可以帮助你了解@ManelHkiri。
标签: sql sql-server tsql triggers