小编Mat*_*att的帖子

DACPAC 和数据库漂移:即使没有任何变化,数据库用户也始终被检测为漂移

当我在 SSDT 数据库项目中包含登录名和用户并尝试使用“数据库偏离注册版本时阻止发布”选项部署 DACPAC 时,即使没有任何更改,它也始终会检测到数据库用户的漂移。

例如,我将项目发布到以前不存在数据库的新服务器上,并且一切正常。正确创建了登录名和用户等。然后我立即将同一个项目发布到同一个服务器上,部署被阻止,因为 db 用户已经漂移。但是我没有对 SQL 实例进行任何更改,甚至没有更新项目。

如果我从 SSDT 项目中删除登录名和用户,那么一切都会按预期进行,即我不会从漂移检测中得到误报,并且我可以更新和部署其他类型的对象而不会出错。

这是登录和用户的脚本:

CREATE LOGIN AppAcct WITH PASSWORD = 'Password1';
GO

CREATE USER AppAcct FOR LOGIN AppAcct
    WITH DEFAULT_SCHEMA = dbo;
GO

GRANT CONNECT TO AppAcct;
GO
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的发布配置文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <IncludeCompositeObjects>True</IncludeCompositeObjects>
    <TargetDatabaseName>DacpacDrift</TargetDatabaseName>
    <DeployScriptFileName>DacpacDrift.sql</DeployScriptFileName>
    <TargetConnectionString>Data Source=.\dev14;Integrated Security=True;Pooling=False</TargetConnectionString>
    <BlockWhenDriftDetected>True</BlockWhenDriftDetected>
    <RegisterDataTierApplication>True</RegisterDataTierApplication>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <ScriptDatabaseOptions>True</ScriptDatabaseOptions>
    <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
    <DropObjectsNotInSource>True</DropObjectsNotInSource>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这就是漂移报告的样子:

<?xml version="1.0" encoding="utf-8"?>
<DriftReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DriftReport/2012/02">
  <Additions />
  <Removals />
  <Modifications>
    <Object Name="[AppAcct]" Parent="" Type="SqlUser" />
  </Modifications>
</DriftReport> …
Run Code Online (Sandbox Code Playgroud)

sql-server deployment data-tier-application

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

在多台服务器上共享服务帐户有哪些风险(如果有)?

我将域帐户用于 SQL Server 服务帐户。有时,当我有多个在逻辑上或主题上相关的服务器时,我会为所有服务器上的服务帐户使用相同的域帐户集。每个服务器上的用户帐户权限可能不同,但通常有很多重叠。

我的问题的要点是:有权访问一个实例而不是另一个实例的用户可以利用共享服务帐户来访问另一台服务器吗?

这是我试图解决的具体情况:

  • 我有两台带有默认 SQL 实例的服务器,分别称为 org-sql-1 和 org-sql-2。
  • 我为每个服务使用一个域帐户,所以我有 mydomain\orgDBService、mydomain\orgAgentService 等(虽然我不确定这是否严格相关——我想如果我使用单个帐户所有服务)。
  • 但是我在两台服务器上重复使用这些域帐户,因此 org-sql-1 和 org-sql-2 上的数据库服务都在 mydomain\orgDBService 下运行,例如。

迄今为止,我从未特别质疑安全隐患,因为这些服务器具有共同的用途和用户群,即使特定的用户权限可能不同。

现在,我们要添加第三个实例,我们称之为 org-sql-rpt。这个主题与其他主题非常契合,但有一个关键区别:我们将允许外部合作伙伴(即不是我们组织的员工)访问此服务器,如下所示:

  • 他们的凭据将拥有(属于 db_owner)几个数据库。
  • 但它们不属于任何服务器角色(当然,公共角色除外)。
  • 在启用此服务器之前,他们可能在有限的时间内拥有对操作系统桌面的管理员访问权限。
  • 他们不会知道服务帐户的密码。

鉴于此,我是否应该担心将域帐户重用作此新实例的服务帐户?此人是否有任何风险可以使用他们在 org-sql-rpt 上的合法凭据来访问 org-sql-1 或 org-sql-2?(即可以通过使用不同的服务帐户凭据来减轻任何风险?)

还是出于其他原因,这只是一个普遍的坏主意?

编辑

新实例将托管数据库、集成和报告服务(至少目前是这样)。没有分析服务。

外部用户将拥有提升的数据库权限,但没有明确的实例权限。例如,他们将无法创建登录名、作业或报告。

security sql-server sql-server-2008-r2

6
推荐指数
2
解决办法
6953
查看次数

为什么我会收到有关 NULL 值和聚合函数的 ANSI 警告?

这是确切的警告消息:

Warning: Null value is eliminated by an aggregate or other SET operation.

我理解这通常意味着什么,即在应用了聚合函数的列的一行或多行中有一个空值,但我无法弄清楚为什么我的特定查询会发生这种情况或如何重写它这样我就不会收到警告。

这是查询。该表跟踪单元对事件的响应,查询的目的是找到最后一个到达的单元,该单元是第一批收到事件通知的单元。通知时间可能会有所不同,并非所有单位都会到达。

SELECT inci_no
    ,unit
    ,notif_dttm
    ,arv_dttm
    ,resp_code
    ,alm_date
FROM (
    SELECT inci_no
        ,alm_date
        ,unit
        ,notif_dttm
        ,arv_dttm
        ,resp_code
        ,row_num = row_number() OVER (PARTITION BY inci_no ORDER BY arv_dttm DESC, unit_id ASC)
    FROM inc_unit AS u
    WHERE resp_code = 'E'
        AND arv_dttm IS NOT NULL
        AND notif_dttm <= (
            SELECT min(notif_dttm)
            FROM inc_unit AS notif
            WHERE notif.inci_no = u.inci_no
                --AND notif.arv_dttm IS NOT NULL
            GROUP BY notif.inci_no
            ) …
Run Code Online (Sandbox Code Playgroud)

sql-server aggregate sql-server-2008-r2

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