C# 当数据库托管在共享位置时,如何清理sql依赖关系

C# 当数据库托管在共享位置时,如何清理sql依赖关系,c#,sql-server,sqldependency,C#,Sql Server,Sqldependency,我们的数据库位于ORCSWEB的共享位置。所以我没有权限执行下面的脚本 KILL QUERY NOTIFICATION SUBSCRIPTION 26 ORCSWEB表示,他们不会允许我们获得执行上述脚本的正确权限,因为他们认为这是他们数据库的安全问题 我尝试运行下面的脚本来从我的c#程序中清除与sql依赖项相关的转储数据,但没有100%成功 下面的运行正常,可以清除对话系统表 我的全部例行程序都在等待许可 private void ClearOldSubscriptions() {

我们的数据库位于ORCSWEB的共享位置。所以我没有权限执行下面的脚本

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();
        }
    }
}