我有一个数据库 Microsoft SQL Server 2008 r2。定义了一个名为 marie 的用户,该用户可以访问主数据库上的表;这很好用。现在,我希望 marie 能够执行此查询:
SELECT resource_type,spid,login_time,status,hostname,program_name,nt_domain,nt_username,loginame
FROM sys.dm_tran_locks dl
JOIN sys.sysprocesses sp on dl.request_session_id = sp.spid
Run Code Online (Sandbox Code Playgroud)
涉及的表是主表;我如何允许玛丽阅读它们?我已经尝试以 dbo 身份执行以下操作:
GRANT ALL on sys.dm_tran_locks TO marie
GRANT ALL on sys.sysprocesses TO marie
Run Code Online (Sandbox Code Playgroud)
尽管如此,当 marie 尝试执行上面的查询时,错误是:
Msg 297, Level 16, State 1, Line 1
The user does not have permission to perform this action.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我制作了一个脚本,一次一个,从数据库中删除所有外键,就像这样:
ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是脚本需要很长时间:平均每个 DROP FK 需要 20 秒。现在,我明白创建 FK 可能是一件大事,因为服务器必须去检查 FK 约束是否从一开始就没有被侵犯,而是下降了?当丢弃需要这么长时间的 FK 时,服务器会做什么?这既是为了我自己的好奇心,也是为了了解是否有办法让事情变得更快。能够删除 FK(不仅仅是禁用它们)将使我在迁移过程中更快,从而最大限度地减少停机时间。
我使用 SQL Server Management Studio (SSMS) 为我的 SQL Server 2008 R2 创建了维护计划。
但是,我无法将其导出/转换为脚本,以防我需要在另一台服务器上重做。
有办法吗?
如果没有,是否有更新版本的 SQL Server 的方法?
我有一个 SQL Server 2016 SP1,其中包含我准备与合作伙伴(开发人员)共享的数据,但有几列除外,例如:
email varchar(64) MASKED WITH (FUNCTION = 'email()') NULL
Run Code Online (Sandbox Code Playgroud)
我向合作伙伴提供了以特定用户身份登录数据库测试副本的凭据,而无需取消屏蔽权限。我知道这是相当安全的。现在,我们正在考虑与我们的合作伙伴共享数据库备份,以便他们可以在自己的服务器和环境中重新加载。
我可能需要包含用户,以便合作伙伴无法创建新用户或将他们连接到现有登录名(对此不确定)。
CREATE USER user_name WITH PASSWORD = 'strong_password';
Run Code Online (Sandbox Code Playgroud)
有没有办法可以共享数据库备份,并且仍然相信被屏蔽的列是安全的,或者我是否必须物理删除数据?
我有一个 Microsoft SQL Server 2008 R2 数据库。
我有一些不同编程语言的应用程序。其中一些是遗留的,我不想修改它们。
有没有办法在服务器级别记录所有查询错误,而不管导致它的应用程序?
我想知道,对于每个错误,导致它的查询、错误类型以及理想情况下的登录名和主机名。
我有一个数据库 Microsoft SQL Server 2008r2。我有一些不同编程语言的应用程序。
我想记录所有超过 X 秒的查询。
我想我应该创建一个事件会话,但我对它们的理解不足以完成这个特定的任务。理想的答案是包含一个包含活动会话示例的在线教程的链接;即使是一本书推荐也会去。
几年前我在微软做过6231A“维护一个Microsoft SQL Server数据库”的培训,但此后我就没有实践过;课件涵盖了论点,但我无法理解。
我有一个 SQL Server 2008 R2 数据库,大约 15 GB。
我想为使用 SQL Server 2008 R2 Express 的合作伙伴复制它。
我删除了很多表和行,现在我确定数据小于2 GB。
我做了一个备份,发送给合作伙伴,他试图恢复它,但他收到一个错误:
CREATE DATABASE 或 ALTER DATABASE 失败,因为由此产生的累积数据库大小将超过每个数据库 10240 MB 的许可限制
我做错了什么?
我使用扩展事件来存储数据库错误,如下所示:
CREATE EVENT SESSION [ErrorCapture]
ON SERVER
ADD EVENT sqlserver.error_reported
(
ACTION
(
sqlserver.client_hostname,
sqlserver.database_id,
sqlserver.sql_text,
sqlserver.username
)
WHERE
(
[severity] >= (11)
)
)
ADD TARGET package0.asynchronous_file_target
(
SET filename='J:\ServerXmlOutput\ErrorCapture.xel'
)
WITH
(
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=10 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
);
Run Code Online (Sandbox Code Playgroud)
这有助于我轻松跟踪导致它们的应用程序。我有类似的东西来跟踪慢查询和其他特殊情况。但是,我从 SQL Server Profiles 中注意到 PHP/Laravel 应用程序不是直接发送一些语句,而是使用 RPC:Completed:它们看起来像准备好的语句,在运行时接收参数。如何扩展我的 ErrorCapture 以包含由通过 RPC:Completed 执行的语句引起的错误?
我有一个由外部公司开发的大型 PHP 应用程序,目前正在完成;我不能要求对其进行更改。它使用一个数据库 Microsoft SQL Server 2016,一些用户通过 SSMS 访问该数据库,包括我,以及在一天中的特定时间由一些计划任务访问。有时我会在一些表格中发现意想不到的内容,这很令人沮丧,因为我不知道它是什么时候到达的。我刚刚发现了时态表:知道记录更改的确切日期和时间将非常有用。
是否可以在应用程序中为 2-3 个关键表添加时态表,而无需更改 PHP 代码?是否存在兼容性或性能风险?
我有一个 Microsoft SQL Server 2008r2 SP1。
我需要知道哪些用户连接到数据库和断开连接。
理想情况下,我想要一个(日期时间、用户名、连接/断开连接)列表。
这可以使用扩展事件来完成吗?或者,还有更好的方法?