我习惯于在非常安全的环境中工作,因此我将权限设计为非常精细的粒度。我通常做的一件事是明确地为DENY用户提供UPDATE永远不应该更新的列的能力。
例如:
create table dbo.something (
created_by varchar(50) not null,
created_on datetimeoffset not null
);
Run Code Online (Sandbox Code Playgroud)
一旦设置了值,就不应更改这两列。因此,我明确DENY了UPDATE他们的权限。
最近,在一次团队会议上,一位开发人员提出了一个观点,即确保字段永远不会更新的逻辑应该包含在应用程序层而不是数据库层中,以防“他们出于某种原因需要更新值”。对我来说,这听起来像是典型的开发人员心态(我知道,我曾经是其中之一!)
我是我公司的高级架构师,我一直遵循让应用程序运行所需的最少权限的原则。所有权限都会定期审核。
这种情况下的最佳实践是什么?
我有以下MERGE针对数据库发出的语句:
MERGE "MySchema"."Point" AS t
USING (
SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region"
FROM @p1 AS d
JOIN "MySchema"."Region" AS i ON i."Name" = d."Region"
LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id"
) AS s
ON s."ObjectId" = t."ObjectId"
WHEN NOT MATCHED BY TARGET
THEN INSERT ("ObjectId", "Name", "LocationId", "Region") VALUES (s."ObjectId", s."PointName", s."LocationId", s."Region")
WHEN MATCHED
THEN UPDATE
SET "Name" = s."PointName"
, "LocationId" = s."LocationId"
, "Region" …Run Code Online (Sandbox Code Playgroud) 给定一个在 XML 模式集合中定义的元素,如下所示:
<xsd:element name="xid">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="32" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)
您将如何使用 XQuery 更新元素?
该元素位于架构集合的ns命名空间中。我一直在尝试更新以下查询的元素:
update cm.item
set data.modify(
'declare namespace ns="http://www.anon.com";
replace value of (/ns:*/ns:xid)[1] with "X00011793" cast as element(ns{http://www.anon.com}:xid,#anonymous) ?')
where id = 11793
Run Code Online (Sandbox Code Playgroud)
但这会产生以下错误:
消息 9301,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:在此版本的服务器中,“cast as”不可用。请使用“演员为?” 句法。
如果我完全删除演员表并使用此查询:
update cm.item
set data.modify(
'declare namespace ns="http://www.anon.com";
replace value of (/ns:*/ns:xid)[1] with "X00011793"')
where id = 11793
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
消息 2247,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:该值的类型为“xs:string”,它不是预期类型“<anonymous>”的子类型。
如果我发出这个查询: …
object_definition和sp_helptext都返回存储过程的源代码 - 但是如何object_definition像sp_helptext当前那样使用和获取包含换行符的源代码?
例如在下面的代码中,我创建了一个存储过程:
if OBJECT_ID('usp_radhe') is not null
drop procedure usp_radhe
go
-- this procedure is just a test
-- it just returns a date in the past
-- how will I get its source code?
create procedure usp_radhe as
begin
select dateadd(dd,-31,GETDATE())
end
Run Code Online (Sandbox Code Playgroud)
使用sp_helptext我可以很好地查看源代码:
sp_helptext 'usp_radhe'
Run Code Online (Sandbox Code Playgroud)
使用object_definition我在一行中获得源代码,这对我不利:
select OBJECT_DEFINITION(object_id('usp_radhe'))
Run Code Online (Sandbox Code Playgroud)
我试图从表中返回一组不同的部门名称 - 没什么特别的。但是,使用以下查询时会显示重复项:
select distinct department_name
from dbo.departments;
Run Code Online (Sandbox Code Playgroud)
我也试过:
select distinct department_name
from dbo.departments
group by department_name;
Run Code Online (Sandbox Code Playgroud)
所以这让我相信我可能在值中隐藏了字符,果然,当我检查字符串的长度时,它们返回了不同的值。所以,我决定使用堆栈溢出这个问题中的函数来定位隐藏字符。奇怪的是,这只返回 SPACE。然后我尝试了以下查询,它根本没有区别:
select distinct ltrim(rtrim(department_name)) as department_name
from dbo.departments;
Run Code Online (Sandbox Code Playgroud)
出于好奇,我将这些值转换为VARBINARY并注意到它们具有完全相同的二进制值,并且对二进制值执行 aDISTINCT确实会产生一个唯一的结果集。
我也尝试在VARCHAR和NVARCHAR和到不同的排序规则之间进行转换(值在同一列中,在使用 Latin1_General_CI_AI 的同一数据库中)。我真的需要能够从这张表中得到一个不同的集合。有谁知道可能导致这个问题的原因是什么?
更新
经过进一步调查,这个问题似乎只发生在以十六进制值结尾的字符串中0xA000。列中不以该字符结尾的任何值都可以。
更新 2
如果我0xA000从字符串中删除字符,我可以DISTINCT像这样正常应用:
DECLARE @binary VARBINARY(8) = 0xA000;
DECLARE @string VARCHAR(8) = CONVERT(VARCHAR(MAX), @binary);
UPDATE dbo.departments
SET department_name = REPLACE(department_name, @string, '');
Run Code Online (Sandbox Code Playgroud)
但这不会长期有效,因为用户可以更新此表,我需要调整每个查询以在WHERE子句中进行替换。我现在正在使用一种解决方法,它只不过是MIN用于返回长度最短的条目。这不太理想,因为 distinct 的问题也会影响大多数其他语言元素,例如GROUP BY …
我已经在一台服务器上配置了 Reporting Services,ReportServerDb并ReportServerTempDb在另一台服务器上配置了和(扩展部署的未来需求)。
我正在使用域帐户连接到这些服务器。我已经使用 ReportingServiceConfiguration Wizard 配置了 Reporting Services 并且它似乎工作正常,只是Initialization选项卡前面没有绿色勾号(未初始化)。
我得到的错误是:
报表服务器无法打开与报表服务器数据库的连接。登录失败。(rsReportServerDatabaseLogonFailed) 获取联机帮助 登录失败:用户没有被授予在这台计算机上请求的登录类型。(来自 HRESULT 的异常:0x80070569)
我使用的域帐户非常好,我能够使用 SSMS(无密码错误)进行连接。我已经搜索了许多博客、论坛等,但没有找到解决方案。
我有两个集群,每个集群有两个配置为主动/被动的节点;两个集群使用单独的服务器作为见证人参与高可用性镜像会话。
当主集群中的一个节点出现故障时,镜像故障转移似乎在主集群的辅助节点有时间上线之前就开始了。
有没有告诉见证服务器让被动节点在启动故障转移到辅助集群之前尝试联机?
多年来,我们一直在使用变更跟踪解决方案来导出用于 BI 目的的增量。但它直接在生产数据库上运行。为了降低系统负载,我们希望它在一组单独的数据库上运行。
我们通过恢复备份和添加事务日志备份来创建这些数据库。数据库处于备用模式,所以只读。
切换到这些新数据库后,我们开始在处理增量并检查计数与我们随增量提供的总计数后看到差异。
差异通常只是每个表的几条记录,但在具有数百万行且频繁发生数千次变异的表上。并且事务日志备份每 15 分钟完成一次。而且这些更改看起来比这些备份之一的内容要小得多。
所以我们觉得这与未提交的事务有关。
我们发现了这个,它解释了一个类似的问题:
但是使用MAX(commit_ts)fromsys.dm_tran_commit_table而不是的解决方案CHANGE_TRACKING_CURRENT_VERSION()似乎并没有解决差异。
由于变更跟踪功能似乎也在内部使用当前版本。
在追加另一个事务日志备份后,先前返回的变更跟踪版本似乎再次与数据一致。还将数据库联机,也解决了该问题。
使数据库联机不是一种选择,因为我们每天都需要再次进行完全恢复以使数据保持最新。与当前情况相比,新恢复的数据库的性能相当糟糕。
问题是,我们如何从处于待机模式的数据库中获取最后一个一致的更改跟踪版本。
我们的生产环境中有一个主从复制。一开始在master上的mysql错误日志中发现了这个错误,后来在slave上发现了这个错误。至于所有的复制,数据库都很好,从属更新运行良好。尽管如此,此错误仍会出现在 mysql 错误日志中。我只是用谷歌搜索并检查了。这是一个错误。
它是否会对数据库产生任何影响,因为我们有多个复制主从架构的数据库实例?
错误日志:
111116 10:47:57 [Warning] Invalid (old?) table or database name '#sql-3d6f_122a#P#p7'
111116 10:47:57 [Warning] Invalid (old?) table or database name '#sql-3z8g_122a#P#p8'
111116 10:47:57 [Warning] Invalid (old?) table or database name '#sql-3z8g_122a#P#p9'
111116 10:47:57 [Warning] Invalid (old?) table or database name '#sql-3z8g_122a#P#p10'
111116 10:48:29 [Warning] Invalid (old?) table or database name '#sql-3z8g_122a#P#p1'
111116 10:48:29 [Warning] Invalid (old?) table or database name '#sql-3z8g_122a#P#p2'
111116 10:48:29 [Warning] Invalid (old?) table or database name '#sql-3z8g_122a#P#p3'
111116 10:48:29 [Warning] Invalid (old?) …Run Code Online (Sandbox Code Playgroud) 我在数据库上禁用了 TDE,完成后我删除了它的数据库证书。后来我对 node2 执行了手动故障转移,并运行了再次启用 TDE 的步骤。然而,加密状态停留在状态 2,进度为 0%。
错误日志显示:
数据库的数据库加密扫描已中止。重新发出 ALTER DB 以恢复扫描。
每次我重新发出更改语句以打开加密时,它都会显示相同的错误。如果我尝试关闭加密,我会收到一个错误,指出加密过程正在进行中并且无法关闭。
我读了这个问题,但是当我尝试删除证书时,它给了我一个错误,表明证书正在使用中。
sql-server ×9
clustering ×1
collation ×1
distinct ×1
innodb ×1
merge ×1
metadata ×1
mirroring ×1
myisam ×1
mysql ×1
permissions ×1
replication ×1
scripting ×1
ssrs ×1
transparent-data-encryption ×1
xml ×1
xquery ×1