阅读 大约需要 4 分钟

  在上一篇随笔中记录的是关于Azure Cosmos DB 中SQL API (DocumentDB) 的简介和Repository 的实现。本随笔是Document DB 中存储过程(Stored Procedure)、触发器(Triggers)、用户自定义函数(User Defined Functions)的实现方式。

存储过程(Stored Procedure)

1. 创建存储过程,需要四个参数,以此分别为数据库名,collection名,需要创建的存储过程名,存储过程的内容(内容使用的语言请参照官网:https://docs.microsoft.com/zh-cn/azure/cosmos-db/how-to-write-stored-procedures-triggers-udfs)

注:catch execption只是简写,抛出异常。

public async Task<bool> CreateStoredProcedureAsync(string databaseName, string collectionName, string storedProId, string body)
{
try
{
var sproc = new StoredProcedure()
{
Id = storedProId,
Body = body
};
var uri = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName);
await TryDeleteStoredProcedure(uri, storedProId);
var result = await _client.Value.CreateStoredProcedureAsync(uri, sproc); return result.StatusCode == HttpStatusCode.OK || result.StatusCode == HttpStatusCode.Created;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} // 为避免重复的存储过程名 而引发的的异常(以下触发器,自定义函数类同)。
private async Task TryDeleteStoredProcedure(Uri uri, string storedProId)
{
var sproc = _client.Value.CreateStoredProcedureQuery(uri).Where(x => x.Id == storedProId).AsEnumerable().FirstOrDefault(); if (sproc != null)
{
await _client.Value.DeleteStoredProcedureAsync(sproc.SelfLink);
}
}

  

2. 读取存储过程,第四个参数(procedureParams)为存储过程可能需要的参数.

public async Task<T> ExecuteStoredProcedureAsync<T>(string databaseName, string collectionName, string storedProId, params object[] procedureParams) where T : new()
{
StoredProcedureResponse<dynamic> result = await _client.Value.ExecuteStoredProcedureAsync<dynamic>(UriFactory.CreateStoredProcedureUri(databaseName, collectionName, storedProId), procedureParams); if (result.StatusCode == HttpStatusCode.OK)
{
return JsonConvert.DeserializeObject<T>(result.Response?.ToString());
} throw new ArgumentException("Execute stored ptocedure failed");
}

  

触发器(Triggers)

1. 创建触发器

public async Task<bool> CreateTriggerAsync(string databaseName, string collectionName, string triggerId, string triggerBody, TriggerOperation triggerOperation, TriggerType triggerType)
{
try
{
var trigger = new Trigger()
{
Id = triggerId,
Body = triggerBody,
TriggerOperation = triggerOperation,
TriggerType = triggerType
};
var uri = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName);
await TryDeleteTrigger(uri, triggerId);
var result = await _client.Value.CreateTriggerAsync(uri, trigger); return result.StatusCode == HttpStatusCode.OK || result.StatusCode == HttpStatusCode.Created;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} private async Task TryDeleteTrigger(Uri uri, string triggerId)
{
var trigger = _client.Value.CreateTriggerQuery(uri).Where(x => x.Id == triggerId).AsEnumerable().FirstOrDefault(); if (trigger != null)
{
await _client.Value.DeleteTriggerAsync(trigger.SelfLink);
}
}

以上代码中有两个传入参数TriggerOperation 和 TriggerType

  TriggerOperation 参数有五种类型,分别为:

    All = 0,
    Create = 1,
    Update = 2,
    Delete = 3,
    Replace = 4

  TriggerType 参数有两种类型,分别为前触发器 TriggerType(Pre = 0)和 后触发器(Post = 1)。

2. 使用触发器

public async Task<bool> CreateDocumentAsync<T>(string databaseName, string collectionName, T document, RequestOptions requestOptions) where T : class
{
try
{
await CreateDocumentCollectionAsync(collectionName, databaseName);
var uri = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName); var response = await _client.Value.CreateDocumentAsync(uri, document, requestOptions); bool result = (response != null && (response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.OK)); return result;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

其中RequestOptions 参数可以作为触发器Id/name传入,其中传入的方式需要注意下,传入的类型按照前触发器和后触发器两种参入,如图:

怎么传,举个例子:var option = new RequestOptions() { PreTriggerInclude = new List<string>() { "GetBrithDate" } };

用户自定义函数(User Defined Functions)

1. 创建用户自定义函数

public async Task<bool> CreateUserDefinedFunctionAsync(string databaseName, string collectionName, string udfId, string body)
{
try
{
var udf = new UserDefinedFunction()
{
Id = udfId,
Body = body
};
var uri = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName);
await TryDeleteUserDefinedFunction(uri, udfId);
var result = await _client.Value.CreateUserDefinedFunctionAsync(uri, udf); return result.StatusCode == HttpStatusCode.OK || result.StatusCode == HttpStatusCode.Created;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} private async Task TryDeleteUserDefinedFunction(Uri uri, string udfId)
{
var udf = _client.Value.CreateUserDefinedFunctionQuery(uri).Where(x => x.Id == udfId).AsEnumerable().FirstOrDefault(); if (udf != null)
{
await _client.Value.DeleteUserDefinedFunctionAsync(udf.SelfLink);
}
}

2. 运用自定义函数

public async Task<IEnumerable<T>> GetDocumentByUDF<T>(string databaseName, string collectionName, string sqlExpression, FeedOptions feedOptions = null) where T : new()
{
try
{
var uri = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName);
var query = _client.Value.CreateDocumentQuery<T>(uri, sqlExpression, feedOptions).AsDocumentQuery(); var results = new List<T>();
while (query.HasMoreResults)
{
results.AddRange(await query.ExecuteNextAsync<T>());
} return results;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
} }

sqlExpression 为传入的sql 语句,具体 这个sql 语句怎么写,例如:

其中 数据库中用户自定义函数是这样定义的:

function getTitle(profession) {

    if (profession === undefined)
throw 'no input'; if (profession === "Angular" || profession === "Vue" || profession === "React")
return "FrontEnd";
else if (profession === "Net" || profession === "Java")
return "BackEnd";
else
return "FullStack";
}

那么 sqlExpression = $"SELECT * FROM c where udf.getTitle(c.Profession) = '{换成插入值}'";

简单笔记,还有待继续挖掘,正在继续努力,想要了解和学习的 还请 切到Cosmos DB官网:https://docs.microsoft.com/zh-cn/azure/cosmos-db/how-to-write-stored-procedures-triggers-udfs

本随笔链接:https://www.cnblogs.com/OneManStep/p/10266217.html 

Azure Document DB 存储过程、触发器、自定义函数的实现的更多相关文章

  1. MySQL存储过程/存储过程与自定义函数的区别

    语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...

  2. (转)MySQL存储过程/存储过程与自定义函数的区别

    转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}]  ...

  3. Oracle存储过程和自定义函数

    新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...

  4. 【存储过程】MySQL存储过程/存储过程与自定义函数的区别

    ---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...

  5. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

  6. SQL中存储过程和自定义函数的区别

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  7. SQL中存储过程和自定义函数的区别(转载)

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  8. Azure Document DB Repository 的实现

    阅读 需要大约  5 分钟. 前景: Azure Cosmos DB 由 Microsoft 提供,是全球分布式多模型数据库. 通过 Azure Cosmos DB 跨任意数量的 Azure 地理区域 ...

  9. C# 得到sqlserver 数据库存储过程,触发器,视图,函数 的定义

    经常从 生产环境 到测试环境, 需要重新弄一整套的数据库环境, 除了表结构以及表结构数据,可以用动软代码生成器 生成之外, 像 存储过程,触发器,等,好像没有批量操作的,意义哥哥农比较麻烦, 所以最近 ...

随机推荐

  1. redis-集群创建脚本

    之前建好了redis集群, 但没有找到集群重启的机制, 停电2次, 重新创建太麻烦, 于是写了个脚本辅助启动 redis的创建过程可以看: http://www.cnblogs.com/wenbron ...

  2. 基于VUE的SPA单页应用开发-加载性能篇

    1.基于异步数据的vue页面刷新 先看看基于异步数据的vue页面刷新后,都发生了啥- 如图所示: 图1 基于异步数据的vue页面刷新 网络请求图 步骤如下: step1:请求页面: step2:请求页 ...

  3. nodeJs的npm报错问题

    1. Failed at the phantomjs-prebuilt@2.1.14 install script 'node install.js'. 解决办法: npm install phant ...

  4. Python List 基础学习

    list&tuple&dict list list 常见操作 初始化: list1 = [123, 'abc', 4.56, ['inner', 'list'], 7-9j] list ...

  5. jade——创建第一个jade模板

    什么是jade? jade是node.js的一个模板引擎,参考了haml的语法,是简写的html语言. 使用单个标签代替双标签,类似于Python,通过缩进来确定从属关系,没有结束符号,非常简洁,使用 ...

  6. MFC动态时间表示法——strtime函数

    %a 星期几的简写 %A 星期几的全称 %b 月分的简写 %B 月份的全称 %c 标准的日期的时间串 %C 年份的后两位数字 %d 十进制表示的每月的第几天 %D 月/天/年 %e 在两字符域中,十进 ...

  7. .net core 2.2 部署CentOS7(5)部署.net core mvc

    目录: .net core 2.2 部署CentOS7(1)安装虚拟机 .net core 2.2 部署CentOS7(2)给虚拟机安装CentOS7 .net core 2.2 部署CentOS7( ...

  8. 十八、curator recipes之DistributedDelayQueue

    简介 curator实现了类似DelayQueue的分布式延迟队列 官方文档:http://curator.apache.org/curator-recipes/distributed-delay-q ...

  9. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

  10. JavaScript之DOM操作(二)

    这一篇写写常用并且通用的操作节点的一些方法. 1.节点方法 1>appendChild() 向childNodes列表的末尾添加一个节点,语法 var aChild = element.appe ...