当您被新店聘为 DBA 时,您将使用哪些重要工具来为 50 多个实例建立基线和实施基准?您的建议将不胜感激。
我个人的观点是,sql 开发者不应该使用 C 风格的注释。
C 风格注释的问题是,它们不嵌套。
C 样式注释是支持的救命稻草之一,当它们必须在存储过程中进行一些临时更正时,但只有当它们不必与现有的 C 注释抗争时,才能很好地工作。
看这个问题,似乎其他网站也有随着时间的推移增加列大小的问题。
仅增加表中列的大小是一项相当简单的任务。
但是,当您的商店遵守存储过程参数的长度必须与相应表列的长度相匹配的规则时,通过您的存储过程进行的大量更改就会下降。
锁定在 Oracle 显示,该过程不需要知道 varchar2 参数的长度。
当您将每个 varchar 参数声明为 varchar(max) 或 nvarchar(max) 时,其优缺点是什么?
显然,您可以忘记每次增加色谱柱尺寸时都必须调整程序的维护噩梦。
对 SQLRockStar 的回答: 我想保留一个相当保守的表设计,其中已知长度有限的字段根据当前限制建模,而不为将来可能的扩展保留。
我的许多表都包含一个 id int、一个代码 varchar(30) 和一个描述列 varchar(255)。
代码字段必须反映不同客户的本地命名约定。
一些客户需要将此字段增加到 50。
当我不将长度编码到程序参数中时,我只需要调整这个单一客户的表列。
当我坚持将长度编码到参数中时,那么我要么支持不同客户的不同版本的程序,要么我不得不更改并将更改推出给所有客户。
例子
-- SQL Server
Create Table dbo.SQLServerTable (
id int identity(1,1) primary key not null,
code varchar(30) not null,
description varchar(255) not null
);
go
Create Procedure WrapInsertSQLServer1 (
@code varchar(30),
@description varchar(255)
) as
INSERT INTO SQLServerTable values (@code, @description);
go
Create Procedure WrapInsertSQLServer2 (
@code …Run Code Online (Sandbox Code Playgroud) 我有一个包含大约 50 个表的数据库,共使用了大约 1 GB 的空间。SQLite 数据库将是只读的。此复制将每月进行一次。
编辑:
我看到一种可能的解决方案是通过 SQLite 3 ODBC 驱动程序使用链接服务器,这会产生相当简单的 t-sql 脚本。我不知道它的性能。
我猜其他解决方案需要更多的工作,但获得更好的性能。
下面的代码似乎可以完成这项工作,但我怀疑它是否足够健壮。
SET serveroutput on
DECLARE
v_isclob PLS_INTEGER;
v_cmd VARCHAR2(4000);
BEGIN
SELECT CASE when exists (select * from USER_TAB_COLUMNS where COLUMN_NAME = 'Column_to_modify' AND TABLE_NAME = 'MyTable' AND DATA_TYPE = 'CLOB') then 1 else 0 end into v_isclob FROM DUAL;
IF v_isclob > 0 THEN
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE MyTable RENAME COLUMN Column_to_modify TO XXX';
EXECUTE IMMEDIATE 'ALTER TABLE MyTable ADD Column_to_modify varchar2(4000)';
EXECUTE IMMEDIATE 'UPDATE MyTable SET Column_to_modify = SUBSTR(XXX, 1, 4000)';
EXECUTE IMMEDIATE 'ALTER TABLE MyTable DROP COLUMN …Run Code Online (Sandbox Code Playgroud) 我不认为“只是为了确保脚本不需要 sqlcmd-mode”是一个正当理由。
在向我的同事发出启用此设置的命令之前需要考虑什么?
在 SQL Server 上,不可为空的 varchar 列可以包含空字符串。
在 ORACLE 下它们不能,因为 varchar2 将 '' 视为等同于 NULL。
如果您设计的数据库架构适用于两个 RDBMS,那么向 SQL Server 上的每个不可为 null 的 varchar 列添加一个不允许空字符串的约束似乎是个好主意。
但哪种方法是制定这种约束的最佳方式?
我开始了
if OBJECT_ID('varchar_without_empty_cols') > 0 drop table varchar_without_empty_cols
go
create table varchar_without_empty_cols (
id int ,
val varchar(10) not null CHECK (val <> '')
)
go
insert into varchar_without_empty_cols values (1, ' ') -- this ought be OK
go
insert into varchar_without_empty_cols values (2, '') -- this has to violate the check
go
insert into varchar_without_empty_cols …Run Code Online (Sandbox Code Playgroud) 我想在将更长的 varchar 分配给变量并且没有静默截断时出现错误。有什么设置吗?
这将无声地截断:
declare @code varchar(10)
set @code = 'This is too long'
select @code
Run Code Online (Sandbox Code Playgroud)
将 varchar 插入较小的 Table 列
create table test (col1 varchar(10));
insert into test values ('This is too long');
Run Code Online (Sandbox Code Playgroud)
产生错误:
Meldung 8152, Ebene 16, Status 14, Zeile 2
String or binary data would be truncated.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud) 在我的 oracle 数据库中,如果有下表:
Create table Test_call_count (
count number(10)
);
insert into Test_call_count values (0);
Run Code Online (Sandbox Code Playgroud)
现在我可以运行以下 PowerShell 脚本
if ($ora_loaded -eq $null)
{
$ora_loaded = [System.Reflection.Assembly]::LoadWithPartialName("Oracle.DataAccess")
}
$ConnectionString = "Data Source=YOUR_TNS;User ID=YOUR_ID;Password=YOUR_Password"
function Execute-NonQuery
{
param (
$sql
)
$conn = new-object Oracle.DataAccess.Client.OracleConnection
$conn.ConnectionString = $ConnectionString
$cmd = new-object Oracle.DataAccess.Client.OracleCommand($sql,$conn)
$conn.open()
$cmd.ExecuteNonQuery()
$conn.close()
}
Execute-NonQuery "begin update Test_call_count set count = count + 1;DBMS_OUTPUT.PUT_LINE('Test...'); end;"
Run Code Online (Sandbox Code Playgroud)
查看我可以验证的数据库,每次调用都会增加计数。
但是有没有办法扩展它,以便我可以将数据发送到 DBMS_OUTPUT ?
我知道以下两种模式来编写创建存储过程的脚本,可以重复执行而不抛出错误。
if object_id('my_proc') > 0 drop procedure my_proc
go
create procedure dbo.my_proc as Print 'This is not a dummy';
Run Code Online (Sandbox Code Playgroud)
另一个保留权限
if object_id('my_proc') is null
EXEC ('create procedure dbo.my_proc as Print ''This is a dummy''');
go
ALTER PROCEDURE dbo.my_proc as Print 'This is not a dummy';
Run Code Online (Sandbox Code Playgroud)
我猜当该过程存在并且其哈希码与新版本的哈希码相同时,就不需要删除并重新创建或更改该过程。
我的问题是HashBytes被限制为最多 8000 个字节,我不能像这样使用它
if object_id('my_proc') is null
EXEC ('create procedure dbo.my_proc as Print ''This is a dummy''');
go
if object_Id('my_proc') > 0
and
(
Select HashBytes('MD5',definition) MD5
from sys.sql_modules m
join sysobjects …Run Code Online (Sandbox Code Playgroud)