C# 当数据库托管在共享位置时,如何清理sql依赖关系
我们的数据库位于ORCSWEB的共享位置。所以我没有权限执行下面的脚本C# 当数据库托管在共享位置时,如何清理sql依赖关系,c#,sql-server,sqldependency,C#,Sql Server,Sqldependency,我们的数据库位于ORCSWEB的共享位置。所以我没有权限执行下面的脚本 KILL QUERY NOTIFICATION SUBSCRIPTION 26 ORCSWEB表示,他们不会允许我们获得执行上述脚本的正确权限,因为他们认为这是他们数据库的安全问题 我尝试运行下面的脚本来从我的c#程序中清除与sql依赖项相关的转储数据,但没有100%成功 下面的运行正常,可以清除对话系统表 我的全部例行程序都在等待许可 private void ClearOldSubscriptions() {
KILL QUERY NOTIFICATION SUBSCRIPTION 26
ORCSWEB表示,他们不会允许我们获得执行上述脚本的正确权限,因为他们认为这是他们数据库的安全问题
我尝试运行下面的脚本来从我的c#程序中清除与sql依赖项相关的转储数据,但没有100%成功
下面的运行正常,可以清除对话系统表
我的全部例行程序都在等待许可
private void ClearOldSubscriptions()
{
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand())
{
string sql =
////@"DECLARE @UniqueTimeout AS int = 3586; " +
@"DECLARE @SubscriptionId AS int; " +
@"DECLARE @Sql AS varchar(max); " +
@"DECLARE SubscriptionCursor CURSOR LOCAL FAST_FORWARD " +
@" FOR " +
@" SELECT id " +
@" FROM sys.dm_qn_subscriptions " +
@" WHERE database_id = DB_ID() " +
@" AND timeout = @UniqueTimeout " +
@"OPEN SubscriptionCursor; " +
@"FETCH NEXT FROM SubscriptionCursor INTO @SubscriptionId; " +
@"WHILE @@FETCH_STATUS = 0 " +
@"BEGIN " +
@" SET @Sql = 'KILL QUERY NOTIFICATION SUBSCRIPTION ' + CONVERT(varchar, @SubscriptionId); " +
@" EXEC(@Sql); " +
@" " +
@" FETCH NEXT FROM SubscriptionCursor INTO @SubscriptionId; " +
@"END";
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = sql;
command.Parameters.Add("@UniqueTimeout", SqlDbType.Int).Value = 432000;
connection.Open();
command.ExecuteNonQuery();
}
}
}
private void ClearNotificationQueue()
{
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand())
{
string sql =
@"DECLARE @Conversation AS uniqueidentifier; " +
@"DECLARE ConversationCursor CURSOR LOCAL FAST_FORWARD " +
@" FOR " +
@" SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP " +
@" WHERE CEP.state = 'DI' or CEP.state = 'CD' " +
@" " +
@"OPEN ConversationCursor; " +
@"FETCH NEXT FROM ConversationCursor INTO @Conversation; " +
@"WHILE @@FETCH_STATUS = 0 " +
@"BEGIN " +
@" END CONVERSATION @Conversation WITH CLEANUP; " +
@" " +
@" FETCH NEXT FROM ConversationCursor INTO @Conversation; " +
@"END " +
@"";
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = sql;
connection.Open();
command.ExecuteNonQuery();
}
}
}
我想知道谁将从这个系统表中清除旧订阅
sys.dm_qn_subscriptions
嗯,我们不能这样做。您需要向管理服务器的人员澄清这一点。
private void ClearOldSubscriptions()
{
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand())
{
string sql =
////@"DECLARE @UniqueTimeout AS int = 3586; " +
@"DECLARE @SubscriptionId AS int; " +
@"DECLARE @Sql AS varchar(max); " +
@"DECLARE SubscriptionCursor CURSOR LOCAL FAST_FORWARD " +
@" FOR " +
@" SELECT id " +
@" FROM sys.dm_qn_subscriptions " +
@" WHERE database_id = DB_ID() " +
@" AND timeout = @UniqueTimeout " +
@"OPEN SubscriptionCursor; " +
@"FETCH NEXT FROM SubscriptionCursor INTO @SubscriptionId; " +
@"WHILE @@FETCH_STATUS = 0 " +
@"BEGIN " +
@" SET @Sql = 'KILL QUERY NOTIFICATION SUBSCRIPTION ' + CONVERT(varchar, @SubscriptionId); " +
@" EXEC(@Sql); " +
@" " +
@" FETCH NEXT FROM SubscriptionCursor INTO @SubscriptionId; " +
@"END";
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = sql;
command.Parameters.Add("@UniqueTimeout", SqlDbType.Int).Value = 432000;
connection.Open();
command.ExecuteNonQuery();
}
}
}
private void ClearNotificationQueue()
{
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand())
{
string sql =
@"DECLARE @Conversation AS uniqueidentifier; " +
@"DECLARE ConversationCursor CURSOR LOCAL FAST_FORWARD " +
@" FOR " +
@" SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP " +
@" WHERE CEP.state = 'DI' or CEP.state = 'CD' " +
@" " +
@"OPEN ConversationCursor; " +
@"FETCH NEXT FROM ConversationCursor INTO @Conversation; " +
@"WHILE @@FETCH_STATUS = 0 " +
@"BEGIN " +
@" END CONVERSATION @Conversation WITH CLEANUP; " +
@" " +
@" FETCH NEXT FROM ConversationCursor INTO @Conversation; " +
@"END " +
@"";
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = sql;
connection.Open();
command.ExecuteNonQuery();
}
}
}