小编Sol*_*zky的帖子

将有关谁删除记录的信息传递给删除触发器

在设置审计跟踪时,跟踪谁在表中更新或插入记录没有问题,但是,跟踪谁删除记录似乎更成问题。

我可以通过在插入/更新字段中包含“UpdatedBy”来跟踪插入/更新。这允许 INSERT/UPDATE 触发器通过inserted.UpdatedBy. 但是,使用删除触发器不会插入/更新数据。有没有办法将信息传递给删除触发器,以便它知道谁删除了记录?

这是一个插入/更新触发器

ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate] 
ON [dbo].[MyTable]
FOR INSERT, UPDATE
AS  

INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges) 
VALUES (inserted.ID, inserted.LastUpdatedBy)
FROM inserted 
Run Code Online (Sandbox Code Playgroud)

使用 SQL Server 2012

trigger sql-server audit sql-server-2012

13
推荐指数
2
解决办法
2万
查看次数

将逗号作为小数点分隔符的字符串数值转换为 NUMERIC(10, 2)

我有一个包含希腊格式数字的 varchar 列的 SQL 表(。作为千位分隔符,逗号作为小数点分隔符)

经典的转换

CONVERT(numeric(10,2),REPLACE([value],',','.'))
Run Code Online (Sandbox Code Playgroud)

不起作用,因为 . (千位分隔符)杀死转换

例如尝试

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))
Run Code Online (Sandbox Code Playgroud)

我想将这些值转换为数字(10,2)

有关如何处理的任何建议?

sql-server t-sql type-conversion decimal string

13
推荐指数
2
解决办法
10万
查看次数

修剪空白(空格、制表符、换行符)

我在 SQL Server 2014 上,我需要从列内容的开头和结尾清除空格,其中空格可以是简单的空格、制表符或换行符(\n\r\n);例如

'    this content    '                          should become 'this content'
'  \r\n   \t\t\t this \r\n content \t  \r\n   ' should become 'this \r\n content'
Run Code Online (Sandbox Code Playgroud)

等等。

我只能实现第一个案例

UPDATE table t SET t.column = LTRIM(RTRIM(t.column))
Run Code Online (Sandbox Code Playgroud)

但对于其他情况,它不起作用。

sql-server t-sql sql-server-2014 string-manipulation

13
推荐指数
1
解决办法
5万
查看次数

在 SQL Server 中,有没有办法确定传递给正在执行的存储过程的参数的值

确定正在执行的存储过程的一种方法是使用“动态管理”方法,如下所示:

SELECT 
    sqlText.Text, req.* 
FROM 
    sys.dm_exec_requests req
OUTER APPLY 
    sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Run Code Online (Sandbox Code Playgroud)

但是,这仅显示存储过程的 create 语句的文本。例如:

CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想看看运行过程的参数是什么,导致它针对特定的一组违规参数运行这么长时间。

有没有办法做到这一点?(在这个问题中, Aaron Bertrand提到了DBCC InputBuffer,但我认为这不适合这个问题。)

sql-server-2005 sql-server stored-procedures t-sql dmv

13
推荐指数
2
解决办法
2万
查看次数

SQL Server 的 8 KB 数据页中未使用 512 字节

我创建了下表:

CREATE TABLE dbo.TestStructure
(
    id INT NOT NULL,
    filler1 CHAR(36) NOT NULL,
    filler2 CHAR(216) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

然后创建了一个聚集索引:

CREATE CLUSTERED INDEX idx_cl_id 
ON dbo.TestStructure(id);
Run Code Online (Sandbox Code Playgroud)

接下来我用 30 行填充它,每个大小为 256 字节(基于表声明):

DECLARE @i AS int = 0;

WHILE @i < 30
BEGIN
    SET @i = @i + 1;

    INSERT INTO dbo.TestStructure (id, filler1, filler2)
    VALUES (@i, 'a', 'b');
END;
Run Code Online (Sandbox Code Playgroud)

现在根据我在“Training Kit (Exam 70-461): Querying Microsoft SQL Server 2012 (Itzik Ben-Gan)”一书中读到的信息:

SQL Server 在内部以页为单位组织数据文件中的数据。一个页面是一个 8 KB 的单位,属于一个单一的对象;例如,到表或索引。页是读取和写入的最小单位。页面被进一步组织成范围。一个区由八个连续的页面组成。一个范围内的页面可以属于单个对象或多个对象。如果页面属于多个对象,则该范围称为混合范围;如果页面属于单个对象,则该范围称为统一范围。SQL Server 将对象的前八页存储在混合区中。当对象超过八页时,SQL Server 会为此对象分配额外的统一区。通过这种组织,小物体浪费的空间更少,大物体的碎片化程度也更低。

所以这里我有第一个混合范围 …

index sql-server data-pages t-sql

13
推荐指数
2
解决办法
912
查看次数

用户数据库中以#开头的SQL Server表名,不是tempdb,不是临时表

不知何故,几十年前,在我们的数据库中创建了一个以#. 它显示在应用程序数据库下的对象资源管理器中,而不是tempdb. 出于某种原因,Azure 不会像这样导入数据库。

我们不能删除它、重命名它或与之交互。我已经尝试过从对象资源管理器中删除脚本删除、从 GUI 中重命名,但都没有奏效。

我们使用的是 SQL 2008 R2。

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 temporary-tables

13
推荐指数
1
解决办法
924
查看次数

这是 SQL Server 的 ROLLBACK 文档中的错误吗?

是SQL Server 的文档中讲的ROLLBACK语句。在该页面上,它声明其语法如下:

ROLLBACK { TRAN | TRANSACTION }   
     [ transaction_name | @tran_name_variable  
     | savepoint_name | @savepoint_variable ]   
[ ; ]  
Run Code Online (Sandbox Code Playgroud)

显然方括号内的内容是可选的,似乎您应该从TRAN或 中选择一个TRASACTION。但实际上,您可以完全省略两者,并且ROLLBACK是一个完全有效的语句。这是错误还是故意的?

sql-server documentation transaction rollback

13
推荐指数
1
解决办法
1734
查看次数

是否有排序规则按以下顺序 1,2,3,6,10,10A,10B,11 对以下字符串进行排序?

我有一个包含不同长度整数的 VARCHAR 列的数据库。我想对它们进行排序,所以 10 在 9 之后,而不是 1,并且 70A 在 70 之后。我可以使用WHERE 子句中的PATINDEX()、CTE 和 CASE 语句来做到这一点。

但是,我想知道是否有不需要的整理。

sql-server collation sorting natural-sort

12
推荐指数
3
解决办法
2900
查看次数

在 Python 中检索到的 SQL Server VARCHAR 列的编码问题

我们最近遇到了与在 SQL Server 中存储为 varchar(120) 的字段相关的编码问题。在 SSMS 中,varchar 显示为:

“谁杀了琼本?”

但是,当它被带入python时,它显示为:

在此处输入图片说明

我从 Python 方面对此进行了研究,并没有发生什么奇怪的事情。我的理论是 SQL Server 中的 varchar 接受 UTF-8 字符,这些字符在 python 中的显示方式与 SSMS 不同。我对 SQL Server 中的编码不是很熟悉。有人可以让我知道以下内容:

  • 在 SSMS 中有没有办法查看 varchar 的编码?例如,查看 \x82 而不是显示当前来自 SSMS 的逗号?
  • 我们正在使用 SQL Server 2008。有没有办法将任何 UTF-8 字符的编码更改为 ASCII 字符而不使用导入/导出工具或转储到平面文件?即我可以通过查询进行这种转换吗?
  • 有什么方法可以通过查询以编程方式识别有问题的记录(问题被定义为 ASCII 不支持的 UTF-8 字符)?

先感谢您!

使用sp_help N'table_name';我发现这个VARCHAR列的排序规则是:SQL_Latin1_General_CP1_CI_AS

sql-server sql-server-2008-r2 utf-8 encoding python

12
推荐指数
1
解决办法
1万
查看次数

如何从 SQL Server 审计数据中过滤掉标量值用户定义函数的使用情况?

我们有一个 SQL Server 数据库,它有一个数据库审计规范,它审计对数据库的所有执行操作。

CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Run Code Online (Sandbox Code Playgroud)

我们发现,某些查询会将结果集中的每一行的标量函数的使用写入审计日志。当这种情况发生时,日志在我们可以 ETL 到它的最终休息位置之前就被填满了,我们的日志记录出现了空白。

不幸的是,由于合规性原因,我们不能简单地停止审核每条EXECUTE语句。

我们解决这个问题的第一个想法是使用Server AuditWHERE上的子句来过滤掉活动。代码如下所示:

WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
Run Code Online (Sandbox Code Playgroud)

不幸的是,SQL Server 不允许关系 IN 运算符(可能是因为它不想在每次必须写入审核日志时进行查询)。

我们想避免编写一个存储过程,其硬代码object_idWHERE条款,但是这是我们在解决这个问题的最好办法目前的想法。是否有我们应该考虑的替代方法?

我们注意到,当在递归 CTE 中使用标量函数时,它会导致查询为结果集中的每一行写入审计日志。

有一些标量值函数由供应商提供,我们无法删除或移动到备用数据库。

sql-server audit cte functions recursive

12
推荐指数
1
解决办法
929
查看次数