我怀疑我今天的 Google 技能不够,但我正在寻找一个快速的 TSQL 脚本,该脚本将识别包存储中使用给定环境变量名称的所有 SSIS 包。
例如,当我配置一个包并查看 Paramaters 页面时,我可以选择一个给定的环境变量。在以下屏幕截图中,我关注的环境变量名为SMTP。我想找到所有使用这个环境变量的包,这样我就可以在进行任何大规模更改之前进行一些调查/测试。
如果有人有现成的脚本,我将不胜感激,如果你能发布它,否则我会在编码后发布一些东西。
谢谢!
我对 T-SQL 比较陌生,在查看我的前辈脚本时,我发现了一条我无法解析的行。自己去查查是一件很困难的事情。希望指教。
这条线出现在 WHILE 循环内,但我认为这并不重要。我相信从功能上讲,这是从共享 ID 的几行中的一列中收集值,并将它们用逗号连接到 1 个字段中。但我不知道这叫什么,也不知道如何查找以供自己使用。
这个'x'最后在做什么?谁能给我指点这方面的信息?
(select @invtid = coalesce(@invtid + ',',' ')+rtrim(RoleID)
FROM (
Select distinct roleid
from UserAccounts
WHERE CustID = @custID
)
x)
Run Code Online (Sandbox Code Playgroud)
谢谢。
我正在尝试调试一个应用程序,我想在处理代码之前排除数据库错误。
我知道哪个存储过程负责处理我正在查看的数据,但是在此数据库上没有设置日志记录或任何跟踪。有没有办法使用现有的系统日志恢复传递给该过程的参数?
我看:
dm_exec_procedure_stats和fn_dblog,但他们似乎并没有把我需要什么。
我正在设置日志记录。
我一直在阅读 SQL 注入,作为对相当大的 Web 服务进行安全审计的一部分。我一直在谷歌搜索并阅读我可以在这里和 SO 上找到的所有帖子,并且对真正应该如何构建动态查询以及 MySQL 和 MSSQL 之间的一些差异有相当深入的了解。我最终看到了今年早些时候由 Microsoft 发布的名为SQL Injection 的页面。在标题为“过滤输入”的部分中,它指出:
通过删除转义字符,过滤输入也可能有助于防止 SQL 注入。但是,由于可能会出现问题的字符数量众多,因此这不是可靠的防御。以下示例搜索字符串定界符。
private string SafeSqlLiteral(string inputSQL)
{
return inputSQL.Replace("'", "''");
}
Run Code Online (Sandbox Code Playgroud)
编写安全代码第二版也在第 401-402 页讨论了这一点,但看起来作者实际上并没有尝试 C# 示例(或者他在 2003 年使用的 SQL 版本可能没有正确处理转义字符串)。它指出字符串输入将导致无效查询(实际上,转义只是查询其中带有单引号的值),然后指出它也可能会被使用未加引号的数字字段的值攻击(尽管不能,因为示例中的字段来自类型为 的局部变量int,它不可能包含注入所需的信息)。
我不怀疑这里存在可能的攻击向量,但我无法找到有关如何实现这一点的任何解释。从我的其他研究来看,一种可能的方法可能涉及非 Unicode 字符串中的奇怪字节序列。就我而言,我正在使用 .NET,所以不可能有这样的序列,我认为 ADO.NET、SQL Server 或两者都可以正确处理 Unicode 字符串与单个内部的任何其他类型的字符-引号。(虽然有趣的是示例代码似乎是在 C# 中)。
我也很清楚微软页面上列出的其他 SQL 注入方法,对于这个问题,我并不担心这些。此外,我只关心此处正确键入的字符串文字输入。此代码始终在编写 SQL 查询之前将传入类型解析为其适当的运行时类型,因此引号转义仅适用于数据是文字字符串数据时。所以就我而言,该函数实际上更像是:
private string SafeSqlStringLiteral(string inputString)
{
return "'" + inputString.Replace("'", "''") + "'";
}
Run Code Online (Sandbox Code Playgroud)
我最关心的就是文档中的下面这句话:
但是,由于可能会出现问题的字符数量众多,因此这不是可靠的防御。
这只是指奇怪的单字节编码,还是有适用于的 Unicode 字符(我无法以编程方式找到一个)?
我正在审查的代码非常广泛,并且在很多地方都使用了这种类型的转义(并且以一种不容易修复的方式)。我不是直接要求利用漏洞(这对 IIRC …
我试图通过使用 SELECT 和我提供给编译器的集合中的一个(随机?)字符串来替换表中的 NULL 值。
例子:
|id | date |
+---+------+
| 1 | 2017 |
| 2 | NULL |
| 3 | NULL |
Run Code Online (Sandbox Code Playgroud)
我希望NULL值是“2015”、“2012”等,从我指定的集合中随机获取。
不幸的是,COALESCE只返回第一个非空值,而不是指定的值。是否有一些功能,如:
IF column_value = 'NULL (or something)' THEN RAND(string1, string2, string3, string4).
Run Code Online (Sandbox Code Playgroud)
提前致谢。
任何人都可以帮助解决我认为是一个简单的问题。
一位 DBA 朋友和我讨论了一般的兼容性级别,特别是它们与安全性的关系。他认为,使它们尽可能最新的一个很好的理由是减少由它们引起的安全漏洞。我反驳说,以前的 SP 和当前的 CU 和修补程序肯定会修补这些漏洞,即在 2014 SQL Server 实例中以 2005 兼容模式运行数据库肯定不会将该数据库恢复到 2005 SP4 安全级别/漏洞。
我一直在寻找支持此声明的文档,但一直找不到。有没有人知道任何权威文档可以告诉我正确或错误?
下面的脚本将查询 Ola 的维护解决方案结果表 (CommandLog),并在过去 4 周内对每两周一次的重新索引执行持续时间进行比较。
现在看起来,这是一个快速的技巧,可以帮助我调整维护窗口。但我想删除日期硬编码,这样我就不必在未来的每个周末手动添加一个新的 JOIN。
请提供完整的重写(动态 SQL?)或仅提供有关如何实现此功能或要包含的其他一些有用功能的一些提示。确定更改 sproc 并将额外的输出添加到表中。使用 SQL 2016。如果已经有一个脚本可以满足这个目的,那么很高兴使用那个脚本。
WITH t0 AS
(
SELECT ObjectName, IndexName, IndexType
FROM Tools.dbo.CommandLog
WHERE 1=1
AND DatabaseName = 'testdb'
AND CommandType = 'ALTER_INDEX'
GROUP BY ObjectName, IndexName, IndexType
)
SELECT
t0.ObjectName
,t0.IndexName
,t0.IndexType
,DATEDIFF(ss,t1.StartTime,t1.EndTime) as '20-40 01-06'
,DATEDIFF(ss,t2.StartTime,t2.EndTime) as '5-40 01-07'
,DATEDIFF(ss,t3.StartTime,t3.EndTime) as '20-40 01-13'
,DATEDIFF(ss,t4.StartTime,t4.EndTime) as '5-40 01-14'
,DATEDIFF(ss,t5.StartTime,t5.EndTime) as '20-40 01-20'
,DATEDIFF(ss,t6.StartTime,t6.EndTime) as '5-40 01-21'
,DATEDIFF(ss,t7.StartTime,t7.EndTime) as '20-40 01-27'
,DATEDIFF(ss,t8.StartTime,t8.EndTime) as '5-40 01-28'
FROM t0
LEFT JOIN …Run Code Online (Sandbox Code Playgroud) 我目前正处于 Azure SQL 数据库平台上新数据库的开发阶段。它不会在新的几个月上线。我正在使用各种标量值函数,其中一个是将 UTC 转换为在配置表中指定的本地日期,例如澳大利亚东部标准时间
该函数被调用如下:
SELECT
dbo.fnGetLocalDate(DateColumn) as DateColumn,
FROM
table
Run Code Online (Sandbox Code Playgroud)
有没有人对如何在这种情况下避免功能有任何建议?我发现它们对代码重用很有用,但我不确定如何在此处避免它。
我还想知道 vNext 是否可以解决 Azure 平台中函数的性能问题,我最好继续使用函数。
CREATE FUNCTION [dbo].[fnGetLocalDate]
(
@DateToConvert datetimeoffset = NULL
)
RETURNS datetimeoffset
AS
BEGIN
DECLARE @TimeZone varchar(50)
RETURN
CASE
WHEN @DateToConvert is NULL then NULL
ELSE
CONVERT(datetimeoffset, @DateToConvert AT TIME ZONE (SELECT Value FROM LookUp.Config WHERE Property = 'TimeZone'))
END
END
Run Code Online (Sandbox Code Playgroud) 我执行了
SELECT N'ALTER LOGIN ' + QUOTENAME(name)
+ N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;'
FROM sys.sql_logins
--WHERE is_policy_checked = 0;
Run Code Online (Sandbox Code Playgroud)
但我不想要MUST_CHANGE登录选项。
这个查询实际上改变了什么还是只是一个简单的选择?
我正在开发一个 SQL Server 2016 存储过程,我想获取varchar(38)列的最后一个字符。
我知道总会有至少 18 个字符,我不知道列的确切长度,因为它是可变的。
我想我可以得到列的长度并做一个减法来使用SUBSTRING,但我不能这样做,因为我正在这样做:
set @externalCodes = (
select Serial, AggregationLevel
from ExternalCode where ProductionOrderId = @productionOrderId
for json path
Run Code Online (Sandbox Code Playgroud)
我正在生成一个 JSON,但我不知道如何获取Serial选择中每列的长度。
我的问题是:如何在不知道长度的情况下从没有前 18 个字符的字符串中获取子字符串?
一种解决方案可能是:
SUBSTRING(Serial, 18, 38)
Run Code Online (Sandbox Code Playgroud)
并且它总是返回从 18 到字符串末尾的子字符串,即使字符串的长度不是 38。