-
05-09-2019 - |
题
我使用MS SQL 2008,我想在数据库中创建一个触发器,它创建动态的。
创建该数据库的其他数据库的存储过程中调用和运行完美,但是当我要添加一个触发器或存储的过程中,执行失败。
如果我试图运行与所述dynamiy SQL
EXEC('USE dbase
GO
CREATE TRIGGER [blah]
GO')
我得到:
错误语法邻近 'GO'
如果我删除“USE ...”触发器会在错误的数据库中创建。
有没有办法来避免自己的问题?
THX
解决方案
“GO” 不是T-SQL语言。这是由客户端工具像SSMS作为分批分离器解释(即意思是“文本发送到服务器”)的关键字。
现在,CREATE TRIGGER必须在批处理的第一条语句,以便可以不使用“USE DBNAME”。
如果您在EXEC之前提到“USE dbnname”,那么它最多可以在连接的默认数据库。你必须测试(我现在不能,对不起)
--Might work
USE dbase
EXEC ('CREATE TRIGGER [blah]
')
或者你将不得不使用SQLCMD或OSQL连接和运行代码:这允许您设置连接的数据库环境。不内T-SQL虽然。
或者你可以尝试ALTER EXEC之前LOGIN XXX与DEFAULT_DATABASE = DBNAME
ALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname
--Now the EXEC will connect to default db if above approach fails
EXEC('CREATE TRIGGER [blah]
')
其他提示
可以调用exec之前切换数据库,和右后切换回:
use newdb
exec ('CREATE TRIGGER [blah] ...')
use originaldb
或者创建链接的服务器向右数据库,用RPC enalbed,和
EXEC ('CREATE TRIGGER [blah] ...') AT LinkedServerName
,或者创建具有在数据库中的默认目录不同的用户,你想创建触发器和:
EXECUTE AS LOGIN = 'UserName'
EXEC ('CREATE TRIGGER [blah] ...')
REVERT
要创建参考仅在确认存在,然后用alter修改。
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MiTrigger]') AND type in (N'TR'))
EXEC ('CREATE TRIGGER [MiTrigger] ON [dbo].[MiTabla] FOR DELETE AS SET NOCOUNT ON')
GO
不隶属于 StackOverflow