我试图确保当人们创建表时,它以前缀开头tbl
以下是我目前所做的:
CREATE TRIGGER trg_tbl ON DATABASE
FOR CREATE_TABLE
AS
DECLARE @name VARCHAR(25)
SET @name = (SELECT TOP 1 name
FROM sys.tables
ORDER BY create_date DESC)
IF (SELECT SUBSTRING(@name, 1, 3) != 'tbl'
PRINT 'Tables must begin with the prefix tbl'
ROLLBACK
GO
问题是它不允许我使用!=
运算符。我尝试使用=
<>
或LIKE
但似乎没有任何效果,它一直告诉我语法不正确,请帮助我在网上到处查找,每个人都说=
或LIKE
工作。:(
尽管另一个答案解释了代码中的问题。我建议您使用Eventdata()
函数来检索表名
此外,您的DDL
触发器将rollback
每个Create Table
操作,即使表名以 tb1
开头。仅当表名不以 rollback
开头时才需要应用 tb1
在 IF
条件内移动回滚命令。
当条件有多个语句时IF
请使用BEGIN-END
块,否则第一个语句将在IF
条件中单独考虑。
CREATE TRIGGER trg_tbl
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
SET NOCOUNT ON
DECLARE @TABLE_NAME SYSNAME
SELECT @TABLE_NAME = Eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME')
IF LEFT (@TABLE_NAME, 3) != 'tbl'
BEGIN
PRINT 'Tables must begin with the prefix tbl'
ROLLBACK
END
END
GO
错误是由于缺少以下处的右括号:
IF (SELECT SUBSTRING(@name,1,3) != 'tbl'
可以通过添加缺少的右括号来修复:
IF (SELECT SUBSTRING(@name,1,3)) != 'tbl'
但是,您无需执行选择即可执行子字符串。
您可以这样做:
IF SUBSTRING(@name,1,3) != 'tbl'