我试图确保当人们创建表时,它以前缀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
,但似乎没有任何效果它一直告诉我语法不正确请帮助我在网上到处查看并且每个人都说=
或{ {1}}工作。 :(
答案 0 :(得分:3)
虽然另一个答案解释了代码中的问题。我建议你使用Eventdata()
函数来检索表名
即使表格名称以DDL
开头,您的rollback
触发器也会Create Table
每次tb1
次操作。仅当表名不以rollback
开头时,您才需要应用tb1
在IF
条件内移动rollback命令。
当BEGIN-END
条件具有多个语句时使用IF
阻止,否则将在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
答案 1 :(得分:2)
错误是因为在:
处缺少结束括号IF (SELECT SUBSTRING(@name,1,3) != 'tbl'
可以通过添加缺少的右括号来修复:
IF (SELECT SUBSTRING(@name,1,3)) != 'tbl'
但是,您不需要执行select来执行子字符串。
你可以这样做:
IF SUBSTRING(@name,1,3) != 'tbl'