我想通过检索和比较来自 sys.sql_modules 的定义来比较在几个不同数据库中应该相同的存储过程。
目前我正在考虑“相同”的程序,除了一个或其他副本在开始或结束时有空行或其他空格。这些似乎是通过制作程序脚本来添加的。我想删除空行等并比较剩下的内容。所以我可以这样做:
IF ( LEFT(@definition1, 2) = NCHAR(13) + NCHAR(10) )
SET @definition1 = SUBSTRING(@definition1, 3, 1048576)
Run Code Online (Sandbox Code Playgroud)
如果过程的长度小于 1048576 字节,这将起作用。但是长度的实际限制是多少——如果有的话?
我想实际上我应该问:比较程序的好方法是什么?(除了“从 Red Gate 购买 SQL 比较实用程序”。)
(修订)我刚刚意识到 sys.sql_modules.definition 具有数据类型 nvarchar(max) 并且具有指定的长度......以字节为单位,POWER(2, 31)-1,除了该公式不起作用;- ) 在 nchar 字符中,不超过 POWER(2, 30)-1。
所以这应该这样做:
IF ( LEFT(@definition1, 2) = NCHAR(13) + NCHAR(10) )
SET @definition1 = SUBSTRING(@definition1, 3, 2147483647)
Run Code Online (Sandbox Code Playgroud)
是的,那是 2^31-1,它应该是 2^30-1,但只要它大于 @definition1 是或可以是,我就可以逃脱。直到他们将“max”增加到 2^63-1 字节。在有“最大”之前,我使用了 8000。
也许我应该包括仔细检查 DATALENGTH() 以防它意外地被截断到某处的前 8000 个字节。
至于你关于良好的代码管理首先不需要这种需求的明智之言 - 有用的弹药,谢谢你(现在从我自己的隐藏中提取子弹)。我认识到有条不紊的工作实践的价值,即使它们也适用于我。但问题在于管理层,假设他们只是想要一份报告或结果 - 现在 - 并且多年来一直在获得和期待这样的服务 - 现在他们已经学会称之为“敏捷”。
晚上好,
是否有面向对象的 PL/SQL 替代品,允许编写服务器端过程[然后称为客户端或服务器端]?
(适用于 MySQL、PostgreSQL、Oracle 等)
当我请求我的数据库服务器 (MySQL) 时,使用 "show grants for current_user"
我注意到我有权执行程序:
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES, EXECUTE
Run Code Online (Sandbox Code Playgroud)
但是当我执行包含这些指令的 sql 文件时:
DROP FUNCTION IF EXISTS
DROP FUNCTION IF EXISTS
DROP PROCEDURE IF EXISTS
CREATE FUNCTION
CREATE PROCEDURE
DECLARE
CALL
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
ERROR 1044 (42000) at line 16: Access denied for user
Run Code Online (Sandbox Code Playgroud)
第 16 行包含: CREATE FUNCTION function_name( .. )
我应该有其他补助金吗?