我正在尝试编写一个命令来删除命名空间中的所有函数。我已经找到了一个可以生成删除函数脚本的命令:
SELECT 'DROP FUNCTION ' || ns.nspname || '.' || proname || '('
|| oidvectortypes(proargtypes) || ');'
FROM pg_proc INNER JOIN pg_namespace ns ON (pg_proc.pronamespace = ns.oid)
WHERE ns.nspname = 'public' order by proname;
Run Code Online (Sandbox Code Playgroud)
资料来源:http ://www.postgresonline.com/journal/archives/74-How-to-delete-many-functions.html
这将生成类似以下内容的内容:
?column?
------------------------------------------
DROP FUNCTION public.function1(bigint);
DROP FUNCTION public.function2();
DROP FUNCTION public.function3(text);
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何更改代码,以便实际上删除函数 - 而不是仅生成命令。
有任何想法吗?
我创建了一个数据库触发器来将行数据存储在审计表中。在更新操作期间,此触发器从主表中获取数据并将其插入到历史表中。(历史表有列:日期,操作类型说更新/删除,实际行数据)但是由于输入数据中的引用文本,触发器在某些情况下会失败。
如何在触发器中转义引用的文本?
--My trigger
CREATE OR REPLACE FUNCTION audit.if_modified() RETURNS TRIGGER AS $function$
DECLARE
temp_row RECORD; -- a temporary variable used on updates/deletes
v_sql text;
BEGIN
IF TG_WHEN <> 'AFTER' THEN
RAISE EXCEPTION 'audit.if_modified() may only run as an AFTER trigger';
END IF;
v_sql = 'select * from ' || TG_TABLE_NAME::regclass || '_history';
execute v_sql into temp_row;
select now() into temp_row.action_tstamp_tx;
temp_row.action = SUBSTRING(TG_OP,1,1);
IF (TG_OP = 'UPDATE' AND TG_LEVEL = 'ROW') THEN
temp_row.row_data = OLD;
ELSIF (TG_OP = 'DELETE' …Run Code Online (Sandbox Code Playgroud) 我有一个表数据库,我想迭代 3 个不同模式中的每个表,一次一个模式。
我想我需要一些类似的东西:
DECLARE @tableName varchar(50)
DECLARE @schemaName varchar(50)
Run Code Online (Sandbox Code Playgroud)
现在我们将模式称为“A”、“B”和“C”。
我可以使用以下命令从每个模式中获取表的列表:
SELECT t.name
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE s.name = N'schema_name';
Run Code Online (Sandbox Code Playgroud)
但我不确定如何迭代该列表(id喜欢将值一一插入到每个表中,并且它们依赖于表列的数据类型,所以我不能只对所有语句进行一揽子插入)。
我想创建一个包含变量的脚本,_user并且仅当此类登录尚不存在时才_pass在 Postgres 数据库中创建用户。我以为这会起作用,但我不知道问题是什么:
DO
$DO$
DECLARE
_user TEXT := 'myuser';
_pass TEXT := 'user!pass';
BEGIN
IF NOT EXISTS ( SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = _user) THEN
RAISE NOTICE 'Creating user % ...',_user;
CREATE USER _user WITH
LOGIN
NOSUPERUSER
CREATEDB
CREATEROLE
NOREPLICATION
PASSWORD _pass;
RAISE NOTICE 'Created user %',_user;
ELSE
RAISE NOTICE 'User % already exists, not creating it',_user;
END IF;
END
$DO$
Run Code Online (Sandbox Code Playgroud)
如何强制用变量的内容替换变量?
$DO$还有和之间有什么区别$$?
我在 Oracle SQL DB 中有一个表,其中的列的标题如“PERCENT_”以及其他名称。我想选择所有带有“PERCENT_”前缀的列。
我已经找到了一些问题来回答诸如如何查找数据库中具有与某些模式匹配的列的所有表之类的问题......但似乎没有一个问题可以回答这个特定问题。
这可以做到吗?我能够返回与“all_tab_columns”匹配的所有列名称的列表
select column_name from all_tab_columns where column_name like 'PERCENT_%' from <table_name>
Run Code Online (Sandbox Code Playgroud)
但我可以做这样的事情来从我想要的表中选择那些列吗?
with desired_cols as (select column_name from all_tab_columns where column_name like 'PERCENT_%' from <table_name>)
select desired_cols from <table_name>
Run Code Online (Sandbox Code Playgroud) 我目前有一个链接服务器,我在存储过程中查询.我现在的查询工作得很好但是这个查询需要为我拥有的每个代码分支进行更改.我想知道什么是最好的方法来驱动我在跨服务器查询中调用的数据库名称.
例如:服务器A有一个到服务器B的链接.服务器A包含3个数据库.SRV_A.DB1_DEV,SRV_A.DB2_Trunk,SRV_A.DB3_Prod每个都链接到它们的服务器B对应... SRV_B.DB1_DEV,SRV_B.DB2_Trunk,SRV_B.DB3_Prod
服务器A上的每个数据库都具有相同的存储过程.在sproc中唯一改变的是跨服务器选择.所以SRV_A.DB1_Dev在sproc中有一个select:
SELECT foo FROM [SRV_B].[DB1_DEV].[foo_table] WHERE bar = 1
Run Code Online (Sandbox Code Playgroud)
而主干分支上的存储过程将是
SELECT foo FROM [SRV_B].[DB2_Trunk].[foo_table] WHERE bar = 1
Run Code Online (Sandbox Code Playgroud)
由于我希望有一个VS项目将数据库部署到所提到的每个分支,我希望能够动态填写数据库名称.我提出的解决方案是使用CHARINDEX函数进行一系列IF检查,然后使用动态SQL创建查询,如下所示:
DECLARE @dSql NVARCHAR(4000);
DECLARE @databaseName NVARCHAR(100) = DB_NAME();
DECLARE @tableName NVARCHAR(100);
IF SELECT CHARINDEX('Dev', @databaseName, 0)
SET @tableName = '[SRV_B].[DB1_DEV].[foo_table]
...Same if & set for Trunk
...Same if & set for Prod
SET @dSql = 'DECLARE @retID INT;SELECT foo FROM ' + @tableName
+ ' WHERE bar = 1';SET @retID = SELECT SCOPE_IDENTITY()'
EXEC(@dSQL);
Run Code Online (Sandbox Code Playgroud)
我不得不想象有一个更好的解决方案,如果有人可以帮助我,我会非常感激.如果通过一些外线拍摄这是最好的方式让我知道.
谢谢,詹姆斯
如何使用查询从PostgreSQL中删除所有用户定义的视图?就像我们可以使用查询删除所有函数:
SELECT 'DROP FUNCTION ' || ns.nspname || '.' || proname
|| '(' || oidvectortypes(proargtypes) || ');'
FROM pg_proc INNER JOIN pg_namespace ns ON (pg_proc.pronamespace = ns.oid)
WHERE ns.nspname = 'my_messed_up_schema' order by proname;
Run Code Online (Sandbox Code Playgroud) 我想在我的程序中进行动态查询.SQL Server有针对此类任务的简洁sp_executesql过程,MySQL中有什么可以帮助我实现类似的功能吗?
我有这个存储过程接受comlumn名称作为inptu参数.SELECT语句将根据输入参数选择一列
create procedure getColumn (@whichColumn varchar)
as
begin
declare @sql nvarchar(max)
set @sql = 'SELECT [' + @whichColumn + ']'
+ ' FROM myTable'
+ ' where ['+ @whichColumn + '] is not null'
+ ' and [' + @whichColumn + '] != '''' ' ;
exec sp_executesql @sql
end
Run Code Online (Sandbox Code Playgroud)
当我执行这个存储过程时,
exec getColumn 'Apple';
Run Code Online (Sandbox Code Playgroud)
错误显示"无效的列名称'A'".我不明白为什么它只获得输入的第一个字符
按照此链接中提到的方法,我想ORDER BY动态地传递和排序函数。
ORDER BY工作正常,但我无法通过排序顺序(ASC/ DESC)。
我现在所拥有的:
CREATE OR REPLACE FUNCTION list(_limit integer,_offset integer,sort_by varchar(100), _order varchar(100),_category varchar(100))
RETURNS TABLE(
id INTEGER,
name VARCHAR,
clientname VARCHAR,
totalcount BIGINT
) AS $$
DECLARE empty text := '';
BEGIN
RETURN Query EXECUTE
'SELECT d.id,
d.name,
d.clientname,
count(*) OVER() AS full_count FROM design_list as d
where ($5 = $6 Or d.category Ilike $5)
ORDER BY ' || quote_ident(sort_by) || ' LIMIT $1 offset $2'
USING _limit,_offset,sort_by, …Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
sql ×6
postgresql ×5
plpgsql ×4
sql-server ×3
t-sql ×2
loops ×1
mysql ×1
oracle ×1
oracle12c ×1
sql-drop ×1
sql-order-by ×1
triggers ×1
view ×1