Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在所有服务器上都使用DROP触发器_Sql Server - Fatal编程技术网

Sql server 在所有服务器上都使用DROP触发器

Sql server 在所有服务器上都使用DROP触发器,sql-server,Sql Server,我有一个触发器来阻止某人使用Management Studio: CREATE TRIGGER [TR_LOGON_APP] ON ALL SERVER FOR LOGON AS BEGIN DECLARE @program_name NVARCHAR(128) DECLARE @host_name NVARCHAR(128) SELECT @program_name = program_name, @host_name = host_nam

我有一个触发器来阻止某人使用Management Studio:

CREATE TRIGGER [TR_LOGON_APP]
ON ALL SERVER 
FOR LOGON
AS
BEGIN
   DECLARE @program_name NVARCHAR(128)
   DECLARE @host_name NVARCHAR(128)

   SELECT 
       @program_name = program_name, 
       @host_name = host_name
   FROM 
       sys.dm_exec_sessions AS c
   WHERE 
       c.session_id = @@spid

   IF @program_name LIKE '%Management%Studio%' 
   BEGIN
       RAISERROR('Access Denied.',16,1)
       ROLLBACK;
   END
END;
如何检查触发器是否已存在,是否将首先丢弃触发器

我试过使用:

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = N'TR_LOGON_APP' AND [type] = 'TR')
BEGIN
      DROP TRIGGER [TR_LOGON_APP];
END;

但两者都返回一个错误:

System.Data.OleDb.OLEDBEException(0x80040E14):数据库中已存在名为“TR_LOGON_APP”的对象


sys.objects
目录视图包含数据库对象,而不是服务器级对象。改用
sys.server\u触发器

IF EXISTS(SELECT 1 FROM sys.server_triggers WHERE name = N'TR_LOGON_APP')
BEGIN
    DROP TRIGGER TR_LOGON_APP ON ALL SERVER;
END;

sys.objects
目录视图包含数据库对象,而不是服务器级对象。改用
sys.server\u触发器

IF EXISTS(SELECT 1 FROM sys.server_triggers WHERE name = N'TR_LOGON_APP')
BEGIN
    DROP TRIGGER TR_LOGON_APP ON ALL SERVER;
END;

您必须在drop和createSQL之间插入GO命令,编译器将在运行脚本之前进行检查,这就是为什么您需要error@EagerToLearn:它实际上是批量运行的,但我尝试在脚本之间使用
GO
命令运行它,但仍然返回相同的错误,因此问题可能在于您的查询,尝试定位触发器的真正位置您必须在drop和createSQL编译器之间插入GO命令,编译器将在运行脚本之前进行检查,这就是为什么您需要error@EagerToLearn:它实际上正在批量运行,但是我尝试在脚本之间使用
GO
命令运行它,但仍然返回相同的错误,所以问题可能在于您的查询,请尝试查找触发器的实际位置