小编Sae*_*ati的帖子

相当于 MySQL 中的 SQL Server 模式吗?

我有一个正在迁移到 MySQL 的模块化系统。

在 SQL Server 中,存在将表和数据库对象分组在一起的架构概念。例如,所有与用户相关的表都可以放入auth模式中,所有博客表可以放入博客模式中。这意味着我们可以在对象资源管理器中看到这些表名称:

  • 授权用户
  • 授权角色
  • auth.UserRoles
  • 授权令牌
  • 博客.帖子
  • 博客.评论
  • 博客作者

这是一种将事物放在一起并对它们进行排序的巧妙方法,这对于理解数据库和模块化结构非常有帮助,并有助于降低维护成本。

我知道MySQL不支持这个功能。

我还知道我们可以为表名称添加前缀来模仿这种行为。但我想知道这是否是最好的方法?

是否有一种我不知道的已知方法可以实现这一目标?我对 MySQL 还很陌生。

mysql schema sql-server migration

4
推荐指数
1
解决办法
1253
查看次数

有没有办法确定给定查询可能应用于 SQL 对象的锁?

考虑一个简单的查询,就像一条select语句一样简单:

select * from Teachers where Name like N'%John%'
Run Code Online (Sandbox Code Playgroud)

一旦我开始这个查询,它就完成了。因此,我没有机会看到sp_who2这个查询对数据库对象应用了什么类型的锁。

我可以用事务语句来扩充这个查询:

begin transaction

select * from Teachers where Name like N'%John%'

-- Here, I won't commit transaction, thus holding the lock
Run Code Online (Sandbox Code Playgroud)

但坦率地说,这似乎不是自然锁定检测的正确方法,因为我已经使用事务语句操纵了默认行为。

我们是否有一个工具,比如Display Estimated Execution Plan向我们展示有关锁定给定查询的一些信息?如果不是,我们如何找出给定查询可以在数据库上应用哪种类型的锁,因为它们执行得太快而无法检测到。

sql-server locking

3
推荐指数
1
解决办法
597
查看次数

PERCENT_RANK 的分布不超过 100

我正在尝试以 0-100 的比例找出查询的每个给定记录的位置。我这样使用PERCENT_RANK排名功能:

select Term, Frequency, percent_rank() over (order by Frequency desc) * 100
from Words
Run Code Online (Sandbox Code Playgroud)

但是当我查看结果时,我看到的不是从 0 开始到 100 的列,而是从 0 开始到 37.xxxx 的列。

虽然BOL没有明确提到结果分布在 0-100 的范围内,但我对这个词的理解percent让我使用了这个排名函数。

我在这里想念什么?

sql-server t-sql rank

3
推荐指数
1
解决办法
1482
查看次数

每个数据子集的 SQL Server 唯一索引,基于另一列的值

假设我有一张Customers桌子和一张Emails桌子。Emails表有这些字段:

Id   
CustomerId   
EmailValue   
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个约束,以便每个客户都不应该注册重复的电子邮件。我能想到的方法有:

  1. 创建一个函数以确保每个新电子邮件值的唯一性,并在检查约束中调用该函数
  2. 创建触发器,并在每次插入或更新时确保每个客户的电子邮件不重复
  3. 完全忘记数据库,将这部分业务放在我的应用程序层

但是,我最近熟悉了 SQL Server 的筛选索引。尽管我不知道它在这种特定情况下是否可以帮助我。我见过的大多数示例都是过滤掉NULL值,以便为可空列创建唯一索引。

有没有办法可以使用过滤索引来实现我想要的?

sql-server filtered-index unique-constraint

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

如何在大量数据库中删除过程 (SQL Server 2016)

我有一个简单的过程,存在于 150 多个数据库中。我可以将它们一一删除,这是软件开发界最愚蠢的工作。或者我可以以某种方式在一个查询中动态删除它们,这很聪明但不起作用。

我试过了:

execute sp_msforeachdb 'drop procedure Usages'
Run Code Online (Sandbox Code Playgroud)

我有:

无法删除过程“用法”,因为它不存在或您没有权限。

所以我想也许我为它创建了一个游标。于是我写道:

declare @command nvarchar(max) = '
drop procedure Usages
';
declare @databaseName nvarchar(100)
declare databasesCursor cursor for select [name] from sys.databases where database_id > 5
open databasesCursor
fetch next from databasesCursor into @databaseName
while @@fetch_status = 0
begin
    print @databaseName
    execute sp_executesql @command
    fetch next from databasesCursor into @databaseName
end
close databasesCursor
deallocate databasesCursor
Run Code Online (Sandbox Code Playgroud)

再次,我收到了同样的消息。我想,也许它不会改变数据库的上下文,因此我在删除命令前面加上了给定数据库的名称,所以命令会变得类似于drop procedure [SomeDatabase].dbo.Usages,但后来我收到了:

“DROP PROCEDURE”不允许将数据库名称指定为对象名称的前缀。

所以,我想出动态执行,use @databaseName以便我可以在该数据库的上下文中删除过程。但它不起作用。我该怎么办?我被困在聪明的方法上,而且我现在比愚蠢的方法花费的时间更多。

sql-server stored-procedures cursors sql-server-2016

0
推荐指数
1
解决办法
350
查看次数

为什么 SQL Server docker 映像始终使用高 CPU,以及如何修复它?

使用它docker-compose.yml我创建了一个容器:

version: "3.9"
services:
    database:
        image: mcr.microsoft.com/mssql/server
        user: root
        restart: always
        container_name: ContainerNameHere
        volumes:
            - /Organization/Databases:/var/opt/mssql/data
        environment:
            - ACCEPT_EULA=Y
            - SA_PASSWORD=password_here
            - MSSQL_PID=Express
        ports:
            - 1433:1433
        logging:
            driver: none
        networks:
            - NetworkNameHere
networks:
    NetworkNameHere:
        name: NetworkNameHere
        driver: bridge
Run Code Online (Sandbox Code Playgroud)

它的用户数据库为零。它只是一个简单的空 SQL Server docker 容器,没有数据库,也没有数据。

但这是我的top命令的结果:

顶部命令结果

正如你所看到的,它完全摧毁了我的 VPS。

这太令人沮丧了,微软团队还没有回复我

为什么 SQL Server 的 docker 容器会这样,我应该如何解决这个问题?


我有 10 GB 可用空间:

df -h /

已用文件系统大小 Avail Use% 安装在
/dev/sda1 20G 8.9G 10G 47% /

我的 SQL …

sql-server linux debian docker containers

-1
推荐指数
1
解决办法
1440
查看次数